Skip to content

Commit 55b9319

Browse files
committed
removed duplicate calling of GetDescriptorScriptPubKeyMan
Removed duplicate call to GetDescriptorScriptPubKeyMan and Instead of checking linearly I have used find method so time complexity reduced significantly for GetDescriptorScriptPubKeyMan after this fix improved performance of importdescriptor part refs #32013.
1 parent e568c1d commit 55b9319

File tree

12 files changed

+45
-29
lines changed

12 files changed

+45
-29
lines changed

src/bench/wallet_ismine.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ static void WalletIsMine(benchmark::Bench& bench, bool legacy_wallet, int num_co
5454
std::string error;
5555
std::vector<std::unique_ptr<Descriptor>> desc = Parse("combo(" + EncodeSecret(key) + ")", keys, error, /*require_checksum=*/false);
5656
WalletDescriptor w_desc(std::move(desc.at(0)), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/0, /*next_index=*/0);
57-
auto spkm = wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", /*internal=*/false);
58-
assert(spkm);
57+
auto spk_manager = *Assert(wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", /*internal=*/false));
58+
assert(spk_manager);
5959
}
6060
}
6161

src/qt/test/wallettests.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ std::shared_ptr<CWallet> SetupDescriptorsWallet(interfaces::Node& node, TestChai
223223
assert(descs.size() == 1);
224224
auto& desc = descs.at(0);
225225
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
226-
if (!wallet->AddWalletDescriptor(w_desc, provider, "", false)) assert(false);
226+
auto spk_manager = *Assert(wallet->AddWalletDescriptor(w_desc, provider, "", false));
227+
assert(spk_manager);
227228
CTxDestination dest = GetDestinationForKey(test.coinbaseKey.GetPubKey(), wallet->m_default_address_type);
228229
wallet->SetAddressBook(dest, "", wallet::AddressPurpose::RECEIVE);
229230
wallet->SetLastBlockProcessed(105, WITH_LOCK(node.context()->chainman->GetMutex(), return node.context()->chainman->ActiveChain().Tip()->GetBlockHash()));

src/test/fuzz/util/wallet.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ struct FuzzedWallet {
5959
WalletDescriptor w_desc{std::move(parsed_desc), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/1, /*next_index=*/0};
6060
assert(!wallet->GetDescriptorScriptPubKeyMan(w_desc));
6161
LOCK(wallet->cs_wallet);
62-
auto spk_manager{wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", internal)};
62+
auto spk_manager = *Assert(wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", internal));
6363
assert(spk_manager);
6464
wallet->AddActiveScriptPubKeyMan(spk_manager->GetID(), *Assert(w_desc.descriptor->GetOutputType()), internal);
6565
}

src/wallet/rpc/backup.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,16 +1575,15 @@ static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, c
15751575

15761576
WalletDescriptor w_desc(std::move(parsed_desc), timestamp, range_start, range_end, next_index);
15771577

1578-
// Check if the wallet already contains the descriptor
1579-
auto existing_spk_manager = wallet.GetDescriptorScriptPubKeyMan(w_desc);
1580-
if (existing_spk_manager) {
1581-
if (!existing_spk_manager->CanUpdateToWalletDescriptor(w_desc, error)) {
1582-
throw JSONRPCError(RPC_INVALID_PARAMETER, error);
1583-
}
1578+
// Add descriptor to the wallet
1579+
auto spk_manager_res = wallet.AddWalletDescriptor(w_desc, keys, label, desc_internal);
1580+
1581+
if (!spk_manager_res) {
1582+
throw JSONRPCError(RPC_INVALID_PARAMETER, util::ErrorString(spk_manager_res).original);
15841583
}
15851584

1586-
// Add descriptor to the wallet
1587-
auto spk_manager = wallet.AddWalletDescriptor(w_desc, keys, label, desc_internal);
1585+
auto spk_manager = spk_manager_res.value();
1586+
15881587
if (spk_manager == nullptr) {
15891588
throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Could not add descriptor '%s'", descriptor));
15901589
}

src/wallet/scriptpubkeyman.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2827,12 +2827,12 @@ void DescriptorScriptPubKeyMan::UpgradeDescriptorCache()
28272827
}
28282828
}
28292829

2830-
void DescriptorScriptPubKeyMan::UpdateWalletDescriptor(WalletDescriptor& descriptor)
2830+
util::Result<void> DescriptorScriptPubKeyMan::UpdateWalletDescriptor(WalletDescriptor& descriptor)
28312831
{
28322832
LOCK(cs_desc_man);
28332833
std::string error;
28342834
if (!CanUpdateToWalletDescriptor(descriptor, error)) {
2835-
throw std::runtime_error(std::string(__func__) + ": " + error);
2835+
return util::Error{Untranslated(std::move(error))};
28362836
}
28372837

28382838
m_map_pubkeys.clear();
@@ -2841,6 +2841,7 @@ void DescriptorScriptPubKeyMan::UpdateWalletDescriptor(WalletDescriptor& descrip
28412841
m_wallet_descriptor = descriptor;
28422842

28432843
NotifyFirstKeyTimeChanged(this, m_wallet_descriptor.creation_time);
2844+
return {};
28442845
}
28452846

28462847
bool DescriptorScriptPubKeyMan::CanUpdateToWalletDescriptor(const WalletDescriptor& descriptor, std::string& error)

src/wallet/scriptpubkeyman.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ class DescriptorScriptPubKeyMan : public ScriptPubKeyMan
694694
bool AddCryptedKey(const CKeyID& key_id, const CPubKey& pubkey, const std::vector<unsigned char>& crypted_key);
695695

696696
bool HasWalletDescriptor(const WalletDescriptor& desc) const;
697-
void UpdateWalletDescriptor(WalletDescriptor& descriptor);
697+
util::Result<void> UpdateWalletDescriptor(WalletDescriptor& descriptor);
698698
bool CanUpdateToWalletDescriptor(const WalletDescriptor& descriptor, std::string& error);
699699
void AddDescriptorKey(const CKey& key, const CPubKey &pubkey);
700700
void WriteDescriptor();

src/wallet/test/fuzz/scriptpubkeyman.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,12 @@ static std::optional<std::pair<WalletDescriptor, FlatSigningProvider>> CreateWal
8080
static DescriptorScriptPubKeyMan* CreateDescriptor(WalletDescriptor& wallet_desc, FlatSigningProvider& keys, CWallet& keystore)
8181
{
8282
LOCK(keystore.cs_wallet);
83-
keystore.AddWalletDescriptor(wallet_desc, keys, /*label=*/"", /*internal=*/false);
84-
return keystore.GetDescriptorScriptPubKeyMan(wallet_desc);
83+
DescriptorScriptPubKeyMan* descriptor_spk_manager = nullptr;
84+
auto spk_manager = *Assert(keystore.AddWalletDescriptor(wallet_desc, keys, /*label=*/"", /*internal=*/false));
85+
if (spk_manager) {
86+
descriptor_spk_manager = dynamic_cast<DescriptorScriptPubKeyMan*>(spk_manager);
87+
}
88+
return descriptor_spk_manager;
8589
};
8690

8791
FUZZ_TARGET(scriptpubkeyman, .init = initialize_spkm)

src/wallet/test/psbt_wallet_tests.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ static void import_descriptor(CWallet& wallet, const std::string& descriptor)
2727
assert(descs.size() == 1);
2828
auto& desc = descs.at(0);
2929
WalletDescriptor w_desc(std::move(desc), 0, 0, 10, 0);
30-
wallet.AddWalletDescriptor(w_desc, provider, "", false);
30+
auto spk_manager = *Assert(wallet.AddWalletDescriptor(w_desc, provider, "", false));
31+
assert(spk_manager);
3132
}
3233

3334
BOOST_AUTO_TEST_CASE(psbt_updater_test)

src/wallet/test/util.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ std::unique_ptr<CWallet> CreateSyncedWallet(interfaces::Chain& chain, CChain& cc
3535
assert(descs.size() == 1);
3636
auto& desc = descs.at(0);
3737
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
38-
if (!wallet->AddWalletDescriptor(w_desc, provider, "", false)) assert(false);
38+
auto spk_manager = *Assert(wallet->AddWalletDescriptor(w_desc, provider, "", false));
39+
assert(spk_manager);
3940
}
4041
WalletRescanReserver reserver(*wallet);
4142
reserver.reserve();
@@ -209,7 +210,7 @@ wallet::ScriptPubKeyMan* CreateDescriptor(CWallet& keystore, const std::string&
209210
WalletDescriptor w_desc(std::move(desc), timestamp, range_start, range_end, next_index);
210211

211212
LOCK(keystore.cs_wallet);
212-
213-
return Assert(keystore.AddWalletDescriptor(w_desc, keys,/*label=*/"", /*internal=*/false));
213+
auto spkm = Assert(keystore.AddWalletDescriptor(w_desc, keys,/*label=*/"", /*internal=*/false));
214+
return spkm.value();
214215
};
215216
} // namespace wallet

src/wallet/test/wallet_tests.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ static void AddKey(CWallet& wallet, const CKey& key)
6969
assert(descs.size() == 1);
7070
auto& desc = descs.at(0);
7171
WalletDescriptor w_desc(std::move(desc), 0, 0, 1, 1);
72-
if (!wallet.AddWalletDescriptor(w_desc, provider, "", false)) assert(false);
72+
auto spk_manager = *Assert(wallet.AddWalletDescriptor(w_desc, provider, "", false));
73+
assert(spk_manager);
7374
}
7475

7576
BOOST_FIXTURE_TEST_CASE(scan_for_wallet_transactions, TestChain100Setup)

0 commit comments

Comments
 (0)