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