rpc: Speedup getaddressesbylabel
This commit is contained in:
parent
a094b54332
commit
710a7136f9
1 changed files with 12 additions and 1 deletions
|
@ -3790,9 +3790,20 @@ static UniValue getaddressesbylabel(const JSONRPCRequest& request)
|
||||||
|
|
||||||
// Find all addresses that have the given label
|
// Find all addresses that have the given label
|
||||||
UniValue ret(UniValue::VOBJ);
|
UniValue ret(UniValue::VOBJ);
|
||||||
|
std::set<std::string> addresses;
|
||||||
for (const std::pair<const CTxDestination, CAddressBookData>& item : pwallet->mapAddressBook) {
|
for (const std::pair<const CTxDestination, CAddressBookData>& item : pwallet->mapAddressBook) {
|
||||||
if (item.second.name == label) {
|
if (item.second.name == label) {
|
||||||
ret.pushKV(EncodeDestination(item.first), AddressBookDataToJSON(item.second, false));
|
std::string address = EncodeDestination(item.first);
|
||||||
|
// CWallet::mapAddressBook is not expected to contain duplicate
|
||||||
|
// address strings, but build a separate set as a precaution just in
|
||||||
|
// case it does.
|
||||||
|
bool unique = addresses.emplace(address).second;
|
||||||
|
assert(unique);
|
||||||
|
// UniValue::pushKV checks if the key exists in O(N)
|
||||||
|
// and since duplicate addresses are unexpected (checked with
|
||||||
|
// std::set in O(log(N))), UniValue::__pushKV is used instead,
|
||||||
|
// which currently is O(1).
|
||||||
|
ret.__pushKV(address, AddressBookDataToJSON(item.second, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue