mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-02-11 08:01:21 +00:00
32023 changed AddWalletDescriptor to return util::Error, but did not change all of the failure cases to do so. This may result in some callers continuing when there was actually an error. Unify all of the failure cases to use util::Error so that all callers handle AddWalletDescriptor errors in the same way. The encapsulated return type is changed from ScriptPubKeyMan* to std::reference_wrapper<DescriptorScriptPubKeyMan>. This avoids having a value that can be interpreted as a bool, and also removes the need to constantly dynamic_cast the returned value. The only kind of ScriptPubKeyMan that can come out of AddWalletDescriptor is a DescriptorScriptPubKeyMan anyways.
73 lines
2.6 KiB
C++
73 lines
2.6 KiB
C++
// Copyright (c) 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 <addresstype.h>
|
|
#include <bench/bench.h>
|
|
#include <key.h>
|
|
#include <key_io.h>
|
|
#include <script/descriptor.h>
|
|
#include <script/script.h>
|
|
#include <script/signingprovider.h>
|
|
#include <sync.h>
|
|
#include <test/util/setup_common.h>
|
|
#include <wallet/context.h>
|
|
#include <wallet/db.h>
|
|
#include <wallet/test/util.h>
|
|
#include <wallet/types.h>
|
|
#include <wallet/wallet.h>
|
|
#include <wallet/walletutil.h>
|
|
|
|
#include <cassert>
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
namespace wallet {
|
|
static void WalletIsMine(benchmark::Bench& bench, int num_combo = 0)
|
|
{
|
|
const auto test_setup = MakeNoLogFileContext<TestingSetup>();
|
|
|
|
WalletContext context;
|
|
context.args = &test_setup->m_args;
|
|
context.chain = test_setup->m_node.chain.get();
|
|
|
|
// Setup the wallet
|
|
// Loading the wallet will also create it
|
|
uint64_t create_flags = WALLET_FLAG_DESCRIPTORS;
|
|
auto database = CreateMockableWalletDatabase();
|
|
auto wallet = TestLoadWallet(std::move(database), context, create_flags);
|
|
|
|
// For a descriptor wallet, fill with num_combo combo descriptors with random keys
|
|
// This benchmarks a non-HD wallet migrated to descriptors
|
|
if (num_combo > 0) {
|
|
LOCK(wallet->cs_wallet);
|
|
for (int i = 0; i < num_combo; ++i) {
|
|
CKey key;
|
|
key.MakeNewKey(/*fCompressed=*/true);
|
|
FlatSigningProvider keys;
|
|
std::string error;
|
|
std::vector<std::unique_ptr<Descriptor>> desc = Parse("combo(" + EncodeSecret(key) + ")", keys, error, /*require_checksum=*/false);
|
|
WalletDescriptor w_desc(std::move(desc.at(0)), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/0, /*next_index=*/0);
|
|
Assert(wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", /*internal=*/false));
|
|
}
|
|
}
|
|
|
|
const CScript script = GetScriptForDestination(DecodeDestination(ADDRESS_BCRT1_UNSPENDABLE));
|
|
|
|
bench.run([&] {
|
|
LOCK(wallet->cs_wallet);
|
|
isminetype mine = wallet->IsMine(script);
|
|
assert(mine == ISMINE_NO);
|
|
});
|
|
|
|
TestUnloadWallet(std::move(wallet));
|
|
}
|
|
|
|
static void WalletIsMineDescriptors(benchmark::Bench& bench) { WalletIsMine(bench); }
|
|
static void WalletIsMineMigratedDescriptors(benchmark::Bench& bench) { WalletIsMine(bench, /*num_combo=*/2000); }
|
|
BENCHMARK(WalletIsMineDescriptors, benchmark::PriorityLevel::LOW);
|
|
BENCHMARK(WalletIsMineMigratedDescriptors, benchmark::PriorityLevel::LOW);
|
|
} // namespace wallet
|