mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
Merge bitcoin/bitcoin#20191: wallet, refactor: make DescriptorScriptPubKeyMan agnostic of internal flag
181181019c5baa3e2d5b675d1843a45aa028781c refactor: 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:
reACK 181181019c
achow101:
reACK 181181019c5baa3e2d5b675d1843a45aa028781c
Tree-SHA512: d5613b7f6795b290bfa0fd8cb0536de1714d0cf72cba402266bd06d550758ebad690b54fc0a336a1c7414b5814aa4a37c90a6ae89926474a97d30956d7e034ff
This commit is contained in:
parent
397fe9c0a5
commit
cba01aa8f9
@ -1779,12 +1779,10 @@ bool LegacyScriptPubKeyMan::GetHDChain(CHDChain& hdChainRet) const
|
|||||||
return !m_hd_chain.IsNull();
|
return !m_hd_chain.IsNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
void LegacyScriptPubKeyMan::SetInternal(bool internal) {}
|
|
||||||
|
|
||||||
bool DescriptorScriptPubKeyMan::GetNewDestination(CTxDestination& dest, bilingual_str& error)
|
bool DescriptorScriptPubKeyMan::GetNewDestination(CTxDestination& dest, bilingual_str& error)
|
||||||
{
|
{
|
||||||
// Returns true if this descriptor supports getting new addresses. Conditions where we may be unable to fetch them (e.g. locked) are caught later
|
// Returns true if this descriptor supports getting new addresses. Conditions where we may be unable to fetch them (e.g. locked) are caught later
|
||||||
if (!CanGetAddresses(m_internal)) {
|
if (!CanGetAddresses()) {
|
||||||
error = _("No addresses available");
|
error = _("No addresses available");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2042,7 +2040,7 @@ bool DescriptorScriptPubKeyMan::AddDescriptorKeyWithDB(WalletBatch& batch, const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DescriptorScriptPubKeyMan::SetupDescriptorGeneration(const CExtKey& master_key)
|
bool DescriptorScriptPubKeyMan::SetupDescriptorGeneration(const CExtKey& master_key, bool internal)
|
||||||
{
|
{
|
||||||
LOCK(cs_desc_man);
|
LOCK(cs_desc_man);
|
||||||
assert(m_storage.IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS));
|
assert(m_storage.IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS));
|
||||||
@ -2060,7 +2058,7 @@ bool DescriptorScriptPubKeyMan::SetupDescriptorGeneration(const CExtKey& master_
|
|||||||
std::string desc_prefix = strprintf("pkh(%s/44'/%d'", xpub, Params().ExtCoinType());
|
std::string desc_prefix = strprintf("pkh(%s/44'/%d'", xpub, Params().ExtCoinType());
|
||||||
std::string desc_suffix = "/*)";
|
std::string desc_suffix = "/*)";
|
||||||
|
|
||||||
std::string internal_path = m_internal ? "/1" : "/0";
|
std::string internal_path = internal ? "/1" : "/0";
|
||||||
std::string desc_str = desc_prefix + "/0'" + internal_path + desc_suffix;
|
std::string desc_str = desc_prefix + "/0'" + internal_path + desc_suffix;
|
||||||
|
|
||||||
// Make the descriptor
|
// Make the descriptor
|
||||||
@ -2115,13 +2113,6 @@ int64_t DescriptorScriptPubKeyMan::GetOldestKeyPoolTime() const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t DescriptorScriptPubKeyMan::KeypoolCountExternalKeys() const
|
|
||||||
{
|
|
||||||
if (m_internal) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return GetKeyPoolSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int DescriptorScriptPubKeyMan::GetKeyPoolSize() const
|
unsigned int DescriptorScriptPubKeyMan::GetKeyPoolSize() const
|
||||||
{
|
{
|
||||||
@ -2332,11 +2323,6 @@ uint256 DescriptorScriptPubKeyMan::GetID() const
|
|||||||
return m_wallet_descriptor.id;
|
return m_wallet_descriptor.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DescriptorScriptPubKeyMan::SetInternal(bool internal)
|
|
||||||
{
|
|
||||||
this->m_internal = internal;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DescriptorScriptPubKeyMan::SetCache(const DescriptorCache& cache)
|
void DescriptorScriptPubKeyMan::SetCache(const DescriptorCache& cache)
|
||||||
{
|
{
|
||||||
LOCK(cs_desc_man);
|
LOCK(cs_desc_man);
|
||||||
|
@ -195,7 +195,6 @@ public:
|
|||||||
|
|
||||||
virtual int64_t GetOldestKeyPoolTime() const { return GetTime(); }
|
virtual int64_t GetOldestKeyPoolTime() const { return GetTime(); }
|
||||||
|
|
||||||
virtual size_t KeypoolCountExternalKeys() const { return 0; }
|
|
||||||
virtual unsigned int GetKeyPoolSize() const { return 0; }
|
virtual unsigned int GetKeyPoolSize() const { return 0; }
|
||||||
|
|
||||||
virtual int64_t GetTimeFirstKey() const { return 0; }
|
virtual int64_t GetTimeFirstKey() const { return 0; }
|
||||||
@ -219,8 +218,6 @@ public:
|
|||||||
|
|
||||||
virtual uint256 GetID() const { return uint256(); }
|
virtual uint256 GetID() const { return uint256(); }
|
||||||
|
|
||||||
virtual void SetInternal(bool internal) {}
|
|
||||||
|
|
||||||
/** Prepends the wallet name in logging output to ease debugging in multi-wallet use cases */
|
/** Prepends the wallet name in logging output to ease debugging in multi-wallet use cases */
|
||||||
template<typename... Params>
|
template<typename... Params>
|
||||||
void WalletLogPrintf(std::string fmt, Params... parameters) const {
|
void WalletLogPrintf(std::string fmt, Params... parameters) const {
|
||||||
@ -345,8 +342,7 @@ public:
|
|||||||
void RewriteDB() override;
|
void RewriteDB() override;
|
||||||
|
|
||||||
int64_t GetOldestKeyPoolTime() const override;
|
int64_t GetOldestKeyPoolTime() const override;
|
||||||
size_t KeypoolCountExternalKeys() const override;
|
size_t KeypoolCountExternalKeys() const;
|
||||||
|
|
||||||
unsigned int GetKeyPoolSize() const override;
|
unsigned int GetKeyPoolSize() const override;
|
||||||
|
|
||||||
int64_t GetTimeFirstKey() const override;
|
int64_t GetTimeFirstKey() const override;
|
||||||
@ -366,8 +362,6 @@ public:
|
|||||||
|
|
||||||
uint256 GetID() const override;
|
uint256 GetID() const override;
|
||||||
|
|
||||||
void SetInternal(bool internal) override;
|
|
||||||
|
|
||||||
// Map from Key ID to key metadata.
|
// Map from Key ID to key metadata.
|
||||||
std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
|
std::map<CKeyID, CKeyMetadata> mapKeyMetadata GUARDED_BY(cs_KeyStore);
|
||||||
|
|
||||||
@ -520,8 +514,6 @@ private:
|
|||||||
PubKeyMap m_map_pubkeys GUARDED_BY(cs_desc_man);
|
PubKeyMap m_map_pubkeys GUARDED_BY(cs_desc_man);
|
||||||
int32_t m_max_cached_index = -1;
|
int32_t m_max_cached_index = -1;
|
||||||
|
|
||||||
bool m_internal = false;
|
|
||||||
|
|
||||||
KeyMap m_map_keys GUARDED_BY(cs_desc_man);
|
KeyMap m_map_keys GUARDED_BY(cs_desc_man);
|
||||||
CryptedKeyMap m_map_crypted_keys GUARDED_BY(cs_desc_man);
|
CryptedKeyMap m_map_crypted_keys GUARDED_BY(cs_desc_man);
|
||||||
|
|
||||||
@ -544,9 +536,8 @@ public:
|
|||||||
: ScriptPubKeyMan(storage),
|
: ScriptPubKeyMan(storage),
|
||||||
m_wallet_descriptor(descriptor)
|
m_wallet_descriptor(descriptor)
|
||||||
{}
|
{}
|
||||||
DescriptorScriptPubKeyMan(WalletStorage& storage, bool internal)
|
DescriptorScriptPubKeyMan(WalletStorage& storage)
|
||||||
: ScriptPubKeyMan(storage),
|
: ScriptPubKeyMan(storage)
|
||||||
m_internal(internal)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
mutable RecursiveMutex cs_desc_man;
|
mutable RecursiveMutex cs_desc_man;
|
||||||
@ -571,12 +562,11 @@ public:
|
|||||||
bool IsHDEnabled() const override;
|
bool IsHDEnabled() const override;
|
||||||
|
|
||||||
//! Setup descriptors based on the given CExtkey
|
//! Setup descriptors based on the given CExtkey
|
||||||
bool SetupDescriptorGeneration(const CExtKey& master_key);
|
bool SetupDescriptorGeneration(const CExtKey& master_key, bool internal);
|
||||||
|
|
||||||
bool HavePrivateKeys() const override;
|
bool HavePrivateKeys() const override;
|
||||||
|
|
||||||
int64_t GetOldestKeyPoolTime() const override;
|
int64_t GetOldestKeyPoolTime() const override;
|
||||||
size_t KeypoolCountExternalKeys() const override;
|
|
||||||
unsigned int GetKeyPoolSize() const override;
|
unsigned int GetKeyPoolSize() const override;
|
||||||
|
|
||||||
int64_t GetTimeFirstKey() const override;
|
int64_t GetTimeFirstKey() const override;
|
||||||
@ -596,8 +586,6 @@ public:
|
|||||||
|
|
||||||
uint256 GetID() const override;
|
uint256 GetID() const override;
|
||||||
|
|
||||||
void SetInternal(bool internal) override;
|
|
||||||
|
|
||||||
void SetCache(const DescriptorCache& cache);
|
void SetCache(const DescriptorCache& cache);
|
||||||
|
|
||||||
bool AddKey(const CKeyID& key_id, const CKey& key);
|
bool AddKey(const CKeyID& key_id, const CKey& key);
|
||||||
|
@ -4145,9 +4145,14 @@ size_t CWallet::KeypoolCountExternalKeys() const
|
|||||||
{
|
{
|
||||||
AssertLockHeld(cs_wallet);
|
AssertLockHeld(cs_wallet);
|
||||||
|
|
||||||
|
auto legacy_spk_man = GetLegacyScriptPubKeyMan();
|
||||||
|
if (legacy_spk_man) {
|
||||||
|
return legacy_spk_man->KeypoolCountExternalKeys();
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int count = 0;
|
unsigned int count = 0;
|
||||||
for (auto spk_man : GetActiveScriptPubKeyMans()) {
|
if (m_external_spk_managers) {
|
||||||
count += spk_man->KeypoolCountExternalKeys();
|
count += m_external_spk_managers->GetKeyPoolSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
@ -5847,7 +5852,7 @@ void CWallet::SetupDescriptorScriptPubKeyMans()
|
|||||||
|
|
||||||
for (bool internal : {false, true}) {
|
for (bool internal : {false, true}) {
|
||||||
{ // OUTPUT_TYPE is only one: LEGACY
|
{ // OUTPUT_TYPE is only one: LEGACY
|
||||||
auto spk_manager = std::unique_ptr<DescriptorScriptPubKeyMan>(new DescriptorScriptPubKeyMan(*this, internal));
|
auto spk_manager = std::unique_ptr<DescriptorScriptPubKeyMan>(new DescriptorScriptPubKeyMan(*this));
|
||||||
if (IsCrypted()) {
|
if (IsCrypted()) {
|
||||||
if (IsLocked()) {
|
if (IsLocked()) {
|
||||||
throw std::runtime_error(std::string(__func__) + ": Wallet is locked, cannot setup new descriptors");
|
throw std::runtime_error(std::string(__func__) + ": Wallet is locked, cannot setup new descriptors");
|
||||||
@ -5856,7 +5861,7 @@ void CWallet::SetupDescriptorScriptPubKeyMans()
|
|||||||
throw std::runtime_error(std::string(__func__) + ": Could not encrypt new descriptors");
|
throw std::runtime_error(std::string(__func__) + ": Could not encrypt new descriptors");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spk_manager->SetupDescriptorGeneration(master_key);
|
spk_manager->SetupDescriptorGeneration(master_key, internal);
|
||||||
uint256 id = spk_manager->GetID();
|
uint256 id = spk_manager->GetID();
|
||||||
m_spk_managers[id] = std::move(spk_manager);
|
m_spk_managers[id] = std::move(spk_manager);
|
||||||
AddActiveScriptPubKeyMan(id, internal);
|
AddActiveScriptPubKeyMan(id, internal);
|
||||||
@ -5883,7 +5888,6 @@ void CWallet::LoadActiveScriptPubKeyMan(uint256 id, bool internal)
|
|||||||
auto& spk_mans = internal ? m_internal_spk_managers : m_external_spk_managers;
|
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_mans_other = internal ? m_external_spk_managers : m_internal_spk_managers;
|
||||||
auto spk_man = m_spk_managers.at(id).get();
|
auto spk_man = m_spk_managers.at(id).get();
|
||||||
spk_man->SetInternal(internal);
|
|
||||||
spk_mans = spk_man;
|
spk_mans = spk_man;
|
||||||
|
|
||||||
if (spk_mans_other == spk_man) {
|
if (spk_mans_other == spk_man) {
|
||||||
|
Loading…
Reference in New Issue
Block a user