diff --git a/src/bench/duplicate_inputs.cpp b/src/bench/duplicate_inputs.cpp --- a/src/bench/duplicate_inputs.cpp +++ b/src/bench/duplicate_inputs.cpp @@ -17,7 +17,8 @@ static void DuplicateInputs(benchmark::State &state) { const CScript SCRIPT_PUB{CScript(OP_TRUE)}; - const CChainParams &chainparams = Params(); + const CChainParams &chainParams = Params(); + const Consensus::Params &consensusParams = chainParams.GetConsensus(); CBlock block{}; CMutableTransaction coinbaseTx{}; @@ -26,8 +27,7 @@ LOCK(cs_main); CBlockIndex *pindexPrev = ::ChainActive().Tip(); assert(pindexPrev != nullptr); - block.nBits = - GetNextWorkRequired(pindexPrev, &block, chainparams.GetConsensus()); + block.nBits = GetNextWorkRequired(pindexPrev, &block, chainParams); block.nNonce = 0; auto nHeight = pindexPrev->nHeight + 1; @@ -36,8 +36,7 @@ coinbaseTx.vin[0].prevout = COutPoint(); coinbaseTx.vout.resize(1); coinbaseTx.vout[0].scriptPubKey = SCRIPT_PUB; - coinbaseTx.vout[0].nValue = - GetBlockSubsidy(nHeight, chainparams.GetConsensus()); + coinbaseTx.vout[0].nValue = GetBlockSubsidy(nHeight, consensusParams); coinbaseTx.vin[0].scriptSig = CScript() << nHeight << OP_0; naughtyTx.vout.resize(1); @@ -58,7 +57,7 @@ while (state.KeepRunning()) { BlockValidationState cvstate{}; - assert(!CheckBlock(block, cvstate, chainparams.GetConsensus(), + assert(!CheckBlock(block, cvstate, consensusParams, BlockValidationOptions(GetConfig()) .withCheckPoW(false) .withCheckMerkleRoot(false))); diff --git a/src/miner.h b/src/miner.h --- a/src/miner.h +++ b/src/miner.h @@ -153,7 +153,7 @@ int nHeight; int64_t nLockTimeCutoff; int64_t nMedianTimePast; - const CChainParams &chainparams; + const CChainParams &chainParams; const CTxMemPool *mempool; @@ -231,6 +231,6 @@ void IncrementExtraNonce(CBlock *pblock, const CBlockIndex *pindexPrev, uint64_t nExcessiveBlockSize, unsigned int &nExtraNonce); -int64_t UpdateTime(CBlockHeader *pblock, const Consensus::Params ¶ms, +int64_t UpdateTime(CBlockHeader *pblock, const CChainParams &chainParams, const CBlockIndex *pindexPrev); #endif // BITCOIN_MINER_H diff --git a/src/miner.cpp b/src/miner.cpp --- a/src/miner.cpp +++ b/src/miner.cpp @@ -30,7 +30,7 @@ #include #include -int64_t UpdateTime(CBlockHeader *pblock, const Consensus::Params ¶ms, +int64_t UpdateTime(CBlockHeader *pblock, const CChainParams &chainParams, const CBlockIndex *pindexPrev) { int64_t nOldTime = pblock->nTime; int64_t nNewTime = @@ -41,8 +41,8 @@ } // Updating time can change work required on testnet: - if (params.fPowAllowMinDifficultyBlocks) { - pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, params); + if (chainParams.GetConsensus().fPowAllowMinDifficultyBlocks) { + pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainParams); } return nNewTime - nOldTime; @@ -61,7 +61,7 @@ BlockAssembler::BlockAssembler(const CChainParams ¶ms, const CTxMemPool &_mempool, const Options &options) - : chainparams(params), mempool(&_mempool) { + : chainParams(params), mempool(&_mempool) { blockMinFeeRate = options.blockMinFeeRate; // Limit size to between 1K and options.nExcessiveBlockSize -1K for sanity: nMaxGeneratedBlockSize = std::max( @@ -141,12 +141,12 @@ assert(pindexPrev != nullptr); nHeight = pindexPrev->nHeight + 1; - const Consensus::Params &consensusParams = chainparams.GetConsensus(); + const Consensus::Params &consensusParams = chainParams.GetConsensus(); pblock->nVersion = ComputeBlockVersion(pindexPrev, consensusParams); // -regtest only: allow overriding block.nVersion with // -blockversion=N to test forking scenarios - if (chainparams.MineBlocksOnDemand()) { + if (chainParams.MineBlocksOnDemand()) { pblock->nVersion = gArgs.GetArg("-blockversion", pblock->nVersion); } @@ -218,13 +218,13 @@ // Fill in header. pblock->hashPrevBlock = pindexPrev->GetBlockHash(); - UpdateTime(pblock, consensusParams, pindexPrev); - pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, consensusParams); + UpdateTime(pblock, chainParams, pindexPrev); + pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, chainParams); pblock->nNonce = 0; pblocktemplate->entries[0].sigOpCount = 0; BlockValidationState state; - if (!TestBlockValidity(state, chainparams, *pblock, pindexPrev, + if (!TestBlockValidity(state, chainParams, *pblock, pindexPrev, BlockValidationOptions(nMaxGeneratedBlockSize) .withCheckPoW(false) .withCheckMerkleRoot(false))) { @@ -280,7 +280,7 @@ uint64_t nPotentialBlockSize = nBlockSize; for (CTxMemPool::txiter it : package) { TxValidationState state; - if (!ContextualCheckTransaction(chainparams.GetConsensus(), it->GetTx(), + if (!ContextualCheckTransaction(chainParams.GetConsensus(), it->GetTx(), state, nHeight, nLockTimeCutoff, nMedianTimePast)) { return false; diff --git a/src/pow/pow.h b/src/pow/pow.h --- a/src/pow/pow.h +++ b/src/pow/pow.h @@ -11,6 +11,7 @@ struct BlockHash; class CBlockHeader; class CBlockIndex; +class CChainParams; namespace Consensus { struct Params; @@ -18,7 +19,7 @@ uint32_t GetNextWorkRequired(const CBlockIndex *pindexPrev, const CBlockHeader *pblock, - const Consensus::Params ¶ms); + const CChainParams &chainParams); /** * Check whether a block hash satisfies the proof-of-work requirement specified diff --git a/src/pow/pow.cpp b/src/pow/pow.cpp --- a/src/pow/pow.cpp +++ b/src/pow/pow.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -17,10 +18,12 @@ uint32_t GetNextWorkRequired(const CBlockIndex *pindexPrev, const CBlockHeader *pblock, - const Consensus::Params ¶ms) { + const CChainParams &chainParams) { // GetNextWorkRequired should never be called on the genesis block assert(pindexPrev != nullptr); + const Consensus::Params ¶ms = chainParams.GetConsensus(); + // Special rule for regtest: we never retarget. if (params.fPowNoRetargeting) { return pindexPrev->nBits; diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -614,7 +614,7 @@ CBlock *pblock = &pblocktemplate->block; // Update nTime - UpdateTime(pblock, config.GetChainParams().GetConsensus(), pindexPrev); + UpdateTime(pblock, config.GetChainParams(), pindexPrev); pblock->nNonce = 0; UniValue aCaps(UniValue::VARR); diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3541,9 +3541,7 @@ const int nHeight = pindexPrev->nHeight + 1; // Check proof of work - const Consensus::Params &consensusParams = params.GetConsensus(); - if (block.nBits != - GetNextWorkRequired(pindexPrev, &block, consensusParams)) { + if (block.nBits != GetNextWorkRequired(pindexPrev, &block, params)) { LogPrintf("bad bits after height: %d\n", pindexPrev->nHeight); return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, REJECT_INVALID, "bad-diffbits", @@ -3594,6 +3592,7 @@ // Reject outdated version blocks when 95% (75% on testnet) of the network // has upgraded: // check for version 2, 3 and 4 upgrades + const Consensus::Params &consensusParams = params.GetConsensus(); if ((block.nVersion < 2 && nHeight >= consensusParams.BIP34Height) || (block.nVersion < 3 && nHeight >= consensusParams.BIP66Height) || (block.nVersion < 4 && nHeight >= consensusParams.BIP65Height)) {