wallet_create.cpp raw
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 <bench/bench.h>
6 #include <random.h>
7 #include <test/util/setup_common.h>
8 #include <uint256.h>
9 #include <util/check.h>
10 #include <util/fs.h>
11 #include <util/translation.h>
12 #include <wallet/context.h>
13 #include <wallet/db.h>
14 #include <wallet/wallet.h>
15 #include <wallet/walletutil.h>
16
17 #include <memory>
18 #include <optional>
19 #include <string>
20 #include <utility>
21 #include <vector>
22
23 namespace wallet {
24 static void WalletCreate(benchmark::Bench& bench, bool encrypted)
25 {
26 auto test_setup = MakeNoLogFileContext<TestingSetup>();
27 FastRandomContext random;
28
29 WalletContext context;
30 context.args = &test_setup->m_args;
31 context.chain = test_setup->m_node.chain.get();
32
33 DatabaseOptions options;
34 options.require_format = DatabaseFormat::SQLITE;
35 options.require_create = true;
36 options.create_flags = WALLET_FLAG_DESCRIPTORS;
37
38 if (encrypted) {
39 options.create_passphrase = random.rand256().ToString();
40 }
41
42 DatabaseStatus status;
43 bilingual_str error_string;
44 std::vector<bilingual_str> warnings;
45
46 const auto wallet_path = test_setup->m_path_root / "test_wallet";
47 const auto wallet_name = fs::PathToString(wallet_path);
48
49 std::shared_ptr<CWallet> wallet;
50 auto cleanup{[&] {
51 if (!wallet) return;
52 // Release wallet
53 RemoveWallet(context, wallet, /*load_on_start=*/std::nullopt);
54 WaitForDeleteWallet(std::move(wallet));
55 fs::remove(wallet_path / "wallet.dat");
56 fs::remove(wallet_path);
57 }};
58 bench.setup(cleanup).run([&] {
59 wallet = CreateWallet(context, wallet_name, /*load_on_start=*/std::nullopt, options, status, error_string, warnings);
60 assert(status == DatabaseStatus::SUCCESS);
61 assert(wallet != nullptr);
62 });
63 cleanup();
64 }
65
66 static void WalletCreatePlain(benchmark::Bench& bench) { WalletCreate(bench, /*encrypted=*/false); }
67 static void WalletCreateEncrypted(benchmark::Bench& bench) { WalletCreate(bench, /*encrypted=*/true); }
68
69 BENCHMARK(WalletCreatePlain);
70 BENCHMARK(WalletCreateEncrypted);
71
72 } // namespace wallet
73