Browse Source
Support -checkmempool=N, which runs checks on average once every N transactions
pull/4/head
Pieter Wuille
9 years ago
committed by
Jack Grigg
No known key found for this signature in database
GPG Key ID: 665DBCD284F7DAFF
3 changed files with
12 additions and
6 deletions
-
src/init.cpp
-
src/txmempool.cpp
-
src/txmempool.h
|
|
@ -914,7 +914,10 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) |
|
|
|
InitWarning(_("Warning: Unsupported argument -benchmark ignored, use -debug=bench.")); |
|
|
|
|
|
|
|
// Checkmempool and checkblockindex default to true in regtest mode
|
|
|
|
mempool.setSanityCheck(GetBoolArg("-checkmempool", chainparams.DefaultConsistencyChecks())); |
|
|
|
int ratio = std::min<int>(std::max<int>(GetArg("-checkmempool", chainparams.DefaultConsistencyChecks() ? 1 : 0), 0), 1000000); |
|
|
|
if (ratio != 0) { |
|
|
|
mempool.setSanityCheck(1.0 / ratio); |
|
|
|
} |
|
|
|
fCheckBlockIndex = GetBoolArg("-checkblockindex", chainparams.DefaultConsistencyChecks()); |
|
|
|
fCheckpointsEnabled = GetBoolArg("-checkpoints", true); |
|
|
|
|
|
|
|
|
|
@ -55,7 +55,7 @@ CTxMemPool::CTxMemPool(const CFeeRate& _minRelayFee) : |
|
|
|
// Sanity checks off by default for performance, because otherwise
|
|
|
|
// accepting transactions becomes O(N^2) where N is the number
|
|
|
|
// of transactions in the pool
|
|
|
|
fSanityCheck = false; |
|
|
|
nCheckFrequency = 0; |
|
|
|
|
|
|
|
minerPolicyEstimator = new CBlockPolicyEstimator(_minRelayFee); |
|
|
|
} |
|
|
@ -179,7 +179,7 @@ void CTxMemPool::removeCoinbaseSpends(const CCoinsViewCache *pcoins, unsigned in |
|
|
|
if (it2 != mapTx.end()) |
|
|
|
continue; |
|
|
|
const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash); |
|
|
|
if (fSanityCheck) assert(coins); |
|
|
|
if (nCheckFrequency != 0) assert(coins); |
|
|
|
if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) { |
|
|
|
transactionsToRemove.push_back(tx); |
|
|
|
break; |
|
|
@ -287,7 +287,10 @@ void CTxMemPool::clear() |
|
|
|
|
|
|
|
void CTxMemPool::check(const CCoinsViewCache *pcoins) const |
|
|
|
{ |
|
|
|
if (!fSanityCheck) |
|
|
|
if (nCheckFrequency == 0) |
|
|
|
return; |
|
|
|
|
|
|
|
if (insecure_rand() >= nCheckFrequency) |
|
|
|
return; |
|
|
|
|
|
|
|
LogPrint("mempool", "Checking mempool with %u transactions and %u inputs\n", (unsigned int)mapTx.size(), (unsigned int)mapNextTx.size()); |
|
|
|
|
|
@ -118,7 +118,7 @@ public: |
|
|
|
class CTxMemPool |
|
|
|
{ |
|
|
|
private: |
|
|
|
bool fSanityCheck; //! Normally false, true if -checkmempool or -regtest
|
|
|
|
uint32_t nCheckFrequency; //! Value n means that n times in 2^32 we check.
|
|
|
|
unsigned int nTransactionsUpdated; |
|
|
|
CBlockPolicyEstimator* minerPolicyEstimator; |
|
|
|
|
|
|
@ -155,7 +155,7 @@ public: |
|
|
|
* check does nothing. |
|
|
|
*/ |
|
|
|
void check(const CCoinsViewCache *pcoins) const; |
|
|
|
void setSanityCheck(bool _fSanityCheck) { fSanityCheck = _fSanityCheck; } |
|
|
|
void setSanityCheck(double dFrequency = 1.0) { nCheckFrequency = dFrequency * 4294967296.0; } |
|
|
|
|
|
|
|
bool addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, bool fCurrentEstimate = true); |
|
|
|
void remove(const CTransaction &tx, std::list<CTransaction>& removed, bool fRecursive = false); |
|
|
|