Zawy18
This commit is contained in:
50
src/pow.cpp
50
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() < 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
|
//if (ts.size() < past+W || ct.size() < past+W ) { past = min(ct.size(), ts.size()) - W; } // past was too small, adjust
|
||||||
int64_t altK;
|
int64_t altK; int32_t i,j,ii=0; // K is a scaling factor for integer divisions
|
||||||
int32_t i,j,ii=0; // K is a scaling factor for integer divisions
|
|
||||||
if ( height < 64 )
|
if ( height < 64 )
|
||||||
return(bnTarget);
|
return(bnTarget);
|
||||||
if ( ts[0]-ts[W] < T*numerator/denominator )
|
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])/K) * max(K,(K*(nTime-ts[0])*(ts[0]-ts[W])*denominator/numerator)/T/T);
|
||||||
bnTarget = (ct[0] - ct[1]) / arith_uint256(K);
|
bnTarget = (ct[0] - ct[1]) / arith_uint256(K);
|
||||||
altK = (K * (nTime-ts[0]) * (ts[0]-ts[W]) * denominator / numerator) / (T * T);
|
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 )
|
if ( altK > K )
|
||||||
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);
|
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
|
/* 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
|
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
|
any time since most recent trigger and we are at current block, aggressively
|
||||||
adust prevTarget. */
|
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 )
|
if ( ts[j]-ts[j+W] < T*numerator/denominator )
|
||||||
{
|
{
|
||||||
ii = 0;
|
ii = 0;
|
||||||
for (i=j-1; i>=0; i-- )
|
for (i=j-2; i>=0; i-- )
|
||||||
{
|
{
|
||||||
ii++;
|
ii++;
|
||||||
// Check if emission caught up. If yes, "trigger stopped at i".
|
// 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.
|
// 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;
|
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"
|
// 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);
|
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)
|
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
|
// Find the first block in the averaging interval
|
||||||
const CBlockIndex* pindexFirst = pindexLast;
|
const CBlockIndex* pindexFirst = pindexLast;
|
||||||
arith_uint256 ct[64],ct0[64],bnTmp,bnPrev,bnTarget,bnTarget6,bnTarget12,bnTot {0};
|
arith_uint256 ct[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;
|
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(ts,0,sizeof(ts));
|
||||||
memset(ct,0,sizeof(ct));
|
memset(ct,0,sizeof(ct));
|
||||||
memset(ct0,0,sizeof(ct0));
|
memset(zflags,0,sizeof(zflags));
|
||||||
if ( pindexLast != 0 )
|
if ( pindexLast != 0 )
|
||||||
height = (int32_t)pindexLast->GetHeight() + 1;
|
height = (int32_t)pindexLast->GetHeight() + 1;
|
||||||
if ( ASSETCHAINS_ADAPTIVEPOW > 0 && pindexFirst != 0 && pblock != 0 && height >= (int32_t)(sizeof(ct)/sizeof(*ct)) )
|
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);
|
bnPrev.SetCompact(pindexFirst->nBits);
|
||||||
for (i=0; pindexFirst != 0 && i<(int32_t)(sizeof(ct)/sizeof(*ct)); i++)
|
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] = UintToArith256(pindexFirst->GetBlockHash());
|
||||||
ct[i] /= arith_uint256((pindexFirst->nBits&3) + 1);
|
ct[i] /= arith_uint256((pindexFirst->nBits&3) + 1);
|
||||||
} else ct[i].SetCompact(pindexFirst->nBits);
|
} else*/
|
||||||
|
ct[i].SetCompact(pindexFirst->nBits);
|
||||||
ts[i] = pindexFirst->nTime;
|
ts[i] = pindexFirst->nTime;
|
||||||
pindexFirst = pindexFirst->pprev;
|
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;
|
pindexFirst = pindexLast;
|
||||||
for (i = 0; pindexFirst && i < params.nPowAveragingWindow; i++)
|
for (i = 0; pindexFirst && i < params.nPowAveragingWindow; i++)
|
||||||
@@ -249,7 +262,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead
|
|||||||
blocktime = pindexFirst->nTime;
|
blocktime = pindexFirst->nTime;
|
||||||
diff = (pblock->nTime - blocktime);
|
diff = (pblock->nTime - blocktime);
|
||||||
//fprintf(stderr,"%d ",diff);
|
//fprintf(stderr,"%d ",diff);
|
||||||
if ( 0 && i < 12 )
|
if ( i < 3 )
|
||||||
{
|
{
|
||||||
diff -= (8+i)*ASSETCHAINS_BLOCKTIME;
|
diff -= (8+i)*ASSETCHAINS_BLOCKTIME;
|
||||||
if ( diff > mult )
|
if ( diff > mult )
|
||||||
@@ -258,7 +271,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead
|
|||||||
mult = diff;
|
mult = diff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( pindexFirst->GetHeight() >= (int32_t)(sizeof(ct)/sizeof(*ct)) && (pindexFirst->nBits&3) != 0 )
|
if ( zflags[i] != 0 )
|
||||||
bnTmp = ct[i];
|
bnTmp = ct[i];
|
||||||
}
|
}
|
||||||
bnTot += bnTmp;
|
bnTot += bnTmp;
|
||||||
@@ -287,10 +300,10 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead
|
|||||||
if ( bnTarget6 < bnTarget12 )
|
if ( bnTarget6 < bnTarget12 )
|
||||||
bnTmp = bnTarget6;
|
bnTmp = bnTarget6;
|
||||||
else bnTmp = bnTarget12;
|
else bnTmp = bnTarget12;
|
||||||
if ( 0 && bnTmp < bnTarget )
|
if ( bnTmp < bnTarget )
|
||||||
bnTarget = bnTmp;
|
bnTarget = bnTmp;
|
||||||
}
|
}
|
||||||
if ( bnTarget < origtarget )
|
/*if ( bnTarget < origtarget )
|
||||||
{
|
{
|
||||||
if ( tipdiff < T )
|
if ( tipdiff < T )
|
||||||
zawyflag = 1;
|
zawyflag = 1;
|
||||||
@@ -303,7 +316,10 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead
|
|||||||
fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[z]);
|
fprintf(stderr,"%02x",((uint8_t *)&bnTarget)[z]);
|
||||||
}
|
}
|
||||||
fprintf(stderr," ht.%d -> zawy.%d tipdiff.%d\n",height,zawyflag,tipdiff);
|
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???
|
if ( mult > 1 ) // e^mult case, jl777: test of mult > 1 failed when it was int64_t???
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user