From 020166080cf57e6eb869abc56d603eb1d6e5e45b Mon Sep 17 00:00:00 2001 From: Sjors Provoost Date: Thu, 4 Dec 2025 13:47:08 +0100 Subject: [PATCH] mining: use interface for tests, bench and fuzzers Have most tests, benchmarks and fuzzers go through the mining interface. This is a refactor: it does not change what blocks are created, just how the creation calls are made. This avoids most direct test, benchmark and fuzzer use of node::BlockAssembler::Options, making it easier to drop in a later commit. Two exceptions which use BlockAssembler directly: - one check in test/miner_tests.cpp needs m_package_feerates - fuzz/tx_pool.cpp Finish() doesn't have access to a NodeContext Move test_block_validity from BlockAssembler::Options to BlockCreateOptions so bench/block_assemble.cpp can continue to set it. Just like coinbase_output_script, this is not exposed to IPC clients. Inline options variable in places where it's only needed once. We also drop one unused PrepareBlock declaration and one unused implementation. TestChain100Setup::CreateBlock no longer needs a chainstate argument, which in turn means it can be dropped from CreateAndProcessBlock. Using the Mining interface here also requires marking the test KernelNotifications chainstate as loaded after LoadVerifyActivateChainstate(). --- src/bench/block_assemble.cpp | 15 +++++++------ src/bench/connectblock.cpp | 4 ++-- src/node/miner.h | 2 -- src/node/mining_types.h | 5 +++++ src/test/blockfilter_index_tests.cpp | 13 ++++++----- src/test/coinstatsindex_tests.cpp | 2 +- src/test/fuzz/package_eval.cpp | 8 +++---- src/test/fuzz/process_message.cpp | 2 +- src/test/fuzz/process_messages.cpp | 2 +- src/test/fuzz/tx_pool.cpp | 7 +++--- src/test/fuzz/utxo_total_supply.cpp | 8 +++---- src/test/miner_tests.cpp | 28 ++++++++++++++++-------- src/test/peerman_tests.cpp | 9 +++++--- src/test/testnet4_miner_tests.cpp | 7 +++--- src/test/util/mining.cpp | 27 ++++++++--------------- src/test/util/mining.h | 5 ++--- src/test/util/setup_common.cpp | 26 +++++++++++----------- src/test/util/setup_common.h | 13 ++--------- src/test/validation_block_tests.cpp | 22 +++++++++++-------- src/test/validation_chainstate_tests.cpp | 4 +++- 20 files changed, 104 insertions(+), 105 deletions(-) diff --git a/src/bench/block_assemble.cpp b/src/bench/block_assemble.cpp index 297465be80f..9bc159229ee 100644 --- a/src/bench/block_assemble.cpp +++ b/src/bench/block_assemble.cpp @@ -20,7 +20,7 @@ #include #include -using node::BlockAssembler; +using node::BlockCreateOptions; static void AssembleBlock(benchmark::Bench& bench) { @@ -28,8 +28,9 @@ static void AssembleBlock(benchmark::Bench& bench) CScriptWitness witness; witness.stack.push_back(WITNESS_STACK_ELEM_OP_TRUE); - BlockAssembler::Options options; - options.coinbase_output_script = P2WSH_OP_TRUE; + BlockCreateOptions options{ + .coinbase_output_script = P2WSH_OP_TRUE, + }; // Collect some loose transactions that spend the coinbases of our mined blocks constexpr size_t NUM_BLOCKS{200}; @@ -60,12 +61,12 @@ static void BlockAssemblerAddPackageTxns(benchmark::Bench& bench) FastRandomContext det_rand{true}; auto testing_setup{MakeNoLogFileContext()}; testing_setup->PopulateMempool(det_rand, /*num_transactions=*/1000, /*submit=*/true); - BlockAssembler::Options assembler_options; - assembler_options.test_block_validity = false; - assembler_options.coinbase_output_script = P2WSH_OP_TRUE; bench.run([&] { - PrepareBlock(testing_setup->m_node, assembler_options); + PrepareBlock(testing_setup->m_node, { + .coinbase_output_script = P2WSH_OP_TRUE, + .test_block_validity = false + }); }); } diff --git a/src/bench/connectblock.cpp b/src/bench/connectblock.cpp index 434bcdcbfe2..ba2d9048770 100644 --- a/src/bench/connectblock.cpp +++ b/src/bench/connectblock.cpp @@ -39,7 +39,7 @@ CBlock CreateTestBlock( {COutPoint(coinbase_to_spend->GetHash(), 0)}, chainstate.m_chain.Height() + 1, keys, outputs, {}, {})}; const CScript coinbase_spk{GetScriptForDestination(coinbase_taproot)}; - test_setup.CreateAndProcessBlock({first_tx}, coinbase_spk, &chainstate); + test_setup.CreateAndProcessBlock({first_tx}, coinbase_spk); std::vector txs; txs.reserve(num_txs); @@ -59,7 +59,7 @@ CBlock CreateTestBlock( } // Coinbase output can use any output type as it is not spent and will not change the benchmark - return test_setup.CreateBlock(txs, coinbase_spk, chainstate); + return test_setup.CreateBlock(txs, coinbase_spk); } /* diff --git a/src/node/miner.h b/src/node/miner.h index c5d21cfc322..73003d18c31 100644 --- a/src/node/miner.h +++ b/src/node/miner.h @@ -83,8 +83,6 @@ public: // Configuration parameters for the block size size_t nBlockMaxWeight{DEFAULT_BLOCK_MAX_WEIGHT}; CFeeRate blockMinFeeRate{DEFAULT_BLOCK_MIN_TX_FEE}; - // Whether to call TestBlockValidity() at the end of CreateNewBlock(). - bool test_block_validity{true}; bool print_modified_fee{DEFAULT_PRINT_MODIFIED_FEE}; }; diff --git a/src/node/mining_types.h b/src/node/mining_types.h index 69088bb7187..4a2ef0527d3 100644 --- a/src/node/mining_types.h +++ b/src/node/mining_types.h @@ -62,6 +62,11 @@ struct BlockCreateOptions { * coinbase_max_additional_weight and coinbase_output_max_additional_sigops. */ CScript coinbase_output_script{CScript() << OP_TRUE}; + /** + * Whether to call TestBlockValidity() at the end of CreateNewBlock(). + * Should only be used for tests / benchmarks. + */ + bool test_block_validity{true}; }; struct BlockWaitOptions { diff --git a/src/test/blockfilter_index_tests.cpp b/src/test/blockfilter_index_tests.cpp index b77942f741d..a26f34112de 100644 --- a/src/test/blockfilter_index_tests.cpp +++ b/src/test/blockfilter_index_tests.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -20,9 +21,7 @@ #include #include -using node::BlockAssembler; using node::BlockManager; -using node::CBlockTemplate; BOOST_AUTO_TEST_SUITE(blockfilter_index_tests) @@ -69,10 +68,12 @@ CBlock BuildChainTestingSetup::CreateBlock(const CBlockIndex* prev, const std::vector& txns, const CScript& scriptPubKey) { - BlockAssembler::Options options; - options.coinbase_output_script = scriptPubKey; - std::unique_ptr pblocktemplate = BlockAssembler{m_node.chainman->ActiveChainstate(), m_node.mempool.get(), options}.CreateNewBlock(); - CBlock& block = pblocktemplate->block; + auto mining{interfaces::MakeMining(m_node)}; + auto block_template{mining->createNewBlock({ + .coinbase_output_script = scriptPubKey, + }, /*cooldown=*/false)}; + BOOST_REQUIRE(block_template); + CBlock block{block_template->getBlock()}; block.hashPrevBlock = prev->GetBlockHash(); block.nTime = prev->nTime + 1; diff --git a/src/test/coinstatsindex_tests.cpp b/src/test/coinstatsindex_tests.cpp index f7f97c9b371..e4755ed6271 100644 --- a/src/test/coinstatsindex_tests.cpp +++ b/src/test/coinstatsindex_tests.cpp @@ -83,7 +83,7 @@ BOOST_FIXTURE_TEST_CASE(coinstatsindex_unclean_shutdown, TestChain100Setup) CBlockIndex* new_block_index = nullptr; { const CScript script_pub_key{CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG}; - const CBlock block = this->CreateBlock({}, script_pub_key, chainstate); + const CBlock block = this->CreateBlock({}, script_pub_key); new_block = std::make_shared(block); diff --git a/src/test/fuzz/package_eval.cpp b/src/test/fuzz/package_eval.cpp index 1cc2caa396e..c87a36517f6 100644 --- a/src/test/fuzz/package_eval.cpp +++ b/src/test/fuzz/package_eval.cpp @@ -21,7 +21,6 @@ #include #include -using node::BlockAssembler; using node::NodeContext; namespace { @@ -44,11 +43,10 @@ void initialize_tx_pool() g_setup = testing_setup.get(); SetMockTime(WITH_LOCK(g_setup->m_node.chainman->GetMutex(), return g_setup->m_node.chainman->ActiveTip()->Time())); - BlockAssembler::Options options; - options.coinbase_output_script = P2WSH_EMPTY; - for (int i = 0; i < 2 * COINBASE_MATURITY; ++i) { - COutPoint prevout{MineBlock(g_setup->m_node, options)}; + COutPoint prevout{MineBlock(g_setup->m_node, { + .coinbase_output_script = P2WSH_EMPTY, + })}; if (i < COINBASE_MATURITY) { // Remember the txids to avoid expensive disk access later on g_outpoints_coinbase_init_mature.push_back(prevout); diff --git a/src/test/fuzz/process_message.cpp b/src/test/fuzz/process_message.cpp index d8a91d7f90a..dd95a5fc0fd 100644 --- a/src/test/fuzz/process_message.cpp +++ b/src/test/fuzz/process_message.cpp @@ -42,7 +42,7 @@ void ResetChainman(TestingSetup& setup) setup.m_make_chainman(); setup.LoadVerifyActivateChainstate(); for (int i = 0; i < 2 * COINBASE_MATURITY; i++) { - node::BlockAssembler::Options options; + node::BlockCreateOptions options; MineBlock(setup.m_node, options); } } diff --git a/src/test/fuzz/process_messages.cpp b/src/test/fuzz/process_messages.cpp index 314388fac07..d3a3ccb6fc3 100644 --- a/src/test/fuzz/process_messages.cpp +++ b/src/test/fuzz/process_messages.cpp @@ -36,7 +36,7 @@ void ResetChainman(TestingSetup& setup) setup.m_node.chainman.reset(); setup.m_make_chainman(); setup.LoadVerifyActivateChainstate(); - node::BlockAssembler::Options options; + node::BlockCreateOptions options; for (int i = 0; i < 2 * COINBASE_MATURITY; i++) { MineBlock(setup.m_node, options); } diff --git a/src/test/fuzz/tx_pool.cpp b/src/test/fuzz/tx_pool.cpp index f70dd710b35..7daed7237ec 100644 --- a/src/test/fuzz/tx_pool.cpp +++ b/src/test/fuzz/tx_pool.cpp @@ -46,11 +46,10 @@ void initialize_tx_pool() g_setup = testing_setup.get(); SetMockTime(WITH_LOCK(g_setup->m_node.chainman->GetMutex(), return g_setup->m_node.chainman->ActiveTip()->Time())); - BlockAssembler::Options options; - options.coinbase_output_script = P2WSH_OP_TRUE; - for (int i = 0; i < 2 * COINBASE_MATURITY; ++i) { - COutPoint prevout{MineBlock(g_setup->m_node, options)}; + COutPoint prevout{MineBlock(g_setup->m_node, { + .coinbase_output_script = P2WSH_OP_TRUE, + })}; // Remember the txids to avoid expensive disk access later on auto& outpoints = i < COINBASE_MATURITY ? g_outpoints_coinbase_init_mature : diff --git a/src/test/fuzz/utxo_total_supply.cpp b/src/test/fuzz/utxo_total_supply.cpp index b281f20028e..9e227234e35 100644 --- a/src/test/fuzz/utxo_total_supply.cpp +++ b/src/test/fuzz/utxo_total_supply.cpp @@ -19,8 +19,6 @@ #include #include -using node::BlockAssembler; - FUZZ_TARGET(utxo_total_supply) { SeedRandomStateForTest(SeedRand::ZEROS); @@ -44,11 +42,11 @@ FUZZ_TARGET(utxo_total_supply) LOCK(chainman.GetMutex()); return chainman.ActiveHeight(); }; - BlockAssembler::Options options; - options.coinbase_output_script = CScript() << OP_FALSE; const auto PrepareNextBlock = [&]() { // Use OP_FALSE to avoid BIP30 check from hitting early - auto block = PrepareBlock(node, options); + auto block = PrepareBlock(node, { + .coinbase_output_script = CScript() << OP_FALSE, + }); // Replace OP_FALSE with OP_TRUE { CMutableTransaction tx{*block->vtx.back()}; diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp index 124ef08500c..5b5b6c3aded 100644 --- a/src/test/miner_tests.cpp +++ b/src/test/miner_tests.cpp @@ -37,6 +37,7 @@ using namespace util::hex_literals; using interfaces::BlockTemplate; using interfaces::Mining; using node::BlockAssembler; +using node::BlockCreateOptions; namespace miner_tests { struct MinerTestingSetup : public TestingSetup { @@ -115,8 +116,9 @@ void MinerTestingSetup::TestPackageSelection(const CScript& scriptPubKey, const { CTxMemPool& tx_mempool{MakeMempool()}; auto mining{MakeMining()}; - BlockAssembler::Options options; - options.coinbase_output_script = scriptPubKey; + BlockCreateOptions options{ + .coinbase_output_script = scriptPubKey, + }; LOCK(tx_mempool.cs); BOOST_CHECK(tx_mempool.size() == 0); @@ -175,7 +177,12 @@ void MinerTestingSetup::TestPackageSelection(const CScript& scriptPubKey, const BOOST_CHECK(block.vtx[3]->GetHash() == hashMediumFeeTx); // Test the inclusion of package feerates in the block template and ensure they are sequential. - const auto block_package_feerates = BlockAssembler{m_node.chainman->ActiveChainstate(), &tx_mempool, options}.CreateNewBlock()->m_package_feerates; + // Can't use the Mining interface because it needs access to m_package_feerates. + const auto block_package_feerates = BlockAssembler{ + m_node.chainman->ActiveChainstate(), + &tx_mempool, + {} + }.CreateNewBlock()->m_package_feerates; BOOST_CHECK(block_package_feerates.size() == 2); // parent_tx and high_fee_tx are added to the block as a package. @@ -333,8 +340,9 @@ void MinerTestingSetup::TestBasicMining(const CScript& scriptPubKey, const std:: auto mining{MakeMining()}; BOOST_REQUIRE(mining); - BlockAssembler::Options options; - options.coinbase_output_script = scriptPubKey; + BlockCreateOptions options{ + .coinbase_output_script = scriptPubKey, + }; { CTxMemPool& tx_mempool{MakeMempool()}; @@ -659,8 +667,9 @@ void MinerTestingSetup::TestPrioritisedMining(const CScript& scriptPubKey, const auto mining{MakeMining()}; BOOST_REQUIRE(mining); - BlockAssembler::Options options; - options.coinbase_output_script = scriptPubKey; + BlockCreateOptions options{ + .coinbase_output_script = scriptPubKey, + }; CTxMemPool& tx_mempool{MakeMempool()}; LOCK(tx_mempool.cs); @@ -748,8 +757,9 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity) // Note that by default, these tests run with size accounting enabled. CScript scriptPubKey = CScript() << "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f"_hex << OP_CHECKSIG; - BlockAssembler::Options options; - options.coinbase_output_script = scriptPubKey; + BlockCreateOptions options{ + .coinbase_output_script = scriptPubKey, + }; // Create and check a simple template std::unique_ptr block_template = mining->createNewBlock(options, /*cooldown=*/false); diff --git a/src/test/peerman_tests.cpp b/src/test/peerman_tests.cpp index 36a66b14eb5..1681b8760e4 100644 --- a/src/test/peerman_tests.cpp +++ b/src/test/peerman_tests.cpp @@ -3,6 +3,7 @@ // file COPYING or https://www.opensource.org/licenses/mit-license.php. #include +#include #include #include #include @@ -16,12 +17,14 @@ BOOST_FIXTURE_TEST_SUITE(peerman_tests, RegTestingSetup) /** Window, in blocks, for connecting to NODE_NETWORK_LIMITED peers */ static constexpr int64_t NODE_NETWORK_LIMITED_ALLOW_CONN_BLOCKS = 144; -static void mineBlock(const node::NodeContext& node, std::chrono::seconds block_time) +static void mineBlock(node::NodeContext& node, std::chrono::seconds block_time) { auto curr_time = GetTime(); - node::BlockAssembler::Options options; SetMockTime(block_time); // update time so the block is created with it - CBlock block = node::BlockAssembler{node.chainman->ActiveChainstate(), nullptr, options}.CreateNewBlock()->block; + auto mining{interfaces::MakeMining(node)}; + auto block_template{mining->createNewBlock({}, /*cooldown=*/false)}; + BOOST_REQUIRE(block_template); + CBlock block{block_template->getBlock()}; while (!CheckProofOfWork(block.GetHash(), block.nBits, node.chainman->GetConsensus())) ++block.nNonce; block.fChecked = true; // little speedup SetMockTime(curr_time); // process block at current time diff --git a/src/test/testnet4_miner_tests.cpp b/src/test/testnet4_miner_tests.cpp index c501b4eb086..c5b144d44ae 100644 --- a/src/test/testnet4_miner_tests.cpp +++ b/src/test/testnet4_miner_tests.cpp @@ -15,7 +15,6 @@ using interfaces::BlockTemplate; using interfaces::Mining; -using node::BlockAssembler; using node::BlockWaitOptions; namespace testnet4_miner_tests { @@ -35,18 +34,18 @@ BOOST_AUTO_TEST_CASE(MiningInterface) auto mining{MakeMining()}; BOOST_REQUIRE(mining); - BlockAssembler::Options options; std::unique_ptr block_template; // Set node time a few minutes past the testnet4 genesis block const auto template_time{3min + WITH_LOCK(cs_main, return m_node.chainman->ActiveChain().Tip()->Time())}; NodeClockContext clock_ctx{template_time}; - block_template = mining->createNewBlock(options, /*cooldown=*/false); + block_template = mining->createNewBlock({}, /*cooldown=*/false); BOOST_REQUIRE(block_template); // The template should use the mocked system time - BOOST_REQUIRE_EQUAL(block_template->getBlockHeader().Time(), template_time); + BOOST_REQUIRE_EQUAL(TicksSinceEpoch(block_template->getBlockHeader().Time()), + TicksSinceEpoch(template_time)); const BlockWaitOptions wait_options{.timeout = MillisecondsDouble{0}, .fee_threshold = 1}; diff --git a/src/test/util/mining.cpp b/src/test/util/mining.cpp index 05f1be77ee2..6191f91b8f1 100644 --- a/src/test/util/mining.cpp +++ b/src/test/util/mining.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -20,17 +21,15 @@ #include #include -using node::BlockAssembler; using node::NodeContext; COutPoint generatetoaddress(const NodeContext& node, const std::string& address) { const auto dest = DecodeDestination(address); assert(IsValidDestination(dest)); - BlockAssembler::Options assembler_options; - assembler_options.coinbase_output_script = GetScriptForDestination(dest); - - return MineBlock(node, assembler_options); + return MineBlock(node, { + .coinbase_output_script = GetScriptForDestination(dest), + }); } std::vector> CreateBlockChain(size_t total_height, const CChainParams& params) @@ -68,7 +67,7 @@ std::vector> CreateBlockChain(size_t total_height, const return ret; } -COutPoint MineBlock(const NodeContext& node, const node::BlockAssembler::Options& assembler_options) +COutPoint MineBlock(const NodeContext& node, const node::BlockCreateOptions& assembler_options) { auto block = PrepareBlock(node, assembler_options); auto valid = MineBlock(node, block); @@ -122,12 +121,11 @@ COutPoint ProcessBlock(const NodeContext& node, const std::shared_ptr& b } std::shared_ptr PrepareBlock(const NodeContext& node, - const BlockAssembler::Options& assembler_options) + const node::BlockCreateOptions& assembler_options) { - auto block = std::make_shared( - BlockAssembler{Assert(node.chainman)->ActiveChainstate(), Assert(node.mempool.get()), assembler_options} - .CreateNewBlock() - ->block); + auto mining = interfaces::MakeMining(node); + auto block_template = mining->createNewBlock(assembler_options, /*cooldown=*/false); + auto block = std::make_shared(Assert(block_template)->getBlock()); LOCK(cs_main); block->nTime = Assert(node.chainman)->ActiveChain().Tip()->GetMedianTimePast() + 1; @@ -135,10 +133,3 @@ std::shared_ptr PrepareBlock(const NodeContext& node, return block; } -std::shared_ptr PrepareBlock(const NodeContext& node, const CScript& coinbase_scriptPubKey) -{ - BlockAssembler::Options assembler_options; - assembler_options.coinbase_output_script = coinbase_scriptPubKey; - ApplyArgsManOptions(*node.args, assembler_options); - return PrepareBlock(node, assembler_options); -} diff --git a/src/test/util/mining.h b/src/test/util/mining.h index 2bd539379b8..e15b8a0bada 100644 --- a/src/test/util/mining.h +++ b/src/test/util/mining.h @@ -24,7 +24,7 @@ std::vector> CreateBlockChain(size_t total_height, const /** Returns the generated coin */ COutPoint MineBlock(const node::NodeContext&, - const node::BlockAssembler::Options& assembler_options); + const node::BlockCreateOptions& assembler_options); /** * Returns the generated coin (or Null if the block was invalid). @@ -38,9 +38,8 @@ COutPoint MineBlock(const node::NodeContext&, std::shared_ptr& block); COutPoint ProcessBlock(const node::NodeContext&, const std::shared_ptr& block); /** Prepare a block to be mined */ -std::shared_ptr PrepareBlock(const node::NodeContext&); std::shared_ptr PrepareBlock(const node::NodeContext& node, - const node::BlockAssembler::Options& assembler_options); + const node::BlockCreateOptions& assembler_options); /** RPC-like helper function, returns the generated coin */ COutPoint generatetoaddress(const node::NodeContext&, const std::string& address); diff --git a/src/test/util/setup_common.cpp b/src/test/util/setup_common.cpp index 8f2f70a3576..09b6c9c7ddc 100644 --- a/src/test/util/setup_common.cpp +++ b/src/test/util/setup_common.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -67,7 +68,6 @@ using namespace util::hex_literals; using node::ApplyArgsManOptions; -using node::BlockAssembler; using node::BlockManager; using node::KernelNotifications; using node::LoadChainstate; @@ -335,6 +335,8 @@ void ChainTestingSetup::LoadVerifyActivateChainstate() std::tie(status, error) = VerifyLoadedChainstate(chainman, options); assert(status == node::ChainstateLoadStatus::SUCCESS); + m_node.notifications->setChainstateLoaded(true); + BlockValidationState state; if (!chainman.ActiveChainstate().ActivateBestChain(state)) { throw std::runtime_error(strprintf("ActivateBestChain failed. (%s)", state.ToString())); @@ -411,12 +413,15 @@ void TestChain100Setup::mineBlocks(int num_blocks) CBlock TestChain100Setup::CreateBlock( const std::vector& txns, - const CScript& scriptPubKey, - Chainstate& chainstate) + const CScript& scriptPubKey) { - BlockAssembler::Options options; - options.coinbase_output_script = scriptPubKey; - CBlock block = BlockAssembler{chainstate, nullptr, options}.CreateNewBlock()->block; + auto mining{interfaces::MakeMining(m_node)}; + auto block_template{mining->createNewBlock({ + .use_mempool = false, + .coinbase_output_script = scriptPubKey, + }, /*cooldown=*/false)}; + Assert(block_template); + CBlock block{block_template->getBlock()}; Assert(block.vtx.size() == 1); for (const CMutableTransaction& tx : txns) { @@ -431,14 +436,9 @@ CBlock TestChain100Setup::CreateBlock( CBlock TestChain100Setup::CreateAndProcessBlock( const std::vector& txns, - const CScript& scriptPubKey, - Chainstate* chainstate) + const CScript& scriptPubKey) { - if (!chainstate) { - chainstate = &Assert(m_node.chainman)->ActiveChainstate(); - } - - CBlock block = this->CreateBlock(txns, scriptPubKey, *chainstate); + CBlock block = this->CreateBlock(txns, scriptPubKey); std::shared_ptr shared_pblock = std::make_shared(block); Assert(m_node.chainman)->ProcessNewBlock(shared_pblock, true, true, nullptr); diff --git a/src/test/util/setup_common.h b/src/test/util/setup_common.h index 8b1b0632185..6ab63ec9322 100644 --- a/src/test/util/setup_common.h +++ b/src/test/util/setup_common.h @@ -28,12 +28,7 @@ #include #include -class arith_uint256; class CFeeRate; -class Chainstate; -class FastRandomContext; -class uint160; -class uint256; /** Retrieve the command line arguments. */ extern const std::function()> G_TEST_COMMAND_LINE_ARGUMENTS; @@ -134,7 +129,6 @@ struct Testnet4Setup : public TestingSetup { }; class CBlock; -struct CMutableTransaction; class CScript; /** @@ -148,11 +142,9 @@ struct TestChain100Setup : public TestingSetup { /** * Create a new block with just given transactions, coinbase paying to * scriptPubKey, and try to add it to the current chain. - * If no chainstate is specified, default to the active. */ CBlock CreateAndProcessBlock(const std::vector& txns, - const CScript& scriptPubKey, - Chainstate* chainstate = nullptr); + const CScript& scriptPubKey); /** * Create a new block with just given transactions, coinbase paying to @@ -160,8 +152,7 @@ struct TestChain100Setup : public TestingSetup { */ CBlock CreateBlock( const std::vector& txns, - const CScript& scriptPubKey, - Chainstate& chainstate); + const CScript& scriptPubKey); //! Mine a series of new blocks on the active chain. void mineBlocks(int num_blocks); diff --git a/src/test/validation_block_tests.cpp b/src/test/validation_block_tests.cpp index e1f90477fc4..2d3d5d65c20 100644 --- a/src/test/validation_block_tests.cpp +++ b/src/test/validation_block_tests.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -21,7 +22,6 @@ #include using kernel::ChainstateRole; -using node::BlockAssembler; namespace validation_block_tests { struct MinerTestingSetup : public RegTestingSetup { @@ -67,10 +67,12 @@ std::shared_ptr MinerTestingSetup::Block(const uint256& prev_hash) static int i = 0; static uint64_t time = Params().GenesisBlock().nTime; - BlockAssembler::Options options; - options.coinbase_output_script = CScript{} << i++ << OP_TRUE; - auto ptemplate = BlockAssembler{m_node.chainman->ActiveChainstate(), m_node.mempool.get(), options}.CreateNewBlock(); - auto pblock = std::make_shared(ptemplate->block); + auto mining{interfaces::MakeMining(m_node)}; + auto block_template{mining->createNewBlock({ + .coinbase_output_script = CScript{} << i++ << OP_TRUE, + }, /*cooldown=*/false)}; + BOOST_REQUIRE(block_template); + auto pblock = std::make_shared(block_template->getBlock()); pblock->hashPrevBlock = prev_hash; pblock->nTime = ++time; @@ -335,10 +337,12 @@ BOOST_AUTO_TEST_CASE(witness_commitment_index) LOCK(Assert(m_node.chainman)->GetMutex()); CScript pubKey; pubKey << 1 << OP_TRUE; - BlockAssembler::Options options; - options.coinbase_output_script = pubKey; - auto ptemplate = BlockAssembler{m_node.chainman->ActiveChainstate(), m_node.mempool.get(), options}.CreateNewBlock(); - CBlock pblock = ptemplate->block; + auto mining{interfaces::MakeMining(m_node)}; + auto block_template{mining->createNewBlock({ + .coinbase_output_script = pubKey, + }, /*cooldown=*/false)}; + BOOST_REQUIRE(block_template); + CBlock pblock{block_template->getBlock()}; CTxOut witness; witness.scriptPubKey.resize(MINIMUM_WITNESS_COMMITMENT); diff --git a/src/test/validation_chainstate_tests.cpp b/src/test/validation_chainstate_tests.cpp index 38a04d8e46c..4d7c8334a2d 100644 --- a/src/test/validation_chainstate_tests.cpp +++ b/src/test/validation_chainstate_tests.cpp @@ -24,6 +24,8 @@ #include +class CTxMemPool; + BOOST_FIXTURE_TEST_SUITE(validation_chainstate_tests, ChainTestingSetup) //! Test resizing coins-related Chainstate caches during runtime. @@ -83,7 +85,7 @@ BOOST_FIXTURE_TEST_CASE(connect_tip_does_not_cache_inputs_on_failed_connect, Tes tx.vout.emplace_back(MAX_MONEY, CScript{} << OP_TRUE); const auto tip{WITH_LOCK(cs_main, return chainstate.m_chain.Tip()->GetBlockHash())}; - const CBlock block{CreateBlock({tx}, CScript{} << OP_TRUE, chainstate)}; + const CBlock block{CreateBlock({tx}, CScript{} << OP_TRUE)}; BOOST_CHECK(Assert(m_node.chainman)->ProcessNewBlock(std::make_shared(block), true, true, nullptr)); LOCK(cs_main);