diff options
| author | João Barbosa <[email protected]> | 2019-02-22 16:07:21 +0000 |
|---|---|---|
| committer | João Barbosa <[email protected]> | 2019-04-22 10:00:07 +0100 |
| commit | 710a7136f93133bf256d37dc8c8faf5a6b9ba89d (patch) | |
| tree | 9f333f213a8c3303cf4e102e1973fc135e17820e /src/wallet | |
| parent | Merge #15273: docs: Slight tweak to the verify-commits script directions (diff) | |
| download | discoin-710a7136f93133bf256d37dc8c8faf5a6b9ba89d.tar.xz discoin-710a7136f93133bf256d37dc8c8faf5a6b9ba89d.zip | |
rpc: Speedup getaddressesbylabel
Diffstat (limited to 'src/wallet')
| -rw-r--r-- | src/wallet/rpcwallet.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 37fc88dfd..0fd4527e5 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3790,9 +3790,20 @@ static UniValue getaddressesbylabel(const JSONRPCRequest& request) // Find all addresses that have the given label UniValue ret(UniValue::VOBJ); + std::set<std::string> addresses; for (const std::pair<const CTxDestination, CAddressBookData>& item : pwallet->mapAddressBook) { 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)); } } |