// Copyright (c) 2011-2022 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include #include #include #include #include #include #include #include static void AssembleBlock(benchmark::Bench& bench) { const auto test_setup = MakeNoLogFileContext(); CScriptWitness witness; witness.stack.push_back(WITNESS_STACK_ELEM_OP_TRUE); // Collect some loose transactions that spend the coinbases of our mined blocks constexpr size_t NUM_BLOCKS{200}; std::array txs; for (size_t b{0}; b < NUM_BLOCKS; ++b) { CMutableTransaction tx; tx.vin.push_back(MineBlock(test_setup->m_node, P2WSH_OP_TRUE)); tx.vin.back().scriptWitness = witness; tx.vout.emplace_back(1337, P2WSH_OP_TRUE); if (NUM_BLOCKS - b >= COINBASE_MATURITY) txs.at(b) = MakeTransactionRef(tx); } { LOCK(::cs_main); for (const auto& txr : txs) { const MempoolAcceptResult res = test_setup->m_node.chainman->ProcessTransaction(txr); assert(res.m_result_type == MempoolAcceptResult::ResultType::VALID); } } bench.run([&] { PrepareBlock(test_setup->m_node, P2WSH_OP_TRUE); }); } static void BlockAssemblerAddPackageTxns(benchmark::Bench& bench) { FastRandomContext det_rand{true}; auto testing_setup{MakeNoLogFileContext()}; testing_setup->PopulateMempool(det_rand, /*num_transactions=*/1000, /*submit=*/true); node::BlockAssembler::Options assembler_options; assembler_options.test_block_validity = false; bench.run([&] { PrepareBlock(testing_setup->m_node, P2WSH_OP_TRUE, assembler_options); }); } BENCHMARK(AssembleBlock, benchmark::PriorityLevel::HIGH); BENCHMARK(BlockAssemblerAddPackageTxns, benchmark::PriorityLevel::LOW);