Bitcoin Core  28.1.0
P2P Digital Currency
wallet_loading.cpp
Go to the documentation of this file.
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 <config/bitcoin-config.h> // IWYU pragma: keep
6 
7 #include <bench/bench.h>
8 #include <interfaces/chain.h>
9 #include <node/context.h>
10 #include <test/util/mining.h>
11 #include <test/util/setup_common.h>
12 #include <wallet/test/util.h>
13 #include <util/translation.h>
14 #include <validationinterface.h>
15 #include <wallet/context.h>
16 #include <wallet/receive.h>
17 #include <wallet/wallet.h>
18 
19 #include <optional>
20 
21 namespace wallet{
22 static void AddTx(CWallet& wallet)
23 {
25  mtx.vout.emplace_back(COIN, GetScriptForDestination(*Assert(wallet.GetNewDestination(OutputType::BECH32, ""))));
26  mtx.vin.emplace_back();
27 
28  wallet.AddToWallet(MakeTransactionRef(mtx), TxStateInactive{});
29 }
30 
31 static void WalletLoading(benchmark::Bench& bench, bool legacy_wallet)
32 {
33  const auto test_setup = MakeNoLogFileContext<TestingSetup>();
34 
35  WalletContext context;
36  context.args = &test_setup->m_args;
37  context.chain = test_setup->m_node.chain.get();
38 
39  // Setup the wallet
40  // Loading the wallet will also create it
41  uint64_t create_flags = 0;
42  if (!legacy_wallet) {
43  create_flags = WALLET_FLAG_DESCRIPTORS;
44  }
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 #ifdef USE_BDB
68 static void WalletLoadingLegacy(benchmark::Bench& bench) { WalletLoading(bench, /*legacy_wallet=*/true); }
69 BENCHMARK(WalletLoadingLegacy, benchmark::PriorityLevel::HIGH);
70 #endif
71 
72 #ifdef USE_SQLITE
73 static void WalletLoadingDescriptors(benchmark::Bench& bench) { WalletLoading(bench, /*legacy_wallet=*/false); }
74 BENCHMARK(WalletLoadingDescriptors, benchmark::PriorityLevel::HIGH);
75 #endif
76 } // namespace wallet
std::vector< CTxIn > vin
Definition: transaction.h:379
static void WalletLoading(benchmark::Bench &bench, bool legacy_wallet)
State of transaction not confirmed or conflicting with a known block and not in the mempool...
Definition: transaction.h:58
BENCHMARK(WalletBalanceDirty, benchmark::PriorityLevel::HIGH)
std::unique_ptr< WalletDatabase > DuplicateMockDatabase(WalletDatabase &database)
Definition: util.cpp:80
std::shared_ptr< CWallet > TestLoadWallet(std::unique_ptr< WalletDatabase > database, WalletContext &context, uint64_t create_flags)
Definition: util.cpp:49
Bench & run(char const *benchmarkName, Op &&op)
Repeatedly calls op() based on the configuration, and performs measurements.
Definition: nanobench.h:1234
static void AddTx(CWallet &wallet)
Indicate that this wallet supports DescriptorScriptPubKeyMan.
Definition: walletutil.h:74
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
Definition: wallet.h:299
std::vector< CTxOut > vout
Definition: transaction.h:380
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
static CTransactionRef MakeTransactionRef(Tx &&txIn)
Definition: transaction.h:424
std::unique_ptr< WalletDatabase > CreateMockableWalletDatabase(MockableData records)
Definition: util.cpp:185
void TestUnloadWallet(std::shared_ptr< CWallet > &&wallet)
Definition: util.cpp:72
Bench & epochs(size_t numEpochs) noexcept
Controls number of epochs, the number of measurements to perform.
WalletContext struct containing references to state shared between CWallet instances, like the reference to the chain interface, and the list of opened wallets.
Definition: context.h:36
A mutable version of CTransaction.
Definition: transaction.h:377
Main entry point to nanobench&#39;s benchmarking facility.
Definition: nanobench.h:627
ArgsManager * args
Definition: context.h:39
#define Assert(val)
Identity function.
Definition: check.h:77
static constexpr CAmount COIN
The amount of satoshis in one BTC.
Definition: amount.h:15