Browse Source

Check all ancestor state in CTxMemPool::check()

0.13
Suhas Daftuar 9 years ago
parent
commit
ce019bf90f
  1. 27
      src/txmempool.cpp
  2. 2
      src/txmempool.h

27
src/txmempool.cpp

@ -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; setEntries parentHashes;
const CTransaction &tx = entry.GetTx(); const CTransaction &tx = entry.GetTx();
@ -666,10 +666,27 @@ void CTxMemPool::check(const CCoinsViewCache *pcoins) const
i++; i++;
} }
assert(setParentCheck == GetMemPoolParents(it)); assert(setParentCheck == GetMemPoolParents(it));
// Also check to make sure ancestor size/sigops are >= sum with immediate // Verify ancestor state is correct.
// parents. setEntries setAncestors;
assert(it->GetSizeWithAncestors() >= parentSizes + it->GetTxSize()); uint64_t nNoLimit = std::numeric_limits<uint64_t>::max();
assert(it->GetSigOpCountWithAncestors() >= parentSigOpCount + it->GetSigOpCount()); 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 // Check children against mapNextTx
CTxMemPool::setEntries setChildrenCheck; CTxMemPool::setEntries setChildrenCheck;
std::map<COutPoint, CInPoint>::const_iterator iter = mapNextTx.lower_bound(COutPoint(it->GetTx().GetHash(), 0)); std::map<COutPoint, CInPoint>::const_iterator iter = mapNextTx.lower_bound(COutPoint(it->GetTx().GetHash(), 0));

2
src/txmempool.h

@ -527,7 +527,7 @@ public:
* fSearchForParents = whether to search a tx's vin for in-mempool parents, or * 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 * 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. /** Populate setDescendants with all in-mempool descendants of hash.
* Assumes that setDescendants includes all in-mempool descendants of anything * Assumes that setDescendants includes all in-mempool descendants of anything

Loading…
Cancel
Save