wallet: decouple IsSpentKey(scriptPubKey) from IsSpentKey(hash, n)

This will be used in a follow-up commit to prevent extra 'GetWalletTx' lookups if the function caller already have the wtx and can just provide the scriptPubKey directly.
This commit is contained in:
furszy committed 2022-06-08 11:22:39 -03:00
1 parent a06fa94ff8
commit 3d8a282257
2 files changed
+31 -25

No files matched your search

+30 -25
View File
@@ -910,31 +910,36 @@ bool CWallet::IsSpentKey(const uint256& hash, unsigned int n) const
{ {
AssertLockHeld(cs_wallet); AssertLockHeld(cs_wallet);
const CWalletTx* srctx = GetWalletTx(hash); const CWalletTx* srctx = GetWalletTx(hash);
if (srctx) { if (!srctx) return false;
assert(srctx->tx->vout.size() > n); assert(srctx->tx->vout.size() > n);
CTxDestination dest; return IsSpentKey(srctx->tx->vout[n].scriptPubKey);
if (!ExtractDestination(srctx->tx->vout[n].scriptPubKey, dest)) { }
return false;
} bool CWallet::IsSpentKey(const CScript& scriptPubKey) const
if (IsAddressUsed(dest)) { {
return true; AssertLockHeld(cs_wallet);
} CTxDestination dest;
if (IsLegacy()) { if (!ExtractDestination(scriptPubKey, dest)) {
LegacyScriptPubKeyMan* spk_man = GetLegacyScriptPubKeyMan(); return false;
assert(spk_man != nullptr); }
for (const auto& keyid : GetAffectedKeys(srctx->tx->vout[n].scriptPubKey, *spk_man)) { if (IsAddressUsed(dest)) {
WitnessV0KeyHash wpkh_dest(keyid); return true;
if (IsAddressUsed(wpkh_dest)) { }
return true; if (IsLegacy()) {
} LegacyScriptPubKeyMan* spk_man = GetLegacyScriptPubKeyMan();
ScriptHash sh_wpkh_dest(GetScriptForDestination(wpkh_dest)); assert(spk_man != nullptr);
if (IsAddressUsed(sh_wpkh_dest)) { for (const auto& keyid : GetAffectedKeys(scriptPubKey, *spk_man)) {
return true; WitnessV0KeyHash wpkh_dest(keyid);
} if (IsAddressUsed(wpkh_dest)) {
PKHash pkh_dest(keyid); return true;
if (IsAddressUsed(pkh_dest)) { }
return true; ScriptHash sh_wpkh_dest(GetScriptForDestination(wpkh_dest));
} if (IsAddressUsed(sh_wpkh_dest)) {
return true;
}
PKHash pkh_dest(keyid);
if (IsAddressUsed(pkh_dest)) {
return true;
} }
} }
} }
+1
View File
@@ -445,6 +445,7 @@ public:
// Whether this or any known UTXO with the same single key has been spent. // Whether this or any known UTXO with the same single key has been spent.
bool IsSpentKey(const uint256& hash, unsigned int n) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet); bool IsSpentKey(const uint256& hash, unsigned int n) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
bool IsSpentKey(const CScript& scriptPubKey) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
void SetSpentKeyState(WalletBatch& batch, const uint256& hash, unsigned int n, bool used, std::set<CTxDestination>& tx_destinations) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet); void SetSpentKeyState(WalletBatch& batch, const uint256& hash, unsigned int n, bool used, std::set<CTxDestination>& tx_destinations) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
/** Display address on an external signer. Returns false if external signer support is not compiled */ /** Display address on an external signer. Returns false if external signer support is not compiled */