mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-02-02 11:41:18 +00:00
7379a54ec416c8c0a029cc41835a23d42cb6d800 bench: Remove incorrect LoadWallet call in WalletBalance (Andrew Chow)
846b2fe67ed76a678770d343153acedadfdacd0b tests: Move ADDRESS_BCRT1_UNSPENDABLE to wallet/test/util.h (Andrew Chow)
c61d3f02f5122b38ea8bf0029aa9dfbbf38e10d0 tests, bench: Consolidate {Test,Bench}Un/LoadWallet helper (Andrew Chow)
Pull request description:
I have a few PRs and branches that use these two commits, probably makes sense to split them into a separate PR to be merged sooner.
The first commit contains some things that end up being commonly used in new wallet benchmarks. These are moved into `wallet_common.{h/cpp}`.
The second commit contains a bugfix for the wallet_balance benchmark where it calls `LoadWallet` in the wrong place. It's unnecessary to call that function in this benchmark. Although this does not cause any issues currently, it ends up causing issues in some PRs and branches that I'm working on.
ACKs for top commit:
Sjors:
utACK 7379a54ec416c8c0a029cc41835a23d42cb6d800
furszy:
ACK 7379a54
Tree-SHA512: 47773887a16c69ac7121c699d3446a8c399bd792a6a31714998b7b7a19fea179c6d3b29cb898b04397b2962c1b4120d57009352b8460b8283e188d4cb480c9ba
63 lines
2.7 KiB
C++
63 lines
2.7 KiB
C++
// Copyright (c) 2012-2022 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <bench/bench.h>
|
|
#include <interfaces/chain.h>
|
|
#include <node/chainstate.h>
|
|
#include <node/context.h>
|
|
#include <test/util/mining.h>
|
|
#include <test/util/setup_common.h>
|
|
#include <wallet/test/util.h>
|
|
#include <validationinterface.h>
|
|
#include <wallet/receive.h>
|
|
#include <wallet/wallet.h>
|
|
|
|
#include <optional>
|
|
|
|
namespace wallet {
|
|
static void WalletBalance(benchmark::Bench& bench, const bool set_dirty, const bool add_mine)
|
|
{
|
|
const auto test_setup = MakeNoLogFileContext<const TestingSetup>();
|
|
|
|
const auto& ADDRESS_WATCHONLY = ADDRESS_BCRT1_UNSPENDABLE;
|
|
|
|
// Set clock to genesis block, so the descriptors/keys creation time don't interfere with the blocks scanning process.
|
|
// The reason is 'generatetoaddress', which creates a chain with deterministic timestamps in the past.
|
|
SetMockTime(test_setup->m_node.chainman->GetParams().GenesisBlock().nTime);
|
|
CWallet wallet{test_setup->m_node.chain.get(), "", CreateMockableWalletDatabase()};
|
|
{
|
|
LOCK(wallet.cs_wallet);
|
|
wallet.SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
|
|
wallet.SetupDescriptorScriptPubKeyMans();
|
|
}
|
|
auto handler = test_setup->m_node.chain->handleNotifications({&wallet, [](CWallet*) {}});
|
|
|
|
const std::optional<std::string> address_mine{add_mine ? std::optional<std::string>{getnewaddress(wallet)} : std::nullopt};
|
|
|
|
for (int i = 0; i < 100; ++i) {
|
|
generatetoaddress(test_setup->m_node, address_mine.value_or(ADDRESS_WATCHONLY));
|
|
generatetoaddress(test_setup->m_node, ADDRESS_WATCHONLY);
|
|
}
|
|
SyncWithValidationInterfaceQueue();
|
|
|
|
auto bal = GetBalance(wallet); // Cache
|
|
|
|
bench.run([&] {
|
|
if (set_dirty) wallet.MarkDirty();
|
|
bal = GetBalance(wallet);
|
|
if (add_mine) assert(bal.m_mine_trusted > 0);
|
|
});
|
|
}
|
|
|
|
static void WalletBalanceDirty(benchmark::Bench& bench) { WalletBalance(bench, /*set_dirty=*/true, /*add_mine=*/true); }
|
|
static void WalletBalanceClean(benchmark::Bench& bench) { WalletBalance(bench, /*set_dirty=*/false, /*add_mine=*/true); }
|
|
static void WalletBalanceMine(benchmark::Bench& bench) { WalletBalance(bench, /*set_dirty=*/false, /*add_mine=*/true); }
|
|
static void WalletBalanceWatch(benchmark::Bench& bench) { WalletBalance(bench, /*set_dirty=*/false, /*add_mine=*/false); }
|
|
|
|
BENCHMARK(WalletBalanceDirty, benchmark::PriorityLevel::HIGH);
|
|
BENCHMARK(WalletBalanceClean, benchmark::PriorityLevel::HIGH);
|
|
BENCHMARK(WalletBalanceMine, benchmark::PriorityLevel::HIGH);
|
|
BENCHMARK(WalletBalanceWatch, benchmark::PriorityLevel::HIGH);
|
|
} // namespace wallet
|