Check all ancestor state in CTxMemPool::check()
This commit is contained in:
parent
e2eeb5dda7
commit
ce019bf90f
2 changed files with 23 additions and 6 deletions
|
@ -160,7 +160,7 @@ void CTxMemPool::UpdateTransactionsFromBlock(const std::vector<uint256> &vHashes
|
|||
}
|
||||
}
|
||||
|
||||
bool CTxMemPool::CalculateMemPoolAncestors(const CTxMemPoolEntry &entry, setEntries &setAncestors, uint64_t limitAncestorCount, uint64_t limitAncestorSize, uint64_t limitDescendantCount, uint64_t limitDescendantSize, std::string &errString, bool fSearchForParents /* = true */)
|
||||
bool CTxMemPool::CalculateMemPoolAncestors(const CTxMemPoolEntry &entry, setEntries &setAncestors, uint64_t limitAncestorCount, uint64_t limitAncestorSize, uint64_t limitDescendantCount, uint64_t limitDescendantSize, std::string &errString, bool fSearchForParents /* = true */) const
|
||||
{
|
||||
setEntries parentHashes;
|
||||
const CTransaction &tx = entry.GetTx();
|
||||
|
@ -666,10 +666,27 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const
|
|||
i++;
|
||||
}
|
||||
assert(setParentCheck == GetMemPoolParents(it));
|
||||
// Also check to make sure ancestor size/sigops are >= sum with immediate
|
||||
// parents.
|
||||
assert(it->GetSizeWithAncestors() >= parentSizes + it->GetTxSize());
|
||||
assert(it->GetSigOpCountWithAncestors() >= parentSigOpCount + it->GetSigOpCount());
|
||||
// Verify ancestor state is correct.
|
||||
setEntries setAncestors;
|
||||
uint64_t nNoLimit = std::numeric_limits<uint64_t>::max();
|
||||
std::string dummy;
|
||||
CalculateMemPoolAncestors(*it, setAncestors, nNoLimit, nNoLimit, nNoLimit, nNoLimit, dummy);
|
||||
uint64_t nCountCheck = setAncestors.size() + 1;
|
||||
uint64_t nSizeCheck = it->GetTxSize();
|
||||
CAmount nFeesCheck = it->GetModifiedFee();
|
||||
unsigned int nSigOpCheck = it->GetSigOpCount();
|
||||
|
||||
BOOST_FOREACH(txiter ancestorIt, setAncestors) {
|
||||
nSizeCheck += ancestorIt->GetTxSize();
|
||||
nFeesCheck += ancestorIt->GetModifiedFee();
|
||||
nSigOpCheck += ancestorIt->GetSigOpCount();
|
||||
}
|
||||
|
||||
assert(it->GetCountWithAncestors() == nCountCheck);
|
||||
assert(it->GetSizeWithAncestors() == nSizeCheck);
|
||||
assert(it->GetSigOpCountWithAncestors() == nSigOpCheck);
|
||||
assert(it->GetModFeesWithAncestors() == nFeesCheck);
|
||||
|
||||
// Check children against mapNextTx
|
||||
CTxMemPool::setEntries setChildrenCheck;
|
||||
std::map<COutPoint, CInPoint>::const_iterator iter = mapNextTx.lower_bound(COutPoint(it->GetTx().GetHash(), 0));
|
||||
|
|
|
@ -527,7 +527,7 @@ public:
|
|||
* fSearchForParents = whether to search a tx's vin for in-mempool parents, or
|
||||
* look up parents from mapLinks. Must be true for entries not in the mempool
|
||||
*/
|
||||
bool CalculateMemPoolAncestors(const CTxMemPoolEntry &entry, setEntries &setAncestors, uint64_t limitAncestorCount, uint64_t limitAncestorSize, uint64_t limitDescendantCount, uint64_t limitDescendantSize, std::string &errString, bool fSearchForParents = true);
|
||||
bool CalculateMemPoolAncestors(const CTxMemPoolEntry &entry, setEntries &setAncestors, uint64_t limitAncestorCount, uint64_t limitAncestorSize, uint64_t limitDescendantCount, uint64_t limitDescendantSize, std::string &errString, bool fSearchForParents = true) const;
|
||||
|
||||
/** Populate setDescendants with all in-mempool descendants of hash.
|
||||
* Assumes that setDescendants includes all in-mempool descendants of anything
|
||||
|
|
Loading…
Reference in a new issue