From 13c2a2b766e75bb7871274a7caa3eb6f1ff9742a Mon Sep 17 00:00:00 2001 From: Byron Hambly Date: Mon, 17 Feb 2025 15:27:34 +0200 Subject: [PATCH] chainstatemanager: fix warnings of missing fields in initialization --- src/init.cpp | 4 ++++ src/test/util/setup_common.cpp | 2 ++ src/test/validation_chainstatemanager_tests.cpp | 2 ++ src/validation.cpp | 13 ++++++------- src/wallet/rpc/elements.cpp | 12 ++++++++++-- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index e5f13def9a..4e5cd3c793 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1108,6 +1108,8 @@ bool AppInitParameterInteraction(const ArgsManager& args, bool use_syscall_sandb { ChainstateManager::Options chainman_opts_dummy{ .chainparams = chainparams, + .minimum_chain_work = UintToArith256(chainparams.GetConsensus().nMinimumChainWork), + .assumed_valid_block = chainparams.GetConsensus().defaultAssumeValid, }; if (const auto error{ApplyArgsManOptions(args, chainman_opts_dummy)}) { return InitError(*error); @@ -1571,6 +1573,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) ChainstateManager::Options chainman_opts{ .chainparams = chainparams, .adjusted_time_callback = GetAdjustedTime, + .minimum_chain_work = UintToArith256(chainparams.GetConsensus().nMinimumChainWork), + .assumed_valid_block = chainparams.GetConsensus().defaultAssumeValid, }; Assert(!ApplyArgsManOptions(args, chainman_opts)); // no error can happen, already checked in AppInitParameterInteraction diff --git a/src/test/util/setup_common.cpp b/src/test/util/setup_common.cpp index c55bac0927..76f5401595 100644 --- a/src/test/util/setup_common.cpp +++ b/src/test/util/setup_common.cpp @@ -202,6 +202,8 @@ ChainTestingSetup::ChainTestingSetup(const std::string& chainName, const std::ve .chainparams = chainparams, .adjusted_time_callback = GetAdjustedTime, .check_block_index = true, + .minimum_chain_work = std::nullopt, + .assumed_valid_block = std::nullopt, }; m_node.chainman = std::make_unique(chainman_opts); m_node.chainman->m_blockman.m_block_tree_db = std::make_unique(m_cache_sizes.block_tree_db, true); diff --git a/src/test/validation_chainstatemanager_tests.cpp b/src/test/validation_chainstatemanager_tests.cpp index 7703fbe5c3..85be3fc414 100644 --- a/src/test/validation_chainstatemanager_tests.cpp +++ b/src/test/validation_chainstatemanager_tests.cpp @@ -376,6 +376,8 @@ struct SnapshotTestSetup : TestChain100Setup { const ChainstateManager::Options chainman_opts{ .chainparams = ::Params(), .adjusted_time_callback = GetAdjustedTime, + .minimum_chain_work = std::nullopt, + .assumed_valid_block = std::nullopt, }; // For robustness, ensure the old manager is destroyed before creating a // new one. diff --git a/src/validation.cpp b/src/validation.cpp index 45c8598f5c..fcbe396e74 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1078,11 +1078,11 @@ bool MemPoolAccept::PolicyScriptChecks(const ATMPArgs& args, Workspace& ws) // Dynamic Federations. This can be included in the // STANDARD_LOCKTIME_VERIFY_FLAGS in a release post-activation. - if (DeploymentActiveAfter(m_active_chainstate.m_chain.Tip(), ChainstateManager({args.m_chainparams, GetAdjustedTime}), Consensus::DEPLOYMENT_DYNA_FED)) { + if (DeploymentActiveAfter(m_active_chainstate.m_chain.Tip(), m_active_chainstate.m_chainman, Consensus::DEPLOYMENT_DYNA_FED)) { scriptVerifyFlags |= SCRIPT_SIGHASH_RANGEPROOF; } - if (DeploymentActiveAfter(m_active_chainstate.m_chain.Tip(), ChainstateManager({args.m_chainparams, GetAdjustedTime}), Consensus::DEPLOYMENT_SIMPLICITY)) { + if (DeploymentActiveAfter(m_active_chainstate.m_chain.Tip(), m_active_chainstate.m_chainman, Consensus::DEPLOYMENT_SIMPLICITY)) { scriptVerifyFlags |= SCRIPT_VERIFY_SIMPLICITY; } @@ -3846,12 +3846,10 @@ std::vector ChainstateManager::GenerateCoinbaseCommitment(CBlock& } // ELEMENTS - - -static bool ContextualCheckDynaFedHeader(const CBlockHeader& block, BlockValidationState& state, const CChainParams& params, const CBlockIndex* pindexPrev) +static bool ContextualCheckDynaFedHeader(const CBlockHeader& block, BlockValidationState& state, const ChainstateManager& chainman, const CBlockIndex* pindexPrev) { // When not active, it's a NOP - if (!DeploymentActiveAfter(pindexPrev, ChainstateManager({params, GetAdjustedTime}), Consensus::DEPLOYMENT_DYNA_FED)) { + if (!DeploymentActiveAfter(pindexPrev, chainman, Consensus::DEPLOYMENT_DYNA_FED)) { return true; } @@ -3868,6 +3866,7 @@ static bool ContextualCheckDynaFedHeader(const CBlockHeader& block, BlockValidat return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "invalid-dyna-fed", "dynamic block header has unknown HF extension bits set"); } + const CChainParams& params = chainman.GetParams(); const DynaFedParamEntry expected_current_params = ComputeNextBlockCurrentParameters(pindexPrev, params.GetConsensus()); if (expected_current_params != dynafed_params.m_current) { @@ -4002,7 +4001,7 @@ static bool ContextualCheckBlockHeader(const CBlockHeader& block, BlockValidatio strprintf("rejected nVersion=0x%08x block", block.nVersion)); } - if (!ContextualCheckDynaFedHeader(block, state, chainman.GetParams(), pindexPrev)) { + if (!ContextualCheckDynaFedHeader(block, state, chainman, pindexPrev)) { return false; } diff --git a/src/wallet/rpc/elements.cpp b/src/wallet/rpc/elements.cpp index 66be21c34b..aaf45f4833 100644 --- a/src/wallet/rpc/elements.cpp +++ b/src/wallet/rpc/elements.cpp @@ -188,7 +188,9 @@ RPCHelpMan getpeginaddress() spk_man->AddCScript(dest_script); // Get P2CH deposit address on mainchain from most recent fedpegscript. - const auto& fedpegscripts = GetValidFedpegScripts(pwallet->chain().getTip(), Params().GetConsensus(), true /* nextblock_validation */); + const CChainParams& chainparams = Params(); + const Consensus::Params& consensus = chainparams.GetConsensus(); + const auto& fedpegscripts = GetValidFedpegScripts(pwallet->chain().getTip(), consensus, true /* nextblock_validation */); if (fedpegscripts.empty()) { std::string message = "No valid fedpegscripts."; if (!g_con_elementsmode) { @@ -199,7 +201,13 @@ RPCHelpMan getpeginaddress() CTxDestination mainchain_dest(WitnessV0ScriptHash(calculate_contract(fedpegscripts.front().second, dest_script))); // P2SH-wrapped is the only valid choice for non-dynafed chains but still an // option for dynafed-enabled ones as well - if (!DeploymentActiveAfter(pwallet->chain().getTip(), ChainstateManager({Params(), GetAdjustedTime}), Consensus::DEPLOYMENT_DYNA_FED) || + ChainstateManager::Options opts{ + .chainparams = chainparams, + .adjusted_time_callback = GetAdjustedTime, + .minimum_chain_work = UintToArith256(consensus.nMinimumChainWork), + .assumed_valid_block = consensus.defaultAssumeValid, + }; + if (!DeploymentActiveAfter(pwallet->chain().getTip(), ChainstateManager(opts), Consensus::DEPLOYMENT_DYNA_FED) || fedpegscripts.front().first.IsPayToScriptHash()) { mainchain_dest = ScriptHash(GetScriptForDestination(mainchain_dest)); }