mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-13 15:39:05 +01:00
Merge bitcoin/bitcoin#20191: wallet, refactor: make DescriptorScriptPubKeyMan agnostic of internal flag
181181019crefactor: remove m_internal from DescriptorSPKman (S3RK) Pull request description: Rationale: improve consistency between `CWallet` and `DescriptorScriptPubKeyMan`; simplify `ScriptPubKeyMan` interface. Descriptor in itself is neither internal or external. It's responsibility of a wallet to assign and manage descriptors for a specific purpose. Duplicating information about internalness of a descriptor could lead to inconsistencies and unexpected behaviour (for example misreporting keypool size). ACKs for top commit: instagibbs: reACK181181019cachow101: reACK181181019cTree-SHA512: d5613b7f6795b290bfa0fd8cb0536de1714d0cf72cba402266bd06d550758ebad690b54fc0a336a1c7414b5814aa4a37c90a6ae89926474a97d30956d7e034ff
This commit is contained in:
@@ -2094,9 +2094,14 @@ size_t CWallet::KeypoolCountExternalKeys() const
|
||||
{
|
||||
AssertLockHeld(cs_wallet);
|
||||
|
||||
auto legacy_spk_man = GetLegacyScriptPubKeyMan();
|
||||
if (legacy_spk_man) {
|
||||
return legacy_spk_man->KeypoolCountExternalKeys();
|
||||
}
|
||||
|
||||
unsigned int count = 0;
|
||||
for (auto spk_man : GetActiveScriptPubKeyMans()) {
|
||||
count += spk_man->KeypoolCountExternalKeys();
|
||||
for (auto spk_man : m_external_spk_managers) {
|
||||
count += spk_man.second->GetKeyPoolSize();
|
||||
}
|
||||
|
||||
return count;
|
||||
@@ -3112,7 +3117,7 @@ void CWallet::SetupDescriptorScriptPubKeyMans()
|
||||
// TODO: Setup taproot (bech32m) descriptors by default
|
||||
continue;
|
||||
}
|
||||
auto spk_manager = std::unique_ptr<DescriptorScriptPubKeyMan>(new DescriptorScriptPubKeyMan(*this, internal));
|
||||
auto spk_manager = std::unique_ptr<DescriptorScriptPubKeyMan>(new DescriptorScriptPubKeyMan(*this));
|
||||
if (IsCrypted()) {
|
||||
if (IsLocked()) {
|
||||
throw std::runtime_error(std::string(__func__) + ": Wallet is locked, cannot setup new descriptors");
|
||||
@@ -3121,7 +3126,7 @@ void CWallet::SetupDescriptorScriptPubKeyMans()
|
||||
throw std::runtime_error(std::string(__func__) + ": Could not encrypt new descriptors");
|
||||
}
|
||||
}
|
||||
spk_manager->SetupDescriptorGeneration(master_key, t);
|
||||
spk_manager->SetupDescriptorGeneration(master_key, t, internal);
|
||||
uint256 id = spk_manager->GetID();
|
||||
m_spk_managers[id] = std::move(spk_manager);
|
||||
AddActiveScriptPubKeyMan(id, t, internal);
|
||||
@@ -3147,7 +3152,7 @@ void CWallet::SetupDescriptorScriptPubKeyMans()
|
||||
continue;
|
||||
}
|
||||
OutputType t = *desc->GetOutputType();
|
||||
auto spk_manager = std::unique_ptr<ExternalSignerScriptPubKeyMan>(new ExternalSignerScriptPubKeyMan(*this, internal));
|
||||
auto spk_manager = std::unique_ptr<ExternalSignerScriptPubKeyMan>(new ExternalSignerScriptPubKeyMan(*this));
|
||||
spk_manager->SetupDescriptor(std::move(desc));
|
||||
uint256 id = spk_manager->GetID();
|
||||
m_spk_managers[id] = std::move(spk_manager);
|
||||
@@ -3176,7 +3181,6 @@ void CWallet::LoadActiveScriptPubKeyMan(uint256 id, OutputType type, bool intern
|
||||
auto& spk_mans = internal ? m_internal_spk_managers : m_external_spk_managers;
|
||||
auto& spk_mans_other = internal ? m_external_spk_managers : m_internal_spk_managers;
|
||||
auto spk_man = m_spk_managers.at(id).get();
|
||||
spk_man->SetInternal(internal);
|
||||
spk_mans[type] = spk_man;
|
||||
|
||||
if (spk_mans_other[type] == spk_man) {
|
||||
|
||||
Reference in New Issue
Block a user