Skip to content

Commit 0c6487c

Browse files
committed
Merge #15751: Speed up deriveaddresses for large ranges
41a46cb Speed up deriveaddresses for large ranges (Pieter Wuille) Pull request description: `deriveaddresses` dumps all generated addresses into a single `FlatSigningProvider`, which is also used for looking up information for future derivations. @achow101 points out that the growing data structures may unnecessary increase lookup time for later derivations. Fix this by separating the provider used for lookups (`key_provider`) and the one we dump things into. This gives a 10x speedup for a range of 7000 elements, and probably a larger speedup for larger ranges. ACKs for commit 41a46c: achow101: Regardless, I do think this is a good change, so utACK 41a46cb fanquake: tACK 41a46cb meshcollider: utACK bitcoin/bitcoin@41a46cb Tree-SHA512: a1b894ce9d5195d8f9760f44acc6d67a90bb259283fd8c1524c38a222fe53e8c1d35b6653a508b121b7ad91e155c97d26c658f6bdcebf6c360546931e4a26a22
2 parents 617261e + 41a46cb commit 0c6487c

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

src/rpc/misc.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@ UniValue deriveaddresses(const JSONRPCRequest& request)
229229
range_end = range.second;
230230
}
231231

232-
FlatSigningProvider provider;
233-
auto desc = Parse(desc_str, provider, /* require_checksum = */ true);
232+
FlatSigningProvider key_provider;
233+
auto desc = Parse(desc_str, key_provider, /* require_checksum = */ true);
234234
if (!desc) {
235235
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Invalid descriptor"));
236236
}
@@ -246,8 +246,9 @@ UniValue deriveaddresses(const JSONRPCRequest& request)
246246
UniValue addresses(UniValue::VARR);
247247

248248
for (int i = range_begin; i <= range_end; ++i) {
249+
FlatSigningProvider provider;
249250
std::vector<CScript> scripts;
250-
if (!desc->Expand(i, provider, scripts, provider)) {
251+
if (!desc->Expand(i, key_provider, scripts, provider)) {
251252
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Cannot derive script without private keys"));
252253
}
253254

0 commit comments

Comments
 (0)