Browse Source

keystore GetKeys(): return result instead of writing to reference

Issue: #10905

By returning the result, a few useless lines can be removed.

Return-value-optimization means there should be no copy.
0.16
Marko Bencun 7 years ago
parent
commit
5cb3da04b8
  1. 18
      src/keystore.h
  2. 25
      src/wallet/crypter.h
  3. 5
      src/wallet/wallet.cpp

18
src/keystore.h

@ -30,7 +30,7 @@ public:
//! Check whether a key corresponding to a given address is present in the store. //! Check whether a key corresponding to a given address is present in the store.
virtual bool HaveKey(const CKeyID &address) const =0; virtual bool HaveKey(const CKeyID &address) const =0;
virtual bool GetKey(const CKeyID &address, CKey& keyOut) const =0; virtual bool GetKey(const CKeyID &address, CKey& keyOut) const =0;
virtual void GetKeys(std::set<CKeyID> &setAddress) const =0; virtual std::set<CKeyID> GetKeys() const =0;
virtual bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const =0; virtual bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const =0;
//! Support for BIP 0013 : see https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki //! Support for BIP 0013 : see https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki
@ -71,18 +71,14 @@ public:
} }
return result; return result;
} }
void GetKeys(std::set<CKeyID> &setAddress) const override std::set<CKeyID> GetKeys() const override
{ {
setAddress.clear(); LOCK(cs_KeyStore);
{ std::set<CKeyID> set_address;
LOCK(cs_KeyStore); for (const auto& mi : mapKeys) {
KeyMap::const_iterator mi = mapKeys.begin(); set_address.insert(mi.first);
while (mi != mapKeys.end())
{
setAddress.insert((*mi).first);
mi++;
}
} }
return set_address;
} }
bool GetKey(const CKeyID &address, CKey &keyOut) const override bool GetKey(const CKeyID &address, CKey &keyOut) const override
{ {

25
src/wallet/crypter.h

@ -16,13 +16,13 @@ const unsigned int WALLET_CRYPTO_IV_SIZE = 16;
/** /**
* Private key encryption is done based on a CMasterKey, * Private key encryption is done based on a CMasterKey,
* which holds a salt and random encryption key. * which holds a salt and random encryption key.
* *
* CMasterKeys are encrypted using AES-256-CBC using a key * CMasterKeys are encrypted using AES-256-CBC using a key
* derived using derivation method nDerivationMethod * derived using derivation method nDerivationMethod
* (0 == EVP_sha512()) and derivation iterations nDeriveIterations. * (0 == EVP_sha512()) and derivation iterations nDeriveIterations.
* vchOtherDerivationParameters is provided for alternative algorithms * vchOtherDerivationParameters is provided for alternative algorithms
* which may require more parameters (such as scrypt). * which may require more parameters (such as scrypt).
* *
* Wallet Private Keys are then encrypted using AES-256-CBC * Wallet Private Keys are then encrypted using AES-256-CBC
* with the double-sha256 of the public key as the IV, and the * with the double-sha256 of the public key as the IV, and the
* master key's key as the encryption key (see keystore.[ch]). * master key's key as the encryption key (see keystore.[ch]).
@ -162,28 +162,25 @@ public:
{ {
{ {
LOCK(cs_KeyStore); LOCK(cs_KeyStore);
if (!IsCrypted()) if (!IsCrypted()) {
return CBasicKeyStore::HaveKey(address); return CBasicKeyStore::HaveKey(address);
}
return mapCryptedKeys.count(address) > 0; return mapCryptedKeys.count(address) > 0;
} }
return false; return false;
} }
bool GetKey(const CKeyID &address, CKey& keyOut) const override; bool GetKey(const CKeyID &address, CKey& keyOut) const override;
bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override; bool GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) const override;
void GetKeys(std::set<CKeyID> &setAddress) const override std::set<CKeyID> GetKeys() const override
{ {
if (!IsCrypted()) if (!IsCrypted()) {
{ return CBasicKeyStore::GetKeys();
CBasicKeyStore::GetKeys(setAddress);
return;
} }
setAddress.clear(); std::set<CKeyID> set_address;
CryptedKeyMap::const_iterator mi = mapCryptedKeys.begin(); for (const auto& mi : mapCryptedKeys) {
while (mi != mapCryptedKeys.end()) set_address.insert(mi.first);
{
setAddress.insert((*mi).first);
mi++;
} }
return set_address;
} }
/** /**

5
src/wallet/wallet.cpp

@ -3660,13 +3660,10 @@ void CWallet::GetKeyBirthTimes(std::map<CTxDestination, int64_t> &mapKeyBirth) c
// map in which we'll infer heights of other keys // map in which we'll infer heights of other keys
CBlockIndex *pindexMax = chainActive[std::max(0, chainActive.Height() - 144)]; // the tip can be reorganized; use a 144-block safety margin CBlockIndex *pindexMax = chainActive[std::max(0, chainActive.Height() - 144)]; // the tip can be reorganized; use a 144-block safety margin
std::map<CKeyID, CBlockIndex*> mapKeyFirstBlock; std::map<CKeyID, CBlockIndex*> mapKeyFirstBlock;
std::set<CKeyID> setKeys; for (const CKeyID &keyid : GetKeys()) {
GetKeys(setKeys);
for (const CKeyID &keyid : setKeys) {
if (mapKeyBirth.count(keyid) == 0) if (mapKeyBirth.count(keyid) == 0)
mapKeyFirstBlock[keyid] = pindexMax; mapKeyFirstBlock[keyid] = pindexMax;
} }
setKeys.clear();
// if there are no such keys, we're done // if there are no such keys, we're done
if (mapKeyFirstBlock.empty()) if (mapKeyFirstBlock.empty())

Loading…
Cancel
Save