Skip to content

Commit 5c5a298

Browse files
committed
Merge bitcoin/bitcoin#30563: fuzz: improve scriptpubkeyman target
401cc4e 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 ACK 401cc4e achow101: ACK 401cc4e Tree-SHA512: 941812bc6d991dd03675a2974ce1b839494ca7f6e6d8a22c689d4bf4fed2dac5491246998f19cb15dbff516fdd8eeda27e7628c3206d45f57dc292bc05624a5c
2 parents 1873e41 + 401cc4e commit 5c5a298

File tree

1 file changed

+19
-35
lines changed

1 file changed

+19
-35
lines changed

src/wallet/test/fuzz/scriptpubkeyman.cpp

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -94,30 +94,30 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
9494
LOCK(wallet.cs_wallet);
9595
wallet.SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
9696
wallet.SetLastBlockProcessed(chainstate.m_chain.Height(), chainstate.m_chain.Tip()->GetBlockHash());
97-
wallet.m_keypool_size = 10;
97+
wallet.m_keypool_size = 1;
9898
}
9999

100100
auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
101101
if (!wallet_desc.has_value()) return;
102102
auto spk_manager{CreateDescriptor(wallet_desc->first, wallet_desc->second, wallet)};
103103
if (spk_manager == nullptr) return;
104104

105+
if (fuzzed_data_provider.ConsumeBool()) {
106+
auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
107+
if (!wallet_desc.has_value()) {
108+
return;
109+
}
110+
std::string error;
111+
if (spk_manager->CanUpdateToWalletDescriptor(wallet_desc->first, error)) {
112+
auto new_spk_manager{CreateDescriptor(wallet_desc->first, wallet_desc->second, wallet)};
113+
if (new_spk_manager != nullptr) spk_manager = new_spk_manager;
114+
}
115+
}
116+
105117
bool good_data{true};
106-
LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 300) {
118+
LIMITED_WHILE(good_data && fuzzed_data_provider.ConsumeBool(), 20) {
107119
CallOneOf(
108120
fuzzed_data_provider,
109-
[&] {
110-
auto wallet_desc{CreateWalletDescriptor(fuzzed_data_provider)};
111-
if (!wallet_desc.has_value()) {
112-
good_data = false;
113-
return;
114-
}
115-
std::string error;
116-
if (spk_manager->CanUpdateToWalletDescriptor(wallet_desc->first, error)) {
117-
auto new_spk_manager{CreateDescriptor(wallet_desc->first, wallet_desc->second, wallet)};
118-
if (new_spk_manager != nullptr) spk_manager = new_spk_manager;
119-
}
120-
},
121121
[&] {
122122
const CScript script{ConsumeScript(fuzzed_data_provider)};
123123
auto is_mine{spk_manager->IsMine(script)};
@@ -144,29 +144,11 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
144144
},
145145
[&] {
146146
auto spks{spk_manager->GetScriptPubKeys()};
147-
for (const CScript& spk : spks) {
148-
if (fuzzed_data_provider.ConsumeBool()) {
149-
spk_manager->MarkUnusedAddresses(spk);
150-
}
147+
if (!spks.empty()) {
148+
auto& spk{PickValue(fuzzed_data_provider, spks)};
149+
(void)spk_manager->MarkUnusedAddresses(spk);
151150
}
152151
},
153-
[&] {
154-
CKey key{ConsumePrivateKey(fuzzed_data_provider, /*compressed=*/fuzzed_data_provider.ConsumeBool())};
155-
if (!key.IsValid()) {
156-
good_data = false;
157-
return;
158-
}
159-
spk_manager->AddDescriptorKey(key, key.GetPubKey());
160-
spk_manager->TopUp();
161-
LOCK(spk_manager->cs_desc_man);
162-
auto particular_key{spk_manager->GetKey(key.GetPubKey().GetID())};
163-
assert(*particular_key == key);
164-
assert(spk_manager->HasPrivKey(key.GetPubKey().GetID()));
165-
},
166-
[&] {
167-
std::string descriptor;
168-
(void)spk_manager->GetDescriptorString(descriptor, /*priv=*/fuzzed_data_provider.ConsumeBool());
169-
},
170152
[&] {
171153
LOCK(spk_manager->cs_desc_man);
172154
auto wallet_desc{spk_manager->GetWalletDescriptor()};
@@ -209,6 +191,8 @@ FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)
209191
);
210192
}
211193

194+
std::string descriptor;
195+
(void)spk_manager->GetDescriptorString(descriptor, /*priv=*/fuzzed_data_provider.ConsumeBool());
212196
(void)spk_manager->GetEndRange();
213197
(void)spk_manager->GetKeyPoolSize();
214198
}

0 commit comments

Comments
 (0)