/ src / bench / index_blockfilter.cpp
index_blockfilter.cpp
 1  // Copyright (c) 2023-present The Bitcoin Core developers
 2  // Distributed under the MIT software license, see the accompanying
 3  // file COPYING or https://www.opensource.org/licenses/mit-license.php.
 4  
 5  #include <addresstype.h>
 6  #include <bench/bench.h>
 7  #include <blockfilter.h>
 8  #include <chain.h>
 9  #include <index/base.h>
10  #include <index/blockfilterindex.h>
11  #include <interfaces/chain.h>
12  #include <primitives/block.h>
13  #include <primitives/transaction.h>
14  #include <pubkey.h>
15  #include <script/script.h>
16  #include <span.h>
17  #include <sync.h>
18  #include <test/util/setup_common.h>
19  #include <uint256.h>
20  #include <util/strencodings.h>
21  #include <util/time.h>
22  #include <validation.h>
23  
24  #include <cassert>
25  #include <memory>
26  #include <vector>
27  
28  using namespace util::hex_literals;
29  
30  // Very simple block filter index sync benchmark, only using coinbase outputs.
31  static void BlockFilterIndexSync(benchmark::Bench& bench)
32  {
33      const auto test_setup = MakeNoLogFileContext<TestChain100Setup>();
34  
35      // Create more blocks
36      int CHAIN_SIZE = 600;
37      CPubKey pubkey{"02ed26169896db86ced4cbb7b3ecef9859b5952825adbeab998fb5b307e54949c9"_hex_u8};
38      CScript script = GetScriptForDestination(WitnessV0KeyHash(pubkey));
39      std::vector<CMutableTransaction> noTxns;
40      for (int i = 0; i < CHAIN_SIZE - 100; i++) {
41          test_setup->CreateAndProcessBlock(noTxns, script);
42          SetMockTime(GetTime() + 1);
43      }
44      assert(WITH_LOCK(::cs_main, return test_setup->m_node.chainman->ActiveHeight() == CHAIN_SIZE));
45  
46      bench.minEpochIterations(5).run([&] {
47          BlockFilterIndex filter_index(interfaces::MakeChain(test_setup->m_node), BlockFilterType::BASIC,
48                                        /*n_cache_size=*/0, /*f_memory=*/false, /*f_wipe=*/true);
49          assert(filter_index.Init());
50          assert(!filter_index.BlockUntilSyncedToCurrentChain());
51          filter_index.Sync();
52  
53          IndexSummary summary = filter_index.GetSummary();
54          assert(summary.synced);
55          assert(summary.best_block_hash == WITH_LOCK(::cs_main, return test_setup->m_node.chainman->ActiveTip()->GetBlockHash()));
56  
57          // Shutdown sequence (c.f. Shutdown() in init.cpp)
58          filter_index.Stop();
59      });
60  }
61  
62  BENCHMARK(BlockFilterIndexSync);