Pushdown walletdb object through GenerateNewKey/DeriveNewChildKey.

This is needed but not sufficient for batching the wallet flushing
 when topping up the keypool.
This commit is contained in:
Gregory Maxwell 2017-07-14 22:36:58 +00:00
parent 5cfdda2503
commit 3a53f19718
2 changed files with 10 additions and 8 deletions

View File

@ -87,7 +87,7 @@ const CWalletTx* CWallet::GetWalletTx(const uint256& hash) const
return &(it->second); return &(it->second);
} }
CPubKey CWallet::GenerateNewKey(bool internal) CPubKey CWallet::GenerateNewKey(CWalletDB &walletdb, bool internal)
{ {
AssertLockHeld(cs_wallet); // mapKeyMetadata AssertLockHeld(cs_wallet); // mapKeyMetadata
bool fCompressed = CanSupportFeature(FEATURE_COMPRPUBKEY); // default to compressed public keys if we want 0.6.0 wallets bool fCompressed = CanSupportFeature(FEATURE_COMPRPUBKEY); // default to compressed public keys if we want 0.6.0 wallets
@ -100,7 +100,7 @@ CPubKey CWallet::GenerateNewKey(bool internal)
// use HD key derivation if HD was enabled during wallet creation // use HD key derivation if HD was enabled during wallet creation
if (IsHDEnabled()) { if (IsHDEnabled()) {
DeriveNewChildKey(metadata, secret, (CanSupportFeature(FEATURE_HD_SPLIT) ? internal : false)); DeriveNewChildKey(walletdb, metadata, secret, (CanSupportFeature(FEATURE_HD_SPLIT) ? internal : false));
} else { } else {
secret.MakeNewKey(fCompressed); secret.MakeNewKey(fCompressed);
} }
@ -120,7 +120,7 @@ CPubKey CWallet::GenerateNewKey(bool internal)
return pubkey; return pubkey;
} }
void CWallet::DeriveNewChildKey(CKeyMetadata& metadata, CKey& secret, bool internal) void CWallet::DeriveNewChildKey(CWalletDB &walletdb, CKeyMetadata& metadata, CKey& secret, bool internal)
{ {
// for now we use a fixed keypath scheme of m/0'/0'/k // for now we use a fixed keypath scheme of m/0'/0'/k
CKey key; //master key seed (256bit) CKey key; //master key seed (256bit)
@ -162,7 +162,7 @@ void CWallet::DeriveNewChildKey(CKeyMetadata& metadata, CKey& secret, bool inter
secret = childKey.key; secret = childKey.key;
metadata.hdMasterKeyID = hdChain.masterKeyID; metadata.hdMasterKeyID = hdChain.masterKeyID;
// update the chain model in the database // update the chain model in the database
if (!CWalletDB(*dbw).WriteHDChain(hdChain)) if (!walletdb.WriteHDChain(hdChain))
throw std::runtime_error(std::string(__func__) + ": Writing HD chain model failed"); throw std::runtime_error(std::string(__func__) + ": Writing HD chain model failed");
} }
@ -3183,8 +3183,9 @@ bool CWallet::TopUpKeyPool(unsigned int kpSize)
nEnd = std::max(nEnd, *(setExternalKeyPool.rbegin()) + 1); nEnd = std::max(nEnd, *(setExternalKeyPool.rbegin()) + 1);
} }
if (!walletdb.WritePool(nEnd, CKeyPool(GenerateNewKey(internal), internal))) if (!walletdb.WritePool(nEnd, CKeyPool(GenerateNewKey(walletdb, internal), internal))) {
throw std::runtime_error(std::string(__func__) + ": writing generated key failed"); throw std::runtime_error(std::string(__func__) + ": writing generated key failed");
}
if (internal) { if (internal) {
setInternalKeyPool.insert(nEnd); setInternalKeyPool.insert(nEnd);
@ -3266,7 +3267,8 @@ bool CWallet::GetKeyFromPool(CPubKey& result, bool internal)
if (nIndex == -1) if (nIndex == -1)
{ {
if (IsLocked()) return false; if (IsLocked()) return false;
result = GenerateNewKey(internal); CWalletDB walletdb(*dbw);
result = GenerateNewKey(walletdb, internal);
return true; return true;
} }
KeepKey(nIndex); KeepKey(nIndex);

View File

@ -697,7 +697,7 @@ private:
CHDChain hdChain; CHDChain hdChain;
/* HD derive new child key (on internal or external chain) */ /* HD derive new child key (on internal or external chain) */
void DeriveNewChildKey(CKeyMetadata& metadata, CKey& secret, bool internal = false); void DeriveNewChildKey(CWalletDB &walletdb, CKeyMetadata& metadata, CKey& secret, bool internal = false);
std::set<int64_t> setInternalKeyPool; std::set<int64_t> setInternalKeyPool;
std::set<int64_t> setExternalKeyPool; std::set<int64_t> setExternalKeyPool;
@ -866,7 +866,7 @@ public:
* keystore implementation * keystore implementation
* Generate a new key * Generate a new key
*/ */
CPubKey GenerateNewKey(bool internal = false); CPubKey GenerateNewKey(CWalletDB& walletdb, bool internal = false);
//! Adds a key to the store, and saves it to disk. //! Adds a key to the store, and saves it to disk.
bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey) override; bool AddKeyPubKey(const CKey& key, const CPubKey &pubkey) override;
//! Adds a key to the store, without saving it to disk (used by LoadWallet) //! Adds a key to the store, without saving it to disk (used by LoadWallet)