mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-02 09:46:52 -05:00
have GenerateNewKey and DeriveNewChildKey take a CHDChain as an argument
This commit is contained in:
parent
844d2070a2
commit
b59b4504ab
2 changed files with 22 additions and 22 deletions
|
@ -357,7 +357,7 @@ bool LegacyScriptPubKeyMan::SetupGeneration(bool force)
|
||||||
|
|
||||||
bool LegacyScriptPubKeyMan::IsHDEnabled() const
|
bool LegacyScriptPubKeyMan::IsHDEnabled() const
|
||||||
{
|
{
|
||||||
return !hdChain.seed_id.IsNull();
|
return !m_hd_chain.seed_id.IsNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LegacyScriptPubKeyMan::CanGetAddresses(bool internal) const
|
bool LegacyScriptPubKeyMan::CanGetAddresses(bool internal) const
|
||||||
|
@ -842,7 +842,7 @@ void LegacyScriptPubKeyMan::SetHDChain(const CHDChain& chain, bool memonly)
|
||||||
if (!memonly && !WalletBatch(m_storage.GetDatabase()).WriteHDChain(chain))
|
if (!memonly && !WalletBatch(m_storage.GetDatabase()).WriteHDChain(chain))
|
||||||
throw std::runtime_error(std::string(__func__) + ": writing chain failed");
|
throw std::runtime_error(std::string(__func__) + ": writing chain failed");
|
||||||
|
|
||||||
hdChain = chain;
|
m_hd_chain = chain;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LegacyScriptPubKeyMan::HaveKey(const CKeyID &address) const
|
bool LegacyScriptPubKeyMan::HaveKey(const CKeyID &address) const
|
||||||
|
@ -921,7 +921,7 @@ bool LegacyScriptPubKeyMan::GetPubKey(const CKeyID &address, CPubKey& vchPubKeyO
|
||||||
return GetWatchPubKey(address, vchPubKeyOut);
|
return GetWatchPubKey(address, vchPubKeyOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
CPubKey LegacyScriptPubKeyMan::GenerateNewKey(WalletBatch &batch, bool internal)
|
CPubKey LegacyScriptPubKeyMan::GenerateNewKey(WalletBatch &batch, CHDChain& hd_chain, bool internal)
|
||||||
{
|
{
|
||||||
assert(!m_storage.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS));
|
assert(!m_storage.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS));
|
||||||
assert(!m_storage.IsWalletFlagSet(WALLET_FLAG_BLANK_WALLET));
|
assert(!m_storage.IsWalletFlagSet(WALLET_FLAG_BLANK_WALLET));
|
||||||
|
@ -936,7 +936,7 @@ CPubKey LegacyScriptPubKeyMan::GenerateNewKey(WalletBatch &batch, bool internal)
|
||||||
|
|
||||||
// use HD key derivation if HD was enabled during wallet creation and a seed is present
|
// use HD key derivation if HD was enabled during wallet creation and a seed is present
|
||||||
if (IsHDEnabled()) {
|
if (IsHDEnabled()) {
|
||||||
DeriveNewChildKey(batch, metadata, secret, (m_storage.CanSupportFeature(FEATURE_HD_SPLIT) ? internal : false));
|
DeriveNewChildKey(batch, metadata, secret, hd_chain, (m_storage.CanSupportFeature(FEATURE_HD_SPLIT) ? internal : false));
|
||||||
} else {
|
} else {
|
||||||
secret.MakeNewKey(fCompressed);
|
secret.MakeNewKey(fCompressed);
|
||||||
}
|
}
|
||||||
|
@ -960,7 +960,7 @@ CPubKey LegacyScriptPubKeyMan::GenerateNewKey(WalletBatch &batch, bool internal)
|
||||||
|
|
||||||
const uint32_t BIP32_HARDENED_KEY_LIMIT = 0x80000000;
|
const uint32_t BIP32_HARDENED_KEY_LIMIT = 0x80000000;
|
||||||
|
|
||||||
void LegacyScriptPubKeyMan::DeriveNewChildKey(WalletBatch &batch, CKeyMetadata& metadata, CKey& secret, bool internal)
|
void LegacyScriptPubKeyMan::DeriveNewChildKey(WalletBatch &batch, CKeyMetadata& metadata, CKey& secret, CHDChain& hd_chain, 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 seed; //seed (256bit)
|
CKey seed; //seed (256bit)
|
||||||
|
@ -970,7 +970,7 @@ void LegacyScriptPubKeyMan::DeriveNewChildKey(WalletBatch &batch, CKeyMetadata&
|
||||||
CExtKey childKey; //key at m/0'/0'/<n>'
|
CExtKey childKey; //key at m/0'/0'/<n>'
|
||||||
|
|
||||||
// try to get the seed
|
// try to get the seed
|
||||||
if (!GetKey(hdChain.seed_id, seed))
|
if (!GetKey(hd_chain.seed_id, seed))
|
||||||
throw std::runtime_error(std::string(__func__) + ": seed not found");
|
throw std::runtime_error(std::string(__func__) + ": seed not found");
|
||||||
|
|
||||||
masterKey.SetSeed(seed.begin(), seed.size());
|
masterKey.SetSeed(seed.begin(), seed.size());
|
||||||
|
@ -989,29 +989,29 @@ void LegacyScriptPubKeyMan::DeriveNewChildKey(WalletBatch &batch, CKeyMetadata&
|
||||||
// childIndex | BIP32_HARDENED_KEY_LIMIT = derive childIndex in hardened child-index-range
|
// childIndex | BIP32_HARDENED_KEY_LIMIT = derive childIndex in hardened child-index-range
|
||||||
// example: 1 | BIP32_HARDENED_KEY_LIMIT == 0x80000001 == 2147483649
|
// example: 1 | BIP32_HARDENED_KEY_LIMIT == 0x80000001 == 2147483649
|
||||||
if (internal) {
|
if (internal) {
|
||||||
chainChildKey.Derive(childKey, hdChain.nInternalChainCounter | BIP32_HARDENED_KEY_LIMIT);
|
chainChildKey.Derive(childKey, hd_chain.nInternalChainCounter | BIP32_HARDENED_KEY_LIMIT);
|
||||||
metadata.hdKeypath = "m/0'/1'/" + ToString(hdChain.nInternalChainCounter) + "'";
|
metadata.hdKeypath = "m/0'/1'/" + ToString(hd_chain.nInternalChainCounter) + "'";
|
||||||
metadata.key_origin.path.push_back(0 | BIP32_HARDENED_KEY_LIMIT);
|
metadata.key_origin.path.push_back(0 | BIP32_HARDENED_KEY_LIMIT);
|
||||||
metadata.key_origin.path.push_back(1 | BIP32_HARDENED_KEY_LIMIT);
|
metadata.key_origin.path.push_back(1 | BIP32_HARDENED_KEY_LIMIT);
|
||||||
metadata.key_origin.path.push_back(hdChain.nInternalChainCounter | BIP32_HARDENED_KEY_LIMIT);
|
metadata.key_origin.path.push_back(hd_chain.nInternalChainCounter | BIP32_HARDENED_KEY_LIMIT);
|
||||||
hdChain.nInternalChainCounter++;
|
hd_chain.nInternalChainCounter++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
chainChildKey.Derive(childKey, hdChain.nExternalChainCounter | BIP32_HARDENED_KEY_LIMIT);
|
chainChildKey.Derive(childKey, hd_chain.nExternalChainCounter | BIP32_HARDENED_KEY_LIMIT);
|
||||||
metadata.hdKeypath = "m/0'/0'/" + ToString(hdChain.nExternalChainCounter) + "'";
|
metadata.hdKeypath = "m/0'/0'/" + ToString(hd_chain.nExternalChainCounter) + "'";
|
||||||
metadata.key_origin.path.push_back(0 | BIP32_HARDENED_KEY_LIMIT);
|
metadata.key_origin.path.push_back(0 | BIP32_HARDENED_KEY_LIMIT);
|
||||||
metadata.key_origin.path.push_back(0 | BIP32_HARDENED_KEY_LIMIT);
|
metadata.key_origin.path.push_back(0 | BIP32_HARDENED_KEY_LIMIT);
|
||||||
metadata.key_origin.path.push_back(hdChain.nExternalChainCounter | BIP32_HARDENED_KEY_LIMIT);
|
metadata.key_origin.path.push_back(hd_chain.nExternalChainCounter | BIP32_HARDENED_KEY_LIMIT);
|
||||||
hdChain.nExternalChainCounter++;
|
hd_chain.nExternalChainCounter++;
|
||||||
}
|
}
|
||||||
} while (HaveKey(childKey.key.GetPubKey().GetID()));
|
} while (HaveKey(childKey.key.GetPubKey().GetID()));
|
||||||
secret = childKey.key;
|
secret = childKey.key;
|
||||||
metadata.hd_seed_id = hdChain.seed_id;
|
metadata.hd_seed_id = hd_chain.seed_id;
|
||||||
CKeyID master_id = masterKey.key.GetPubKey().GetID();
|
CKeyID master_id = masterKey.key.GetPubKey().GetID();
|
||||||
std::copy(master_id.begin(), master_id.begin() + 4, metadata.key_origin.fingerprint);
|
std::copy(master_id.begin(), master_id.begin() + 4, metadata.key_origin.fingerprint);
|
||||||
metadata.has_key_origin = true;
|
metadata.has_key_origin = true;
|
||||||
// update the chain model in the database
|
// update the chain model in the database
|
||||||
if (!batch.WriteHDChain(hdChain))
|
if (!batch.WriteHDChain(hd_chain))
|
||||||
throw std::runtime_error(std::string(__func__) + ": Writing HD chain model failed");
|
throw std::runtime_error(std::string(__func__) + ": Writing HD chain model failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1167,7 +1167,7 @@ bool LegacyScriptPubKeyMan::TopUp(unsigned int kpSize)
|
||||||
internal = true;
|
internal = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
CPubKey pubkey(GenerateNewKey(batch, internal));
|
CPubKey pubkey(GenerateNewKey(batch, m_hd_chain, internal));
|
||||||
AddKeypoolPubkeyWithDB(pubkey, internal, batch);
|
AddKeypoolPubkeyWithDB(pubkey, internal, batch);
|
||||||
}
|
}
|
||||||
if (missingInternal + missingExternal > 0) {
|
if (missingInternal + missingExternal > 0) {
|
||||||
|
@ -1240,7 +1240,7 @@ bool LegacyScriptPubKeyMan::GetKeyFromPool(CPubKey& result, const OutputType typ
|
||||||
if (!ReserveKeyFromKeyPool(nIndex, keypool, internal) && !m_storage.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
if (!ReserveKeyFromKeyPool(nIndex, keypool, internal) && !m_storage.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
||||||
if (m_storage.IsLocked()) return false;
|
if (m_storage.IsLocked()) return false;
|
||||||
WalletBatch batch(m_storage.GetDatabase());
|
WalletBatch batch(m_storage.GetDatabase());
|
||||||
result = GenerateNewKey(batch, internal);
|
result = GenerateNewKey(batch, m_hd_chain, internal);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
KeepDestination(nIndex, type);
|
KeepDestination(nIndex, type);
|
||||||
|
|
|
@ -287,10 +287,10 @@ private:
|
||||||
bool AddKeyOriginWithDB(WalletBatch& batch, const CPubKey& pubkey, const KeyOriginInfo& info);
|
bool AddKeyOriginWithDB(WalletBatch& batch, const CPubKey& pubkey, const KeyOriginInfo& info);
|
||||||
|
|
||||||
/* the HD chain data model (external chain counters) */
|
/* the HD chain data model (external chain counters) */
|
||||||
CHDChain hdChain;
|
CHDChain m_hd_chain;
|
||||||
|
|
||||||
/* HD derive new child key (on internal or external chain) */
|
/* HD derive new child key (on internal or external chain) */
|
||||||
void DeriveNewChildKey(WalletBatch& batch, CKeyMetadata& metadata, CKey& secret, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
|
void DeriveNewChildKey(WalletBatch& batch, CKeyMetadata& metadata, CKey& secret, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
|
||||||
|
|
||||||
std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
|
std::set<int64_t> setInternalKeyPool GUARDED_BY(cs_KeyStore);
|
||||||
std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
|
std::set<int64_t> setExternalKeyPool GUARDED_BY(cs_KeyStore);
|
||||||
|
@ -392,11 +392,11 @@ public:
|
||||||
void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
|
void LoadKeyMetadata(const CKeyID& keyID, const CKeyMetadata &metadata);
|
||||||
void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
|
void LoadScriptMetadata(const CScriptID& script_id, const CKeyMetadata &metadata);
|
||||||
//! Generate a new key
|
//! Generate a new key
|
||||||
CPubKey GenerateNewKey(WalletBatch& batch, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
|
CPubKey GenerateNewKey(WalletBatch& batch, CHDChain& hd_chain, bool internal = false) EXCLUSIVE_LOCKS_REQUIRED(cs_KeyStore);
|
||||||
|
|
||||||
/* Set the HD chain model (chain child index counters) */
|
/* Set the HD chain model (chain child index counters) */
|
||||||
void SetHDChain(const CHDChain& chain, bool memonly);
|
void SetHDChain(const CHDChain& chain, bool memonly);
|
||||||
const CHDChain& GetHDChain() const { return hdChain; }
|
const CHDChain& GetHDChain() const { return m_hd_chain; }
|
||||||
|
|
||||||
//! Adds a watch-only address to the store, without saving it to disk (used by LoadWallet)
|
//! Adds a watch-only address to the store, without saving it to disk (used by LoadWallet)
|
||||||
bool LoadWatchOnly(const CScript &dest);
|
bool LoadWatchOnly(const CScript &dest);
|
||||||
|
|
Loading…
Add table
Reference in a new issue