Bitcoin Core  29.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 <addresstype.h>
6 #include <bench/bench.h>
7 #include <bitcoin-build-config.h> // IWYU pragma: keep
8 #include <consensus/amount.h>
9 #include <outputtype.h>
10 #include <primitives/transaction.h>
11 #include <test/util/setup_common.h>
12 #include <util/check.h>
13 #include <wallet/context.h>
14 #include <wallet/db.h>
15 #include <wallet/test/util.h>
16 #include <wallet/transaction.h>
17 #include <wallet/wallet.h>
18 #include <wallet/walletutil.h>
19 
20 #include <cstdint>
21 #include <memory>
22 #include <utility>
23 #include <vector>
24 
25 namespace wallet{
26 static void AddTx(CWallet& wallet)
27 {
29  mtx.vout.emplace_back(COIN, GetScriptForDestination(*Assert(wallet.GetNewDestination(OutputType::BECH32, ""))));
30  mtx.vin.emplace_back();
31 
32  wallet.AddToWallet(MakeTransactionRef(mtx), TxStateInactive{});
33 }
34 
35 static void WalletLoading(benchmark::Bench& bench, bool legacy_wallet)
36 {
37  const auto test_setup = MakeNoLogFileContext<TestingSetup>();
38 
39  WalletContext context;
40  context.args = &test_setup->m_args;
41  context.chain = test_setup->m_node.chain.get();
42 
43  // Setup the wallet
44  // Loading the wallet will also create it
45  uint64_t create_flags = 0;
46  if (!legacy_wallet) {
47  create_flags = WALLET_FLAG_DESCRIPTORS;
48  }
49  auto database = CreateMockableWalletDatabase();
50  auto wallet = TestLoadWallet(std::move(database), context, create_flags);
51 
52  // Generate a bunch of transactions and addresses to put into the wallet
53  for (int i = 0; i < 1000; ++i) {
54  AddTx(*wallet);
55  }
56 
57  database = DuplicateMockDatabase(wallet->GetDatabase());
58 
59  // reload the wallet for the actual benchmark
60  TestUnloadWallet(std::move(wallet));
61 
62  bench.epochs(5).run([&] {
63  wallet = TestLoadWallet(std::move(database), context, create_flags);
64 
65  // Cleanup
66  database = DuplicateMockDatabase(wallet->GetDatabase());
67  TestUnloadWallet(std::move(wallet));
68  });
69 }
70 
71 #ifdef USE_BDB
72 static void WalletLoadingLegacy(benchmark::Bench& bench) { WalletLoading(bench, /*legacy_wallet=*/true); }
73 BENCHMARK(WalletLoadingLegacy, benchmark::PriorityLevel::HIGH);
74 #endif
75 
76 #ifdef USE_SQLITE
77 static void WalletLoadingDescriptors(benchmark::Bench& bench) { WalletLoading(bench, /*legacy_wallet=*/false); }
78 BENCHMARK(WalletLoadingDescriptors, benchmark::PriorityLevel::HIGH);
79 #endif
80 } // 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:81
std::shared_ptr< CWallet > TestLoadWallet(std::unique_ptr< WalletDatabase > database, WalletContext &context, uint64_t create_flags)
Definition: util.cpp:50
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:186
void TestUnloadWallet(std::shared_ptr< CWallet > &&wallet)
Definition: util.cpp:73
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:85
static constexpr CAmount COIN
The amount of satoshis in one BTC.
Definition: amount.h:15