Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
bench
wallet_ismine.cpp
Go to the documentation of this file.
1
// Copyright (c) 2022-present 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 <
key.h
>
8
#include <
key_io.h
>
9
#include <
script/descriptor.h
>
10
#include <
script/script.h
>
11
#include <
script/signingprovider.h
>
12
#include <
sync.h
>
13
#include <
test/util/setup_common.h
>
14
#include <
wallet/context.h
>
15
#include <
wallet/db.h
>
16
#include <
wallet/test/util.h
>
17
#include <
wallet/wallet.h
>
18
#include <
wallet/walletutil.h
>
19
20
#include <cassert>
21
#include <cstdint>
22
#include <memory>
23
#include <string>
24
#include <utility>
25
26
namespace
wallet
{
27
static
void
WalletIsMine
(
benchmark::Bench
& bench,
int
num_combo = 0)
28
{
29
const
auto
test_setup =
MakeNoLogFileContext<TestingSetup>
();
30
31
WalletContext
context;
32
context.
args
= &test_setup->m_args;
33
context.
chain
= test_setup->m_node.chain.get();
34
35
// Setup the wallet
36
// Loading the wallet will also create it
37
uint64_t create_flags =
WALLET_FLAG_DESCRIPTORS
;
38
auto
database =
CreateMockableWalletDatabase
();
39
auto
wallet
=
TestCreateWallet
(std::move(database), context, create_flags);
40
41
// For a descriptor wallet, fill with num_combo combo descriptors with random keys
42
// This benchmarks a non-HD wallet migrated to descriptors
43
if
(num_combo > 0) {
44
LOCK
(
wallet
->cs_wallet);
45
for
(
int
i = 0; i < num_combo; ++i) {
46
CKey
key;
47
key.
MakeNewKey
(
/*fCompressed=*/
true
);
48
FlatSigningProvider
keys;
49
std::string error;
50
std::vector<std::unique_ptr<Descriptor>> desc =
Parse
(
"combo("
+
EncodeSecret
(key) +
")"
, keys, error,
/*require_checksum=*/
false
);
51
WalletDescriptor
w_desc(std::move(desc.at(0)),
/*creation_time=*/
0,
/*range_start=*/
0,
/*range_end=*/
0,
/*next_index=*/
0);
52
Assert
(
wallet
->AddWalletDescriptor(w_desc, keys,
/*label=*/
""
,
/*internal=*/
false
));
53
}
54
}
55
56
const
CScript
script
=
GetScriptForDestination
(
DecodeDestination
(
ADDRESS_BCRT1_UNSPENDABLE
));
57
58
bench.
run
([&] {
59
LOCK
(
wallet
->cs_wallet);
60
bool
mine =
wallet
->IsMine(
script
);
61
assert
(!mine);
62
});
63
64
TestUnloadWallet
(std::move(
wallet
));
65
}
66
67
static
void
WalletIsMineDescriptors
(
benchmark::Bench
& bench) {
WalletIsMine
(bench); }
68
static
void
WalletIsMineMigratedDescriptors
(
benchmark::Bench
& bench) {
WalletIsMine
(bench,
/*num_combo=*/
2000); }
69
BENCHMARK
(
WalletIsMineDescriptors
);
70
BENCHMARK
(
WalletIsMineMigratedDescriptors
);
71
}
// namespace wallet
GetScriptForDestination
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
Definition
addresstype.cpp:166
addresstype.h
bench.h
BENCHMARK
#define BENCHMARK(n)
Definition
bench.h:68
Assert
#define Assert(val)
Identity function.
Definition
check.h:113
CKey
An encapsulated private key.
Definition
key.h:36
CKey::MakeNewKey
void MakeNewKey(bool fCompressed)
Generate a new private key using a cryptographic PRNG.
Definition
key.cpp:162
CScript
Serialized script, used inside transaction inputs and outputs.
Definition
script.h:405
ankerl::nanobench::Bench
Main entry point to nanobench's benchmarking facility.
Definition
nanobench.h:627
ankerl::nanobench::Bench::run
Bench & run(char const *benchmarkName, Op &&op)
Repeatedly calls op() based on the configuration, and performs measurements.
Definition
nanobench.h:1234
wallet::WalletDescriptor
Descriptor with some wallet metadata.
Definition
walletutil.h:64
Parse
static UniValue Parse(std::string_view raw, ParamFormat format=ParamFormat::JSON)
Parse string to UniValue or throw runtime_error if string contains invalid JSON.
Definition
client.cpp:395
db.h
key.h
DecodeDestination
CTxDestination DecodeDestination(const std::string &str, std::string &error_msg, std::vector< int > *error_locations)
Definition
key_io.cpp:299
EncodeSecret
std::string EncodeSecret(const CKey &key)
Definition
key_io.cpp:231
key_io.h
script
Definition
parsing.cpp:13
wallet
Definition
wallet_balance.cpp:26
wallet::WalletIsMineDescriptors
static void WalletIsMineDescriptors(benchmark::Bench &bench)
Definition
wallet_ismine.cpp:67
wallet::ADDRESS_BCRT1_UNSPENDABLE
const std::string ADDRESS_BCRT1_UNSPENDABLE
Definition
util.h:31
wallet::WalletIsMine
static void WalletIsMine(benchmark::Bench &bench, int num_combo=0)
Definition
wallet_ismine.cpp:27
wallet::TestUnloadWallet
void TestUnloadWallet(std::shared_ptr< CWallet > &&wallet)
Definition
util.cpp:98
wallet::WalletIsMineMigratedDescriptors
static void WalletIsMineMigratedDescriptors(benchmark::Bench &bench)
Definition
wallet_ismine.cpp:68
wallet::CreateMockableWalletDatabase
std::unique_ptr< WalletDatabase > CreateMockableWalletDatabase(MockableData records)
Definition
util.cpp:211
wallet::TestCreateWallet
std::shared_ptr< CWallet > TestCreateWallet(std::unique_ptr< WalletDatabase > database, WalletContext &context, uint64_t create_flags)
Definition
util.cpp:50
wallet::WALLET_FLAG_DESCRIPTORS
@ WALLET_FLAG_DESCRIPTORS
Indicate that this wallet supports DescriptorScriptPubKeyMan.
Definition
walletutil.h:53
descriptor.h
script.h
setup_common.h
MakeNoLogFileContext
std::unique_ptr< T > MakeNoLogFileContext(const ChainType chain_type=ChainType::REGTEST, TestOpts opts={})
Make a test setup that has disk access to the debug.log file disabled.
Definition
setup_common.h:250
signingprovider.h
FlatSigningProvider
Definition
signingprovider.h:224
wallet::WalletContext
Definition
context.h:36
wallet::WalletContext::chain
interfaces::Chain * chain
Definition
context.h:37
wallet::WalletContext::args
ArgsManager * args
Definition
context.h:39
sync.h
LOCK
#define LOCK(cs)
Definition
sync.h:258
assert
assert(!tx.IsCoinBase())
context.h
util.h
wallet.h
walletutil.h
Generated on
for Bitcoin Core by
1.17.0