mempool: Fix max descendants check

The chain limits check for max descendants would check the descendants of the transaction itself even though the description for -limitdescendantcount says 'any ancestor'. This commit corrects the descendant count check by finding the top parent transaction in the mempool and comparing against that.
pull/12634/head
Karl-Johan Alm 7 years ago
parent b9ef21dd72
commit 46847d69d2
No known key found for this signature in database
GPG Key ID: 57AF762DB3353322

@ -1055,11 +1055,22 @@ void CTxMemPool::TrimToSize(size_t sizelimit, std::vector<COutPoint>* pvNoSpends
}
}
uint64_t CTxMemPool::CalculateDescendantMaximum(txiter entry) const {
// find top parent
txiter top = entry;
for (;;) {
const setEntries& parents = GetMemPoolParents(top);
if (parents.size() == 0) break;
top = *parents.begin();
}
return top->GetCountWithDescendants();
}
bool CTxMemPool::TransactionWithinChainLimit(const uint256& txid, size_t ancestor_limit, size_t descendant_limit) const {
LOCK(cs);
auto it = mapTx.find(txid);
return it == mapTx.end() || (it->GetCountWithAncestors() < ancestor_limit &&
it->GetCountWithDescendants() < descendant_limit);
CalculateDescendantMaximum(it) < descendant_limit);
}
SaltedTxidHasher::SaltedTxidHasher() : k0(GetRand(std::numeric_limits<uint64_t>::max())), k1(GetRand(std::numeric_limits<uint64_t>::max())) {}

@ -498,6 +498,7 @@ public:
const setEntries & GetMemPoolParents(txiter entry) const EXCLUSIVE_LOCKS_REQUIRED(cs);
const setEntries & GetMemPoolChildren(txiter entry) const EXCLUSIVE_LOCKS_REQUIRED(cs);
uint64_t CalculateDescendantMaximum(txiter entry) const EXCLUSIVE_LOCKS_REQUIRED(cs);
private:
typedef std::map<txiter, setEntries, CompareIteratorByHash> cacheMap;

Loading…
Cancel
Save