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