mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-03 09:56:38 -05:00
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:
parent
5cfdda2503
commit
3a53f19718
2 changed files with 10 additions and 8 deletions
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue