block_assemble.cpp raw
1 // Copyright (c) 2011-present The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #include <bench/bench.h>
6 #include <consensus/consensus.h>
7 #include <node/mining_types.h>
8 #include <primitives/transaction.h>
9 #include <random.h>
10 #include <script/script.h>
11 #include <sync.h>
12 #include <test/util/mining.h>
13 #include <test/util/script.h>
14 #include <test/util/setup_common.h>
15 #include <util/check.h>
16 #include <validation.h>
17
18 #include <array>
19 #include <cstddef>
20 #include <memory>
21 #include <vector>
22
23 using node::BlockCreateOptions;
24
25 static void AssembleBlock(benchmark::Bench& bench)
26 {
27 const auto test_setup = MakeNoLogFileContext<const TestingSetup>();
28
29 CScriptWitness witness;
30 witness.stack.push_back(WITNESS_STACK_ELEM_OP_TRUE);
31 BlockCreateOptions options{
32 .coinbase_output_script = P2WSH_OP_TRUE,
33 };
34
35 // Collect some loose transactions that spend the coinbases of our mined blocks
36 constexpr size_t NUM_BLOCKS{200};
37 std::array<CTransactionRef, NUM_BLOCKS - COINBASE_MATURITY + 1> txs;
38 for (size_t b{0}; b < NUM_BLOCKS; ++b) {
39 CMutableTransaction tx;
40 tx.vin.emplace_back(MineBlock(test_setup->m_node, options));
41 tx.vin.back().scriptWitness = witness;
42 tx.vout.emplace_back(1337, P2WSH_OP_TRUE);
43 if (NUM_BLOCKS - b >= COINBASE_MATURITY)
44 txs.at(b) = MakeTransactionRef(tx);
45 }
46 {
47 LOCK(::cs_main);
48
49 for (const auto& txr : txs) {
50 const MempoolAcceptResult res = test_setup->m_node.chainman->ProcessTransaction(txr);
51 assert(res.m_result_type == MempoolAcceptResult::ResultType::VALID);
52 }
53 }
54
55 bench.run([&] {
56 PrepareBlock(test_setup->m_node, options);
57 });
58 }
59 static void BlockAssemblerAddPackageTxns(benchmark::Bench& bench)
60 {
61 FastRandomContext det_rand{true};
62 auto testing_setup{MakeNoLogFileContext<TestChain100Setup>()};
63 testing_setup->PopulateMempool(det_rand, /*num_transactions=*/1000, /*submit=*/true);
64
65 bench.run([&] {
66 PrepareBlock(testing_setup->m_node, {
67 .coinbase_output_script = P2WSH_OP_TRUE,
68 .test_block_validity = false
69 });
70 });
71 }
72
73 BENCHMARK(AssembleBlock);
74 BENCHMARK(BlockAssemblerAddPackageTxns);
75