mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-15 12:51:00 +02:00
Merge 4ee8a58ce7 into merged_master (Bitcoin PR #17373)
This PR associates OutputType::BECH32 to PAK online keys, where before we were able to directly access keys from the keypool. In a future refactoring we should give PAK keys their own output type (and own scriptpubkey manager) so that the wallet won't accept payments "to the PAK key". Also changes `ReserveDestination::SetBlindingPubKey` to use a visitor pattern to apply a blinding pubkey to a destination directly, rather than using the old hacky method of regenerating the destination by pulling its key (which is no longer contained in the class) out and giving it to a new constructor. This was a long-overdue refactoring and the minimal-diff way to get the code compiling (and it's not bad, maybe 10LOC to add a new visitor class) but nonetheless I apologize for sticking this into a merge commit.
This commit is contained in:
commit
381cd9cd01
7 changed files with 55 additions and 68 deletions
|
|
@ -18,7 +18,7 @@ bool LegacyScriptPubKeyMan::GetNewDestination(const OutputType type, CTxDestinat
|
|||
|
||||
// Generate a new key that is added to wallet
|
||||
CPubKey new_key;
|
||||
if (!GetKeyFromPool(new_key)) {
|
||||
if (!GetKeyFromPool(new_key, type)) {
|
||||
error = "Error: Keypool ran out, please call keypoolrefill first";
|
||||
return false;
|
||||
}
|
||||
|
|
@ -26,7 +26,7 @@ bool LegacyScriptPubKeyMan::GetNewDestination(const OutputType type, CTxDestinat
|
|||
dest = GetDestinationForKey(new_key, type);
|
||||
if (add_blinding_key) {
|
||||
CPubKey blinding_pubkey = GetBlindingPubKey(GetScriptForDestination(dest));
|
||||
dest = GetDestinationForKey(new_key, type, blinding_pubkey);
|
||||
boost::apply_visitor(SetBlindingPubKeyVisitor(blinding_pubkey), dest);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -273,24 +273,19 @@ bool LegacyScriptPubKeyMan::EncryptKeys(CKeyingMaterial& vMasterKeyIn)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool LegacyScriptPubKeyMan::GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool)
|
||||
bool LegacyScriptPubKeyMan::GetReservedDestination(const OutputType type, bool internal, CTxDestination& address, int64_t& index, CKeyPool& keypool)
|
||||
{
|
||||
if (!CanGetAddresses(internal)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ReserveKeyFromKeyPool(index, keypool, internal)) {
|
||||
return false;
|
||||
}
|
||||
address = GetDestinationForKey(keypool.vchPubKey, type);
|
||||
return true;
|
||||
}
|
||||
|
||||
void LegacyScriptPubKeyMan::KeepDestination(int64_t index)
|
||||
{
|
||||
KeepKey(index);
|
||||
}
|
||||
|
||||
void LegacyScriptPubKeyMan::ReturnDestination(int64_t index, bool internal, const CPubKey& pubkey)
|
||||
{
|
||||
ReturnKey(index, internal, pubkey);
|
||||
}
|
||||
|
||||
void LegacyScriptPubKeyMan::MarkUnusedAddresses(const CScript& script)
|
||||
{
|
||||
AssertLockHeld(cs_wallet);
|
||||
|
|
@ -471,7 +466,7 @@ size_t LegacyScriptPubKeyMan::KeypoolCountExternalKeys()
|
|||
unsigned int LegacyScriptPubKeyMan::GetKeyPoolSize() const
|
||||
{
|
||||
AssertLockHeld(cs_wallet);
|
||||
return setInternalKeyPool.size() + setExternalKeyPool.size();
|
||||
return setInternalKeyPool.size() + setExternalKeyPool.size() + set_pre_split_keypool.size();
|
||||
}
|
||||
|
||||
int64_t LegacyScriptPubKeyMan::GetTimeFirstKey() const
|
||||
|
|
@ -1103,15 +1098,20 @@ void LegacyScriptPubKeyMan::AddKeypoolPubkeyWithDB(const CPubKey& pubkey, const
|
|||
m_pool_key_to_index[pubkey.GetID()] = index;
|
||||
}
|
||||
|
||||
void LegacyScriptPubKeyMan::KeepKey(int64_t nIndex)
|
||||
void LegacyScriptPubKeyMan::KeepDestination(int64_t nIndex, const OutputType& type)
|
||||
{
|
||||
// Remove from key pool
|
||||
WalletBatch batch(m_storage.GetDatabase());
|
||||
batch.ErasePool(nIndex);
|
||||
CPubKey pubkey;
|
||||
bool have_pk = GetPubKey(m_index_to_reserved_key.at(nIndex), pubkey);
|
||||
assert(have_pk);
|
||||
LearnRelatedScripts(pubkey, type);
|
||||
m_index_to_reserved_key.erase(nIndex);
|
||||
WalletLogPrintf("keypool keep %d\n", nIndex);
|
||||
}
|
||||
|
||||
void LegacyScriptPubKeyMan::ReturnKey(int64_t nIndex, bool fInternal, const CPubKey& pubkey)
|
||||
void LegacyScriptPubKeyMan::ReturnDestination(int64_t nIndex, bool fInternal, const CTxDestination&)
|
||||
{
|
||||
// Return to key pool
|
||||
{
|
||||
|
|
@ -1123,13 +1123,15 @@ void LegacyScriptPubKeyMan::ReturnKey(int64_t nIndex, bool fInternal, const CPub
|
|||
} else {
|
||||
setExternalKeyPool.insert(nIndex);
|
||||
}
|
||||
m_pool_key_to_index[pubkey.GetID()] = nIndex;
|
||||
CKeyID& pubkey_id = m_index_to_reserved_key.at(nIndex);
|
||||
m_pool_key_to_index[pubkey_id] = nIndex;
|
||||
m_index_to_reserved_key.erase(nIndex);
|
||||
NotifyCanGetAddressesChanged();
|
||||
}
|
||||
WalletLogPrintf("keypool return %d\n", nIndex);
|
||||
}
|
||||
|
||||
bool LegacyScriptPubKeyMan::GetKeyFromPool(CPubKey& result, bool internal)
|
||||
bool LegacyScriptPubKeyMan::GetKeyFromPool(CPubKey& result, const OutputType type, bool internal)
|
||||
{
|
||||
if (!CanGetAddresses(internal)) {
|
||||
return false;
|
||||
|
|
@ -1145,7 +1147,7 @@ bool LegacyScriptPubKeyMan::GetKeyFromPool(CPubKey& result, bool internal)
|
|||
result = GenerateNewKey(batch, internal);
|
||||
return true;
|
||||
}
|
||||
KeepKey(nIndex);
|
||||
KeepDestination(nIndex, type);
|
||||
result = keypool.vchPubKey;
|
||||
}
|
||||
return true;
|
||||
|
|
@ -1190,6 +1192,8 @@ bool LegacyScriptPubKeyMan::ReserveKeyFromKeyPool(int64_t& nIndex, CKeyPool& key
|
|||
throw std::runtime_error(std::string(__func__) + ": keypool entry invalid");
|
||||
}
|
||||
|
||||
assert(m_index_to_reserved_key.count(nIndex) == 0);
|
||||
m_index_to_reserved_key[nIndex] = keypool.vchPubKey.GetID();
|
||||
m_pool_key_to_index.erase(keypool.vchPubKey.GetID());
|
||||
WalletLogPrintf("keypool reserve %d\n", nIndex);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue