Cache tx Trust per-call to avoid DoS

This commit is contained in:
Jeremy Rubin 2019-08-30 13:25:41 -07:00
parent dce032ce29
commit 595f09d6de
2 changed files with 12 additions and 1 deletions

View File

@ -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;
}

View File

@ -616,6 +616,7 @@ public:
bool InMempool() const;
bool IsTrusted(interfaces::Chain::Lock& locked_chain) const;
bool IsTrusted(interfaces::Chain::Lock& locked_chain, std::set<uint256>& trustedParents) const;
int64_t GetTxTime() const;