diff --git a/src/wallet/scriptpubkeyman.h b/src/wallet/scriptpubkeyman.h --- a/src/wallet/scriptpubkeyman.h +++ b/src/wallet/scriptpubkeyman.h @@ -39,6 +39,9 @@ //! Default for -keypool static const unsigned int DEFAULT_KEYPOOL_SIZE = 1000; +std::vector GetAffectedKeys(const CScript &spk, + const SigningProvider &provider); + /** * A key from a CWallet's keypool * @@ -170,6 +173,9 @@ virtual bool TopUp(unsigned int size = 0) { return false; } + //! Mark unused addresses as being used + virtual void MarkUnusedAddresses(const CScript &script) {} + /* Returns true if HD is enabled */ virtual bool IsHDEnabled() const { return false; } @@ -293,6 +299,8 @@ bool TopUp(unsigned int size = 0) override; + void MarkUnusedAddresses(const CScript &script) override; + //! Upgrade stored CKeyMetadata objects to store key origin info as //! KeyOriginInfo void UpgradeKeyMetadata() EXCLUSIVE_LOCKS_REQUIRED(cs_wallet); diff --git a/src/wallet/scriptpubkeyman.cpp b/src/wallet/scriptpubkeyman.cpp --- a/src/wallet/scriptpubkeyman.cpp +++ b/src/wallet/scriptpubkeyman.cpp @@ -236,6 +236,27 @@ return TopUpKeyPool(size); } +void LegacyScriptPubKeyMan::MarkUnusedAddresses(const CScript &script) { + AssertLockHeld(cs_wallet); + // extract addresses and check if they match with an unused keypool key + for (const auto &keyid : GetAffectedKeys(script, *this)) { + std::map::const_iterator mi = + m_pool_key_to_index.find(keyid); + if (mi != m_pool_key_to_index.end()) { + WalletLogPrintf("%s: Detected a used keypool key, mark all keypool " + "key up to this key as used\n", + __func__); + MarkReserveKeysAsUsed(mi->second); + + if (!TopUpKeyPool()) { + WalletLogPrintf( + "%s: Topping up keypool failed (locked wallet)\n", + __func__); + } + } + } +} + void LegacyScriptPubKeyMan::UpgradeKeyMetadata() { AssertLockHeld(cs_wallet); if (m_storage.IsLocked() || diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -1374,11 +1374,6 @@ AssertLockHeld(m_spk_man->cs_wallet); m_spk_man->MarkPreSplitKeys(); } - void MarkReserveKeysAsUsed(int64_t keypool_id) - EXCLUSIVE_LOCKS_REQUIRED(cs_wallet) { - AssertLockHeld(m_spk_man->cs_wallet); - m_spk_man->MarkReserveKeysAsUsed(keypool_id); - } using CryptedKeyMap = LegacyScriptPubKeyMan::CryptedKeyMap; }; diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -257,9 +257,6 @@ nDepth, FormatMoney(tx->tx->vout[i].nValue)); } -std::vector GetAffectedKeys(const CScript &spk, - const SigningProvider &provider); - const CWalletTx *CWallet::GetWalletTx(const TxId &txid) const { LOCK(cs_wallet); std::map::const_iterator it = mapWallet.find(txid); @@ -943,24 +940,8 @@ // loop though all outputs for (const CTxOut &txout : tx.vout) { - // extract addresses and check if they match with an unused keypool - // key - for (const auto &keyid : - GetAffectedKeys(txout.scriptPubKey, *m_spk_man)) { - std::map::const_iterator mi = - m_spk_man->m_pool_key_to_index.find(keyid); - if (mi != m_spk_man->m_pool_key_to_index.end()) { - WalletLogPrintf("%s: Detected a used keypool key, mark all " - "keypool key up to this key as used\n", - __func__); - MarkReserveKeysAsUsed(mi->second); - - if (!m_spk_man->TopUp()) { - WalletLogPrintf( - "%s: Topping up keypool failed (locked wallet)\n", - __func__); - } - } + if (auto spk_man = m_spk_man.get()) { + spk_man->MarkUnusedAddresses(txout.scriptPubKey); } }