/ src / bench / wallet_loading.cpp
wallet_loading.cpp
 1  // Copyright (c) 2022 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 <addresstype.h>
 6  #include <bench/bench.h>
 7  #include <consensus/amount.h>
 8  #include <outputtype.h>
 9  #include <primitives/transaction.h>
10  #include <test/util/setup_common.h>
11  #include <util/check.h>
12  #include <wallet/context.h>
13  #include <wallet/db.h>
14  #include <wallet/test/util.h>
15  #include <wallet/transaction.h>
16  #include <wallet/wallet.h>
17  #include <wallet/walletutil.h>
18  
19  #include <cstdint>
20  #include <memory>
21  #include <utility>
22  #include <vector>
23  
24  namespace wallet{
25  static void AddTx(CWallet& wallet)
26  {
27      CMutableTransaction mtx;
28      mtx.vout.emplace_back(COIN, GetScriptForDestination(*Assert(wallet.GetNewDestination(OutputType::BECH32, ""))));
29      mtx.vin.emplace_back();
30  
31      wallet.AddToWallet(MakeTransactionRef(mtx), TxStateInactive{});
32  }
33  
34  static void WalletLoadingDescriptors(benchmark::Bench& bench)
35  {
36      const auto test_setup = MakeNoLogFileContext<TestingSetup>();
37  
38      WalletContext context;
39      context.args = &test_setup->m_args;
40      context.chain = test_setup->m_node.chain.get();
41  
42      // Setup the wallet
43      // Loading the wallet will also create it
44      uint64_t create_flags = WALLET_FLAG_DESCRIPTORS;
45      auto database = CreateMockableWalletDatabase();
46      auto wallet = TestLoadWallet(std::move(database), context, create_flags);
47  
48      // Generate a bunch of transactions and addresses to put into the wallet
49      for (int i = 0; i < 1000; ++i) {
50          AddTx(*wallet);
51      }
52  
53      database = DuplicateMockDatabase(wallet->GetDatabase());
54  
55      // reload the wallet for the actual benchmark
56      TestUnloadWallet(std::move(wallet));
57  
58      bench.epochs(5).run([&] {
59          wallet = TestLoadWallet(std::move(database), context, create_flags);
60  
61          // Cleanup
62          database = DuplicateMockDatabase(wallet->GetDatabase());
63          TestUnloadWallet(std::move(wallet));
64      });
65  }
66  
67  BENCHMARK(WalletLoadingDescriptors, benchmark::PriorityLevel::HIGH);
68  } // namespace wallet