mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-22 23:07:59 +01:00
Merge bitcoin/bitcoin#30563: fuzz: improve scriptpubkeyman
target
401cc4ec70
fuzz: improve scriptpubkeyman target (brunoerg) Pull request description: Fixes #30541 This PR aims to improve `scriptpubkeyman` target to avoid timeouts. The input provided in #30541 takes too much time to run because it basically calls only `MarkUnusedAddresses` (300 times * number of spks). The following changes were made to improve it: - Reduce keypool size. - When calling `MarkUnusedAddresses`, do it with one of the spks per iteration. - Remove the specific `AddDescriptorKey` call since it is already covered with `AddWalletDescriptor`. - Limit number of iterations to a reasonable value. ACKs for top commit: maflcko: lgtm ACK401cc4ec70
achow101: ACK401cc4ec70
Tree-SHA512: 941812bc6d991dd03675a2974ce1b839494ca7f6e6d8a22c689d4bf4fed2dac5491246998f19cb15dbff516fdd8eeda27e7628c3206d45f57dc292bc05624a5c
This commit is contained in:
commit
5c5a298f6d
1 changed files with 19 additions and 35 deletions
|
@ -94,7 +94,7 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
|
||||||
LOCK(wallet.cs_wallet);
|
LOCK(wallet.cs_wallet);
|
||||||
wallet.SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
|
wallet.SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
|
||||||
wallet.SetLastBlockProcessed(chainstate.m_chain.Height(), chainstate.m_chain.Tip()->GetBlockHash());
|
wallet.SetLastBlockProcessed(chainstate.m_chain.Height(), chainstate.m_chain.Tip()->GetBlockHash());
|
||||||
wallet.m_keypool_size = 10;
|
wallet.m_keypool_size = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
|
auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
|
||||||
|
@ -102,22 +102,22 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
|
||||||
auto spk_manager{CreateDescriptor(wallet_desc->first, wallet_desc->second, wallet)};
|
auto spk_manager{CreateDescriptor(wallet_desc->first, wallet_desc->second, wallet)};
|
||||||
if (spk_manager == nullptr) return;
|
if (spk_manager == nullptr) return;
|
||||||
|
|
||||||
|
if (fuzzed_data_provider.ConsumeBool()) {
|
||||||
|
auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
|
||||||
|
if (!wallet_desc.has_value()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::string error;
|
||||||
|
if (spk_manager->CanUpdateToWalletDescriptor(wallet_desc->first, error)) {
|
||||||
|
auto new_spk_manager{CreateDescriptor(wallet_desc->first, wallet_desc->second, wallet)};
|
||||||
|
if (new_spk_manager != nullptr) spk_manager = new_spk_manager;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool good_data{true};
|
bool good_data{true};
|
||||||
LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 300) {
|
LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 20) {
|
||||||
CallOneOf(
|
CallOneOf(
|
||||||
fuzzed_data_provider,
|
fuzzed_data_provider,
|
||||||
[&] {
|
|
||||||
auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
|
|
||||||
if (!wallet_desc.has_value()) {
|
|
||||||
good_data = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
std::string error;
|
|
||||||
if (spk_manager->CanUpdateToWalletDescriptor(wallet_desc->first, error)) {
|
|
||||||
auto new_spk_manager{CreateDescriptor(wallet_desc->first, wallet_desc->second, wallet)};
|
|
||||||
if (new_spk_manager != nullptr) spk_manager = new_spk_manager;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[&] {
|
[&] {
|
||||||
const CScript script{ConsumeScript(fuzzed_data_provider)};
|
const CScript script{ConsumeScript(fuzzed_data_provider)};
|
||||||
auto is_mine{spk_manager->IsMine(script)};
|
auto is_mine{spk_manager->IsMine(script)};
|
||||||
|
@ -144,29 +144,11 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
|
||||||
},
|
},
|
||||||
[&] {
|
[&] {
|
||||||
auto spks{spk_manager->GetScriptPubKeys()};
|
auto spks{spk_manager->GetScriptPubKeys()};
|
||||||
for (const CScript& spk : spks) {
|
if (!spks.empty()) {
|
||||||
if (fuzzed_data_provider.ConsumeBool()) {
|
auto& spk{PickValue(fuzzed_data_provider, spks)};
|
||||||
spk_manager->MarkUnusedAddresses(spk);
|
(void)spk_manager->MarkUnusedAddresses(spk);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[&] {
|
|
||||||
CKey key{ConsumePrivateKey(fuzzed_data_provider, /*compressed=*/fuzzed_data_provider.ConsumeBool())};
|
|
||||||
if (!key.IsValid()) {
|
|
||||||
good_data = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
spk_manager->AddDescriptorKey(key, key.GetPubKey());
|
|
||||||
spk_manager->TopUp();
|
|
||||||
LOCK(spk_manager->cs_desc_man);
|
|
||||||
auto particular_key{spk_manager->GetKey(key.GetPubKey().GetID())};
|
|
||||||
assert(*particular_key == key);
|
|
||||||
assert(spk_manager->HasPrivKey(key.GetPubKey().GetID()));
|
|
||||||
},
|
|
||||||
[&] {
|
|
||||||
std::string descriptor;
|
|
||||||
(void)spk_manager->GetDescriptorString(descriptor, /*priv=*/fuzzed_data_provider.ConsumeBool());
|
|
||||||
},
|
|
||||||
[&] {
|
[&] {
|
||||||
LOCK(spk_manager->cs_desc_man);
|
LOCK(spk_manager->cs_desc_man);
|
||||||
auto wallet_desc{spk_manager->GetWalletDescriptor()};
|
auto wallet_desc{spk_manager->GetWalletDescriptor()};
|
||||||
|
@ -209,6 +191,8 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string descriptor;
|
||||||
|
(void)spk_manager->GetDescriptorString(descriptor, /*priv=*/fuzzed_data_provider.ConsumeBool());
|
||||||
(void)spk_manager->GetEndRange();
|
(void)spk_manager->GetEndRange();
|
||||||
(void)spk_manager->GetKeyPoolSize();
|
(void)spk_manager->GetKeyPoolSize();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue