From e9ccc56e87a8f67dcc63ce4aa24c8bd16a561e7f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 6 Aug 2019 23:40:36 -1100 Subject: [PATCH] Zawy18 --- src/pow.cpp | 50 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/src/pow.cpp b/src/pow.cpp index c19b2514f..de1a7904b 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -99,8 +99,7 @@ arith_uint256 RT_CST_RST(int32_t height,uint32_t nTime,arith_uint256 bnTarget,ui { //if (ts.size() < 2*W || ct.size() < 2*W ) { exit; } // error. a vector was too small //if (ts.size() < past+W || ct.size() < past+W ) { past = min(ct.size(), ts.size()) - W; } // past was too small, adjust - int64_t altK; - int32_t i,j,ii=0; // K is a scaling factor for integer divisions + int64_t altK; int32_t i,j,ii=0; // K is a scaling factor for integer divisions if ( height < 64 ) return(bnTarget); if ( ts[0]-ts[W] < T*numerator/denominator ) @@ -108,10 +107,12 @@ arith_uint256 RT_CST_RST(int32_t height,uint32_t nTime,arith_uint256 bnTarget,ui //bnTarget = ((ct[0]-ct[1])/K) * max(K,(K*(nTime-ts[0])*(ts[0]-ts[W])*denominator/numerator)/T/T); bnTarget = (ct[0] - ct[1]) / arith_uint256(K); altK = (K * (nTime-ts[0]) * (ts[0]-ts[W]) * denominator / numerator) / (T * T); + fprintf(stderr,"ht.%d initial altK.%lld %d * %d * %d / %d\n",height,(long long)altK,(nTime-ts[0]),(ts[0]-ts[W]),denominator,numerator); if ( altK > K ) altK = K; - else fprintf(stderr,"ht.%d initial altK.%lld %d * %d * %d / %d\n",height,(long long)altK,(nTime-ts[0]),(ts[0]-ts[W]),denominator,numerator); bnTarget *= arith_uint256(altK); + if ( altK < K ) + return(bnTarget); } /* Check past 24 blocks for any sum of 3 STs < T/2 triggers. This is messy because the blockchain does not allow us to store a variable to know @@ -121,17 +122,17 @@ arith_uint256 RT_CST_RST(int32_t height,uint32_t nTime,arith_uint256 bnTarget,ui any time since most recent trigger and we are at current block, aggressively adust prevTarget. */ - for (j=past-1; j>=1; j--) + for (j=past-1; j>=2; j--) { if ( ts[j]-ts[j+W] < T*numerator/denominator ) { ii = 0; - for (i=j-1; i>=0; i-- ) + for (i=j-2; i>=0; i-- ) { ii++; // Check if emission caught up. If yes, "trigger stopped at i". // Break loop to try more recent j's to see if trigger activates again. - if ( ts[i]-ts[j+W] > (ii+W)*T ) + if ( (ts[i] - ts[j+W]) > (ii+W)*T ) break; // We're here, so there was a TS[j]-TS[j-3] < T/2 trigger in the past and emission rate has not yet slowed up to be back on track so the "trigger is still active", aggressively adjusting target here at block "i" @@ -184,7 +185,7 @@ arith_uint256 zawy_exponential(arith_uint256 bnTarget,int32_t mult) return(bnTarget); } -// 13:04 launch for ZAWY17 +// 17:03 6x at ht.255 launch for ZAWY17 unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params) { @@ -217,11 +218,11 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead // Find the first block in the averaging interval const CBlockIndex* pindexFirst = pindexLast; - arith_uint256 ct[64],ct0[64],bnTmp,bnPrev,bnTarget,bnTarget6,bnTarget12,bnTot {0}; - uint32_t nbits,blocktime,ts[sizeof(ct)/sizeof(*ct)]; int32_t i,diff,height=0,mult = 0,tipdiff = 0; + arith_uint256 ct[64],bnTmp,bnPrev,bnTarget,bnTarget6,bnTarget12,bnTot {0}; + uint32_t nbits,blocktime,ts[sizeof(ct)/sizeof(*ct)]; int32_t zflags[sizeof(ct)/sizeof(*ct)],i,diff,height=0,mult = 0,tipdiff = 0; memset(ts,0,sizeof(ts)); memset(ct,0,sizeof(ct)); - memset(ct0,0,sizeof(ct0)); + memset(zflags,0,sizeof(zflags)); if ( pindexLast != 0 ) height = (int32_t)pindexLast->GetHeight() + 1; if ( ASSETCHAINS_ADAPTIVEPOW > 0 && pindexFirst != 0 && pblock != 0 && height >= (int32_t)(sizeof(ct)/sizeof(*ct)) ) @@ -231,14 +232,26 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead bnPrev.SetCompact(pindexFirst->nBits); for (i=0; pindexFirst != 0 && i<(int32_t)(sizeof(ct)/sizeof(*ct)); i++) { - if ( (pindexFirst->nBits&3) != 0 ) + zflags[i] = (pindexFirst->nBits & 3); + /*if ( (pindexFirst->nBits&3) != 0 ) { ct[i] = UintToArith256(pindexFirst->GetBlockHash()); ct[i] /= arith_uint256((pindexFirst->nBits&3) + 1); - } else ct[i].SetCompact(pindexFirst->nBits); + } else*/ + ct[i].SetCompact(pindexFirst->nBits); ts[i] = pindexFirst->nTime; pindexFirst = pindexFirst->pprev; } + for (i=0; pindexFirst != 0 && i<(int32_t)(sizeof(ct)/sizeof(*ct))-1; i++) + { + if ( zflags[i] != 0 ) + { + ct[i] /= arith_uint256(K); + ct[i] *= arith_uint256((int64_t)(ts[i] - ts[i+1]) * (ts[i] - ts[i+1]) * 1000); + ct[i] /= arith_uint256(T * T * 784); + ct[i] *= arith_uint256(K); + } + } } pindexFirst = pindexLast; for (i = 0; pindexFirst && i < params.nPowAveragingWindow; i++) @@ -249,7 +262,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead blocktime = pindexFirst->nTime; diff = (pblock->nTime - blocktime); //fprintf(stderr,"%d ",diff); - if ( 0 && i < 12 ) + if ( i < 3 ) { diff -= (8+i)*ASSETCHAINS_BLOCKTIME; if ( diff > mult ) @@ -258,7 +271,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead mult = diff; } } - if ( pindexFirst->GetHeight() >= (int32_t)(sizeof(ct)/sizeof(*ct)) && (pindexFirst->nBits&3) != 0 ) + if ( zflags[i] != 0 ) bnTmp = ct[i]; } bnTot += bnTmp; @@ -287,10 +300,10 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead if ( bnTarget6 < bnTarget12 ) bnTmp = bnTarget6; else bnTmp = bnTarget12; - if ( 0 && bnTmp < bnTarget ) + if ( bnTmp < bnTarget ) bnTarget = bnTmp; } - if ( bnTarget < origtarget ) + /*if ( bnTarget < origtarget ) { if ( tipdiff < T ) zawyflag = 1; @@ -303,7 +316,10 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[z]); } fprintf(stderr," ht.%d -> zawy.%d tipdiff.%d\n",height,zawyflag,tipdiff); - } else bnTarget = origtarget; + } else bnTarget = origtarget;*/ + if ( bnTarget > origtarget ) + bnTarget = origtarget; + else zawyflag = 1; } if ( mult > 1 ) // e^mult case, jl777: test of mult > 1 failed when it was int64_t??? {