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