From 7b35aa206589e5d5f68dead1d09540c7982271d7 Mon Sep 17 00:00:00 2001 From: DeckerSU Date: Mon, 22 Jul 2019 04:35:17 +0300 Subject: [PATCH 01/16] payments cc fix --- src/cc/payments.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/cc/payments.cpp b/src/cc/payments.cpp index 17507a80e..e329ff5bf 100644 --- a/src/cc/payments.cpp +++ b/src/cc/payments.cpp @@ -75,6 +75,36 @@ */ +// payments cc fix +#if (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) + #undef mpz_set_si + #undef mpz_get_si + #define GMP_LIMB_HIGHBIT ((mp_limb_t) 1 << (GMP_LIMB_BITS - 1)) + #define GMP_NEG_CAST(T,x) (-(int64_t)((T)((x) + 1) - 1)) + + int64_t mpz_get_si (const mpz_t u) + { + mp_size_t us = u->_mp_size; + if (us > 0) + return (int64_t) (u->_mp_d[0] & ~GMP_LIMB_HIGHBIT); + else if (us < 0) + return (int64_t) (- u->_mp_d[0] | GMP_LIMB_HIGHBIT); + else + return 0; + } + + void mpz_set_si (mpz_t r, int64_t x) + { + if (x >= 0) + mpz_set_ui (r, x); + else /* (x < 0) */ + { + r->_mp_size = -1; + r->_mp_d[0] = GMP_NEG_CAST (uint64_t, x); + } + } +#endif + // start of consensus code CScript EncodePaymentsTxidOpRet(int64_t allocation,std::vector scriptPubKey,std::vector destopret) From e67ede9c3d3f0d120d576466d487355285fa8c21 Mon Sep 17 00:00:00 2001 From: Alrighttt <36680730+Alrighttt@users.noreply.github.com> Date: Sat, 27 Jul 2019 20:59:53 +0200 Subject: [PATCH 02/16] Revert "payments cc fix" --- src/cc/payments.cpp | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/src/cc/payments.cpp b/src/cc/payments.cpp index e329ff5bf..17507a80e 100644 --- a/src/cc/payments.cpp +++ b/src/cc/payments.cpp @@ -75,36 +75,6 @@ */ -// payments cc fix -#if (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) - #undef mpz_set_si - #undef mpz_get_si - #define GMP_LIMB_HIGHBIT ((mp_limb_t) 1 << (GMP_LIMB_BITS - 1)) - #define GMP_NEG_CAST(T,x) (-(int64_t)((T)((x) + 1) - 1)) - - int64_t mpz_get_si (const mpz_t u) - { - mp_size_t us = u->_mp_size; - if (us > 0) - return (int64_t) (u->_mp_d[0] & ~GMP_LIMB_HIGHBIT); - else if (us < 0) - return (int64_t) (- u->_mp_d[0] | GMP_LIMB_HIGHBIT); - else - return 0; - } - - void mpz_set_si (mpz_t r, int64_t x) - { - if (x >= 0) - mpz_set_ui (r, x); - else /* (x < 0) */ - { - r->_mp_size = -1; - r->_mp_d[0] = GMP_NEG_CAST (uint64_t, x); - } - } -#endif - // start of consensus code CScript EncodePaymentsTxidOpRet(int64_t allocation,std::vector scriptPubKey,std::vector destopret) From 1cefd54af14fc10ae2eead39814db825e5875627 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 00:38:59 -1100 Subject: [PATCH 03/16] Fix zawy attack, thanks zawy! --- src/main.cpp | 4 ++-- src/miner.cpp | 13 ++++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 14c8e05ac..aeab7cadc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5299,9 +5299,9 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta } else { - if ( block.GetBlockTime() <= pindexPrev->GetMedianTimePast() + 2*ASSETCHAINS_ADAPTIVEPOW*ASSETCHAINS_BLOCKTIME ) + if ( block.GetBlockTime() <= pindexPrev->nTime ) { - fprintf(stderr,"ht.%d too early2 %u vs %u\n",(int32_t)nHeight,(uint32_t)block.GetBlockTime(),(uint32_t)pindexPrev->GetMedianTimePast()); + fprintf(stderr,"ht.%d too early2 %u vs %u\n",(int32_t)nHeight,(uint32_t)block.GetBlockTime(),(uint32_t)pindexPrev->nTime); return state.Invalid(error("%s: block's timestamp is too early2", __func__), REJECT_INVALID, "time-too-old"); } diff --git a/src/miner.cpp b/src/miner.cpp index fe7ca068a..01a41f5b8 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -123,7 +123,9 @@ public: void UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev) { - pblock->nTime = std::max(pindexPrev->GetMedianTimePast()+1 + 2*ASSETCHAINS_ADAPTIVEPOW*ASSETCHAINS_BLOCKTIME, GetAdjustedTime()); + if ( ASSETCHAINS_ADAPTIVEPOW == 0 ) + pblock->nTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); + else pblock->nTime = std::max(pindexPrev->nTime+1, GetAdjustedTime()); // Updating time can change work required on testnet: if (consensusParams.nPowAllowMinDifficultyBlocksAfterHeight != boost::none) { @@ -567,7 +569,9 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 nLastBlockTx = nBlockTx; nLastBlockSize = nBlockSize; - blocktime = 1 + std::max(pindexPrev->GetMedianTimePast()+1+ 2*ASSETCHAINS_ADAPTIVEPOW*ASSETCHAINS_BLOCKTIME, GetAdjustedTime()); + if ( ASSETCHAINS_ADAPTIVEPOW == 0 ) + blocktime = 1 + std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); + else blocktime = 1 + std::max(pindexPrev->nTime+1, GetAdjustedTime()); //pblock->nTime = blocktime + 1; pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus()); @@ -640,7 +644,10 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 txNew.vout[0].nValue = GetBlockSubsidy(nHeight,consensusParams) + nFees; //fprintf(stderr,"mine ht.%d with %.8f\n",nHeight,(double)txNew.vout[0].nValue/COIN); txNew.nExpiryHeight = 0; - txNew.nLockTime = std::max(pindexPrev->GetMedianTimePast()+1+ 2*ASSETCHAINS_ADAPTIVEPOW*ASSETCHAINS_BLOCKTIME, GetAdjustedTime()); + if ( ASSETCHAINS_ADAPTIVEPOW == 0 ) + txNew.nLockTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); + else txNew.nLockTime = std::max(pindexPrev->nTime+1, GetAdjustedTime()); + if ( ASSETCHAINS_SYMBOL[0] == 0 && IS_KOMODO_NOTARY != 0 && My_notaryid >= 0 ) txNew.vout[0].nValue += 5000; From 4aa44715aa4e5c39fc54323d3fc5f6a0af2380f1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 00:43:39 -1100 Subject: [PATCH 04/16] Syntax --- src/miner.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 01a41f5b8..b7447500d 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -125,7 +125,7 @@ void UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, { if ( ASSETCHAINS_ADAPTIVEPOW == 0 ) pblock->nTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); - else pblock->nTime = std::max(pindexPrev->nTime+1, GetAdjustedTime()); + else pblock->nTime = std::max((int64_t)(pindexPrev->nTime+1), GetAdjustedTime()); // Updating time can change work required on testnet: if (consensusParams.nPowAllowMinDifficultyBlocksAfterHeight != boost::none) { @@ -646,7 +646,7 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 txNew.nExpiryHeight = 0; if ( ASSETCHAINS_ADAPTIVEPOW == 0 ) txNew.nLockTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); - else txNew.nLockTime = std::max(pindexPrev->nTime+1, GetAdjustedTime()); + else txNew.nLockTime = std::max((int64_t)(pindexPrev->nTime+1), GetAdjustedTime()); if ( ASSETCHAINS_SYMBOL[0] == 0 && IS_KOMODO_NOTARY != 0 && My_notaryid >= 0 ) From 41f752ff4bf1ba4d452a03b2c1e3fc5425076627 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 00:44:56 -1100 Subject: [PATCH 05/16] int64_t --- src/miner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index b7447500d..d19faee7d 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -571,7 +571,7 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 nLastBlockSize = nBlockSize; if ( ASSETCHAINS_ADAPTIVEPOW == 0 ) blocktime = 1 + std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime()); - else blocktime = 1 + std::max(pindexPrev->nTime+1, GetAdjustedTime()); + else blocktime = 1 + std::max((int64_t)(pindexPrev->nTime+1), GetAdjustedTime()); //pblock->nTime = blocktime + 1; pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus()); From 716e089fab83c4f62c1c14faf4213cf8a8f7a619 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 00:56:26 -1100 Subject: [PATCH 06/16] Fix AddCClibtxfee --- src/cc/cclib.cpp | 2 +- src/init.cpp | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/cc/cclib.cpp b/src/cc/cclib.cpp index dddd59f59..4c182e721 100644 --- a/src/cc/cclib.cpp +++ b/src/cc/cclib.cpp @@ -542,7 +542,7 @@ int64_t AddCClibtxfee(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKe char coinaddr[64]; int64_t nValue,txfee = 10000; uint256 txid,hashBlock; CTransaction vintx; int32_t vout; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); - SetCCunspents(unspentOutputs,coinaddr,true); + SetCCunspents(unspentOutputs,coinaddr,false); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; diff --git a/src/init.cpp b/src/init.cpp index 51d6cb435..903ca8555 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1911,11 +1911,14 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) PruneAndFlush(); } } - if ( GetBoolArg("-addressindex", DEFAULT_ADDRESSINDEX) != 0 ) - nLocalServices |= NODE_ADDRINDEX; - if ( GetBoolArg("-spentindex", DEFAULT_SPENTINDEX) != 0 ) - nLocalServices |= NODE_SPENTINDEX; -fprintf(stderr,"nLocalServices %llx %d, %d\n",(long long)nLocalServices,GetBoolArg("-addressindex", DEFAULT_ADDRESSINDEX),GetBoolArg("-spentindex", DEFAULT_SPENTINDEX)); + if ( KOMODO_NSPV > 0 ) + { + if ( GetBoolArg("-addressindex", DEFAULT_ADDRESSINDEX) != 0 ) + nLocalServices |= NODE_ADDRINDEX; + if ( GetBoolArg("-spentindex", DEFAULT_SPENTINDEX) != 0 ) + nLocalServices |= NODE_SPENTINDEX; + fprintf(stderr,"nLocalServices %llx %d, %d\n",(long long)nLocalServices,GetBoolArg("-addressindex", DEFAULT_ADDRESSINDEX),GetBoolArg("-spentindex", DEFAULT_SPENTINDEX)); + } // ********************************************************* Step 10: import blocks if (mapArgs.count("-blocknotify")) From 8074aabefd3492257b3400245e8b84f75b25324d Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 01:12:20 -1100 Subject: [PATCH 07/16] Revert --- src/cc/cclib.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/cclib.cpp b/src/cc/cclib.cpp index 4c182e721..dddd59f59 100644 --- a/src/cc/cclib.cpp +++ b/src/cc/cclib.cpp @@ -542,7 +542,7 @@ int64_t AddCClibtxfee(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKe char coinaddr[64]; int64_t nValue,txfee = 10000; uint256 txid,hashBlock; CTransaction vintx; int32_t vout; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); - SetCCunspents(unspentOutputs,coinaddr,false); + SetCCunspents(unspentOutputs,coinaddr,true); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; From 23ca86df3a7031e0cfee52b364aa137b8219ba3f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 09:14:07 -1100 Subject: [PATCH 08/16] Zawys new algo 1) FTL 4 seconds 2) MTP from 11 -> 1 3) must calc MAX(diff[I]) for past 11 blocks 4) bnTarget *= mult*mult 5) bnTarget.nBits -> onchain --- src/komodo_bitcoind.h | 8 ++++---- src/main.cpp | 12 ++++++++++-- src/miner.cpp | 19 ++++++++++--------- src/pow.cpp | 31 ++++++++++++++++++++++++------- src/rpc/mining.cpp | 5 +++-- 5 files changed, 51 insertions(+), 24 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index e2bc2b7f2..c0850006b 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1419,13 +1419,13 @@ uint32_t komodo_stakehash(uint256 *hashp,char *address,uint8_t *hashbuf,uint256 arith_uint256 komodo_adaptivepow_target(int32_t height,arith_uint256 bnTarget,uint32_t nTime) { arith_uint256 origtarget,easy; int32_t diff,tipdiff; int64_t mult; bool fNegative,fOverflow; CBlockIndex *tipindex; - if ( height > 10 && (tipindex= komodo_chainactive(height - 1)) != 0 ) + if ( height > 10 && (tipindex= komodo_chainactive(height - 1)) != 0 ) // disable offchain diffchange { diff = (nTime - tipindex->GetMedianTimePast()); tipdiff = (nTime - tipindex->nTime); if ( tipdiff > 13*ASSETCHAINS_BLOCKTIME ) diff = tipdiff; - if ( diff >= 13 * ASSETCHAINS_BLOCKTIME && (height < 3000 || tipdiff > 2*ASSETCHAINS_BLOCKTIME) ) + if ( diff >= 13 * ASSETCHAINS_BLOCKTIME && (height < 30 || tipdiff > 2*ASSETCHAINS_BLOCKTIME) ) { mult = diff - 12 * ASSETCHAINS_BLOCKTIME; mult = (mult / ASSETCHAINS_BLOCKTIME) * ASSETCHAINS_BLOCKTIME + ASSETCHAINS_BLOCKTIME / 2; @@ -2286,8 +2286,8 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) if ( height == 0 ) return(0); } - if ( ASSETCHAINS_ADAPTIVEPOW > 0 ) - bnTarget = komodo_adaptivepow_target(height,bnTarget,pblock->nTime); + //if ( ASSETCHAINS_ADAPTIVEPOW > 0 ) + // bnTarget = komodo_adaptivepow_target(height,bnTarget,pblock->nTime); if ( ASSETCHAINS_LWMAPOS != 0 && bhash > bnTarget ) { // if proof of stake is active, check if this is a valid PoS block before we fail diff --git a/src/main.cpp b/src/main.cpp index aeab7cadc..9cffe8a76 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5043,7 +5043,15 @@ bool CheckBlockHeader(int32_t *futureblockp,int32_t height,CBlockIndex *pindex, } } *futureblockp = 0; - if (blockhdr.GetBlockTime() > GetAdjustedTime() + 60) + if ( ASSETCHAINS_ADAPTIVEPOW > 0 ) + { + if (blockhdr.GetBlockTime() > GetAdjustedTime() + 4) + { + //LogPrintf("CheckBlockHeader block from future %d error",blockhdr.GetBlockTime() - GetAdjustedTime()); + return false; + } + } + else if (blockhdr.GetBlockTime() > GetAdjustedTime() + 60) { /*CBlockIndex *tipindex; //fprintf(stderr,"ht.%d future block %u vs time.%u + 60\n",height,(uint32_t)blockhdr.GetBlockTime(),(uint32_t)GetAdjustedTime()); @@ -5288,7 +5296,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta } // Check timestamp against prev - if ( ASSETCHAINS_ADAPTIVEPOW == 0 || nHeight < 3000 ) + if ( ASSETCHAINS_ADAPTIVEPOW == 0 || nHeight < 30 ) { if (block.GetBlockTime() <= pindexPrev->GetMedianTimePast() ) { diff --git a/src/miner.cpp b/src/miner.cpp index d19faee7d..676a41b57 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -1452,8 +1452,8 @@ void static BitcoinMiner_noeq() HASHTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); LogPrintf("Block %d : PoS %d%% vs target %d%%\n", Mining_height, percPoS, (int32_t)ASSETCHAINS_STAKED); } - else if ( ASSETCHAINS_ADAPTIVEPOW > 0 && ASSETCHAINS_STAKED == 0 ) - HASHTarget_POW = komodo_adaptivepow_target(Mining_height,HASHTarget,pblock->nTime); + //else if ( ASSETCHAINS_ADAPTIVEPOW > 0 && ASSETCHAINS_STAKED == 0 ) + // HASHTarget_POW = komodo_adaptivepow_target(Mining_height,HASHTarget,pblock->nTime); while (true) { @@ -1487,8 +1487,8 @@ void static BitcoinMiner_noeq() } else if ( ASSETCHAINS_STAKED == 100 && Mining_height > 100 ) hashTarget = HASHTarget; - else if ( ASSETCHAINS_ADAPTIVEPOW > 0 && ASSETCHAINS_STAKED == 0 ) - hashTarget = HASHTarget_POW; + //else if ( ASSETCHAINS_ADAPTIVEPOW > 0 && ASSETCHAINS_STAKED == 0 ) + // hashTarget = HASHTarget_POW; // for speed check NONCEMASK at a time for (i = 0; i < count; i++) @@ -1825,8 +1825,8 @@ void static BitcoinMiner() if ( ASSETCHAINS_STAKED < 100 ) LogPrintf("Block %d : PoS %d%% vs target %d%% \n",Mining_height,percPoS,(int32_t)ASSETCHAINS_STAKED); } - else if ( ASSETCHAINS_ADAPTIVEPOW > 0 ) - HASHTarget_POW = komodo_adaptivepow_target(Mining_height,HASHTarget,pblock->nTime); + //else if ( ASSETCHAINS_ADAPTIVEPOW > 0 ) + // HASHTarget_POW = komodo_adaptivepow_target(Mining_height,HASHTarget,pblock->nTime); gotinvalid = 0; while (true) { @@ -1854,8 +1854,8 @@ void static BitcoinMiner() arith_uint256 hashTarget; if ( KOMODO_MININGTHREADS > 0 && ASSETCHAINS_STAKED > 0 && ASSETCHAINS_STAKED < 100 && Mining_height > 10 ) hashTarget = HASHTarget_POW; - else if ( ASSETCHAINS_ADAPTIVEPOW > 0 ) - hashTarget = HASHTarget_POW; + //else if ( ASSETCHAINS_ADAPTIVEPOW > 0 ) + // hashTarget = HASHTarget_POW; else hashTarget = HASHTarget; std::function)> validBlock = #ifdef ENABLE_WALLET @@ -2048,7 +2048,8 @@ void static BitcoinMiner() if ( ASSETCHAINS_ADAPTIVEPOW > 0 ) { UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev); - hashTarget = HASHTarget_POW = komodo_adaptivepow_target(Mining_height,HASHTarget,pblock->nTime); + HASHTarget.SetCompact(pblock->nBits); + //hashTarget = HASHTarget_POW = komodo_adaptivepow_target(Mining_height,HASHTarget,pblock->nTime); } /*if ( NOTARY_PUBKEY33[0] == 0 ) { diff --git a/src/pow.cpp b/src/pow.cpp index 18fda549f..19eb28629 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -73,11 +73,19 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead // Find the first block in the averaging interval const CBlockIndex* pindexFirst = pindexLast; - arith_uint256 bnTot {0}; - for (int i = 0; pindexFirst && i < params.nPowAveragingWindow; i++) { + arith_uint256 bnTarget,bnTot {0}; + uint32_t nbits; int64_t diff,mult = pblock->nTime - pindexFirst->nTime - 7 * ASSETCHAINS_BLOCKTIME; + for (int i = 0; pindexFirst && i < params.nPowAveragingWindow; i++) + { arith_uint256 bnTmp; bnTmp.SetCompact(pindexFirst->nBits); bnTot += bnTmp; + if ( ASSETCHAINS_ADAPTIVEPOW > 0 && i < 12 ) + { + diff = pblock->nTime - pindexFirst->nTime - (8+i)*ASSETCHAINS_BLOCKTIME; + if ( diff > mult ) + mult = diff; + } pindexFirst = pindexFirst->pprev; } @@ -85,9 +93,18 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead if (pindexFirst == NULL) return nProofOfWorkLimit; - arith_uint256 bnAvg {bnTot / params.nPowAveragingWindow}; - - return CalculateNextWorkRequired(bnAvg, pindexLast->GetMedianTimePast(), pindexFirst->GetMedianTimePast(), params); + bool fNegative,fOverflow; arith_uint256 easy,origtarget,bnAvg {bnTot / params.nPowAveragingWindow}; + nbits = CalculateNextWorkRequired(bnAvg, pindexLast->GetMedianTimePast(), pindexFirst->GetMedianTimePast(), params); + if ( ASSETCHAINS_ADAPTIVEPOW > 0 && mult > 1 ) + { + origtarget = bnTarget = arith_uint256().SetCompact(nbits); + bnTarget = bnTarget * arith_uint256(mult * mult); + easy.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); + if ( bnTarget < origtarget || bnTarget > easy ) + bnTarget = easy; + nbits = bnTarget.GetCompact(); + } + return(nbits); } unsigned int CalculateNextWorkRequired(arith_uint256 bnAvg, @@ -453,8 +470,8 @@ bool CheckProofOfWork(const CBlockHeader &blkHeader, uint8_t *pubkey33, int32_t arith_uint256 bnMaxPoSdiff; bnTarget.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); } - else if ( ASSETCHAINS_ADAPTIVEPOW > 0 && ASSETCHAINS_STAKED == 0 ) - bnTarget = komodo_adaptivepow_target(height,bnTarget,blkHeader.nTime); + //else if ( ASSETCHAINS_ADAPTIVEPOW > 0 && ASSETCHAINS_STAKED == 0 ) + // bnTarget = komodo_adaptivepow_target(height,bnTarget,blkHeader.nTime); // Check proof of work matches claimed amount if ( UintToArith256(hash = blkHeader.GetHash()) > bnTarget && !blkHeader.IsVerusPOSBlock() ) { diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index e31dbd396..d70f198f1 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -838,9 +838,10 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp) result.push_back(Pair("ac_staked", (int64_t)ASSETCHAINS_STAKED)); result.push_back(Pair("origtarget", hashTarget.GetHex())); } - else if ( ASSETCHAINS_ADAPTIVEPOW != 0 ) + /*else if ( ASSETCHAINS_ADAPTIVEPOW > 0 ) result.push_back(Pair("target",komodo_adaptivepow_target((int32_t)(pindexPrev->GetHeight()+1),hashTarget,pblock->nTime).GetHex())); - else result.push_back(Pair("target", hashTarget.GetHex())); + else*/ + result.push_back(Pair("target", hashTarget.GetHex())); result.push_back(Pair("mintime", (int64_t)pindexPrev->GetMedianTimePast()+1)); result.push_back(Pair("mutable", aMutable)); result.push_back(Pair("noncerange", "00000000ffffffff")); From a8f5005a7f81219bffb017c82486392c6e9b2c31 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 09:54:24 -1100 Subject: [PATCH 09/16] Fix crash --- src/pow.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pow.cpp b/src/pow.cpp index 19eb28629..a91b48dc1 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -74,7 +74,9 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead // Find the first block in the averaging interval const CBlockIndex* pindexFirst = pindexLast; arith_uint256 bnTarget,bnTot {0}; - uint32_t nbits; int64_t diff,mult = pblock->nTime - pindexFirst->nTime - 7 * ASSETCHAINS_BLOCKTIME; + uint32_t nbits; int64_t diff,mult = 0; + if ( pindexFirst != 0 ) + mult = pblock->nTime - pindexFirst->nTime - 7 * ASSETCHAINS_BLOCKTIME; for (int i = 0; pindexFirst && i < params.nPowAveragingWindow; i++) { arith_uint256 bnTmp; From 61e4db43325195e0907d45403b2c7305aa71939e Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 10:01:55 -1100 Subject: [PATCH 10/16] Fix null access --- src/pow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pow.cpp b/src/pow.cpp index a91b48dc1..c98928d3e 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -75,14 +75,14 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead const CBlockIndex* pindexFirst = pindexLast; arith_uint256 bnTarget,bnTot {0}; uint32_t nbits; int64_t diff,mult = 0; - if ( pindexFirst != 0 ) + if ( pindexFirst != 0 && pblock != 0 ) mult = pblock->nTime - pindexFirst->nTime - 7 * ASSETCHAINS_BLOCKTIME; for (int i = 0; pindexFirst && i < params.nPowAveragingWindow; i++) { arith_uint256 bnTmp; bnTmp.SetCompact(pindexFirst->nBits); bnTot += bnTmp; - if ( ASSETCHAINS_ADAPTIVEPOW > 0 && i < 12 ) + if ( ASSETCHAINS_ADAPTIVEPOW > 0 && i < 12 && pblock != 0 ) { diff = pblock->nTime - pindexFirst->nTime - (8+i)*ASSETCHAINS_BLOCKTIME; if ( diff > mult ) From f5e59c37fe41a96389c4dc2a6c85f4d7044ef3e1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 10:21:55 -1100 Subject: [PATCH 11/16] +print --- src/pow.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pow.cpp b/src/pow.cpp index c98928d3e..e305d347d 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -76,7 +76,10 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead arith_uint256 bnTarget,bnTot {0}; uint32_t nbits; int64_t diff,mult = 0; if ( pindexFirst != 0 && pblock != 0 ) + { mult = pblock->nTime - pindexFirst->nTime - 7 * ASSETCHAINS_BLOCKTIME; + fprintf(stderr,"ht.%d mult.%d = (%u - %u - 7x)\n",pindexLast->GetHeight(),mult,pblock->nTime, pindexFirst->nTime); + } for (int i = 0; pindexFirst && i < params.nPowAveragingWindow; i++) { arith_uint256 bnTmp; @@ -103,7 +106,10 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead bnTarget = bnTarget * arith_uint256(mult * mult); easy.SetCompact(KOMODO_MINDIFF_NBITS,&fNegative,&fOverflow); if ( bnTarget < origtarget || bnTarget > easy ) + { bnTarget = easy; + fprintf(stderr,"mult.%d ht.%d -> easy target\n",(int32_t)mult,(int32_t)pindexLast->GetHeight()); + } else fprintf(stderr,"mult.%d for ht.%d\n",(int32_t)mult,(int32_t)pindexLast->GetHeight()); nbits = bnTarget.GetCompact(); } return(nbits); From 28c82425212af9a84e9de1b9521861a182192c56 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 10:24:04 -1100 Subject: [PATCH 12/16] Print --- src/pow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pow.cpp b/src/pow.cpp index e305d347d..bff20b446 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -78,7 +78,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead if ( pindexFirst != 0 && pblock != 0 ) { mult = pblock->nTime - pindexFirst->nTime - 7 * ASSETCHAINS_BLOCKTIME; - fprintf(stderr,"ht.%d mult.%d = (%u - %u - 7x)\n",pindexLast->GetHeight(),mult,pblock->nTime, pindexFirst->nTime); + fprintf(stderr,"ht.%d mult.%d = (%u - %u - 7x)\n",pindexLast->GetHeight(),(int32_t)mult,pblock->nTime, pindexFirst->nTime); } for (int i = 0; pindexFirst && i < params.nPowAveragingWindow; i++) { From 45fcb5bcde9364394cfd158154221f234a812f4f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 10:26:46 -1100 Subject: [PATCH 13/16] +print --- src/pow.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pow.cpp b/src/pow.cpp index bff20b446..e8a9dca10 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -89,7 +89,10 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead { diff = pblock->nTime - pindexFirst->nTime - (8+i)*ASSETCHAINS_BLOCKTIME; if ( diff > mult ) + { + fprintf(stderr,"i.%d diff.%d (%u - %u - %dx)\n",i,(int32_t)diff,pblock->nTime,pindexFirst->nTime,(8+i)); mult = diff; + } } pindexFirst = pindexFirst->pprev; } From cd6b8c738e02c0bb055067397cb3a91f2633c47c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 10:30:26 -1100 Subject: [PATCH 14/16] +print --- src/pow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pow.cpp b/src/pow.cpp index e8a9dca10..038f130e8 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -111,8 +111,8 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead if ( bnTarget < origtarget || bnTarget > easy ) { bnTarget = easy; - fprintf(stderr,"mult.%d ht.%d -> easy target\n",(int32_t)mult,(int32_t)pindexLast->GetHeight()); - } else fprintf(stderr,"mult.%d for ht.%d\n",(int32_t)mult,(int32_t)pindexLast->GetHeight()); + fprintf(stderr,"cmp.%d mult.%d ht.%d -> easy target\n",mult>1,(int32_t)mult,(int32_t)pindexLast->GetHeight()); + } else fprintf(stderr,"cmp.%d mult.%d for ht.%d\n",mult>1,(int32_t)mult,(int32_t)pindexLast->GetHeight()); nbits = bnTarget.GetCompact(); } return(nbits); From 58704437ced8622e123667d8158c0ba618d8c845 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 10:32:58 -1100 Subject: [PATCH 15/16] int32_t --- src/pow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pow.cpp b/src/pow.cpp index 038f130e8..0a37dc8fb 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -74,7 +74,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead // Find the first block in the averaging interval const CBlockIndex* pindexFirst = pindexLast; arith_uint256 bnTarget,bnTot {0}; - uint32_t nbits; int64_t diff,mult = 0; + uint32_t nbits; int32_t diff,mult = 0; if ( pindexFirst != 0 && pblock != 0 ) { mult = pblock->nTime - pindexFirst->nTime - 7 * ASSETCHAINS_BLOCKTIME; From 977c6aa1b3d292ea95ffefefa71f5ef08bb25ef8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 1 Aug 2019 10:56:54 -1100 Subject: [PATCH 16/16] Remove adjustment limits --- src/pow.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/pow.cpp b/src/pow.cpp index 0a37dc8fb..175137f06 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -103,7 +103,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHead bool fNegative,fOverflow; arith_uint256 easy,origtarget,bnAvg {bnTot / params.nPowAveragingWindow}; nbits = CalculateNextWorkRequired(bnAvg, pindexLast->GetMedianTimePast(), pindexFirst->GetMedianTimePast(), params); - if ( ASSETCHAINS_ADAPTIVEPOW > 0 && mult > 1 ) + if ( ASSETCHAINS_ADAPTIVEPOW > 0 && mult > 1 ) // jl777: this test of mult > 1 failed when it was int64_t??? { origtarget = bnTarget = arith_uint256().SetCompact(nbits); bnTarget = bnTarget * arith_uint256(mult * mult); @@ -129,11 +129,13 @@ unsigned int CalculateNextWorkRequired(arith_uint256 bnAvg, nActualTimespan = params.AveragingWindowTimespan() + (nActualTimespan - params.AveragingWindowTimespan())/4; LogPrint("pow", " nActualTimespan = %d before bounds\n", nActualTimespan); - if (nActualTimespan < params.MinActualTimespan()) - nActualTimespan = params.MinActualTimespan(); - if (nActualTimespan > params.MaxActualTimespan()) - nActualTimespan = params.MaxActualTimespan(); - + if ( ASSETCHAINS_ADAPTIVEPOW <= 0 ) + { + if (nActualTimespan < params.MinActualTimespan()) + nActualTimespan = params.MinActualTimespan(); + if (nActualTimespan > params.MaxActualTimespan()) + nActualTimespan = params.MaxActualTimespan(); + } // Retarget arith_uint256 bnLimit; if (ASSETCHAINS_ALGO == ASSETCHAINS_EQUIHASH)