mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-12 06:58:57 +01:00
Cache tx Trust per-call to avoid DoS
This commit is contained in:
@@ -2294,6 +2294,12 @@ bool CWalletTx::InMempool() const
|
||||
}
|
||||
|
||||
bool CWalletTx::IsTrusted(interfaces::Chain::Lock& locked_chain) const
|
||||
{
|
||||
std::set<uint256> s;
|
||||
return IsTrusted(locked_chain, s);
|
||||
}
|
||||
|
||||
bool CWalletTx::IsTrusted(interfaces::Chain::Lock& locked_chain, std::set<uint256>& trustedParents) const
|
||||
{
|
||||
// Quick answer in most cases
|
||||
if (!locked_chain.checkFinalTx(*tx)) {
|
||||
@@ -2322,9 +2328,13 @@ bool CWalletTx::IsTrusted(interfaces::Chain::Lock& locked_chain) const
|
||||
// Check that this specific input being spent is trusted
|
||||
if (pwallet->IsMine(parentOut) != ISMINE_SPENDABLE)
|
||||
return false;
|
||||
// If we've already trusted this parent, continue
|
||||
if (trustedParents.count(parent->GetHash()))
|
||||
continue;
|
||||
// Recurse to check that the parent is also trusted
|
||||
if (!parent->IsTrusted(locked_chain))
|
||||
if (!parent->IsTrusted(locked_chain, trustedParents))
|
||||
return false;
|
||||
trustedParents.insert(parent->GetHash());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user