doc: explain AcceptToMemoryPoolWorker's coins_to_uncache
This commit is contained in:
parent
ab46fe6ec1
commit
5d26205272
2 changed files with 20 additions and 0 deletions
|
@ -294,6 +294,10 @@ public:
|
||||||
bool HaveInputs(const CTransaction& tx) const;
|
bool HaveInputs(const CTransaction& tx) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/**
|
||||||
|
* @note this is marked const, but may actually append to `cacheCoins`, increasing
|
||||||
|
* memory usage.
|
||||||
|
*/
|
||||||
CCoinsMap::iterator FetchCoin(const COutPoint &outpoint) const;
|
CCoinsMap::iterator FetchCoin(const COutPoint &outpoint) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -565,6 +565,13 @@ static bool CheckInputsFromMempoolAndCache(const CTransaction& tx, CValidationSt
|
||||||
return CheckInputs(tx, state, view, true, flags, cacheSigStore, true, txdata);
|
return CheckInputs(tx, state, view, true, flags, cacheSigStore, true, txdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param[out] coins_to_uncache Return any outpoints which were not previously present in the
|
||||||
|
* coins cache, but were added as a result of validating the tx
|
||||||
|
* for mempool acceptance. This allows the caller to optionally
|
||||||
|
* remove the cache additions if the associated transaction ends
|
||||||
|
* up being rejected by the mempool.
|
||||||
|
*/
|
||||||
static bool AcceptToMemoryPoolWorker(const CChainParams& chainparams, CTxMemPool& pool, CValidationState& state, const CTransactionRef& ptx,
|
static bool AcceptToMemoryPoolWorker(const CChainParams& chainparams, CTxMemPool& pool, CValidationState& state, const CTransactionRef& ptx,
|
||||||
bool* pfMissingInputs, int64_t nAcceptTime, std::list<CTransactionRef>* plTxnReplaced,
|
bool* pfMissingInputs, int64_t nAcceptTime, std::list<CTransactionRef>* plTxnReplaced,
|
||||||
bool bypass_limits, const CAmount& nAbsurdFee, std::vector<COutPoint>& coins_to_uncache, bool test_accept) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
bool bypass_limits, const CAmount& nAbsurdFee, std::vector<COutPoint>& coins_to_uncache, bool test_accept) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||||
|
@ -660,6 +667,10 @@ static bool AcceptToMemoryPoolWorker(const CChainParams& chainparams, CTxMemPool
|
||||||
if (!pcoinsTip->HaveCoinInCache(txin.prevout)) {
|
if (!pcoinsTip->HaveCoinInCache(txin.prevout)) {
|
||||||
coins_to_uncache.push_back(txin.prevout);
|
coins_to_uncache.push_back(txin.prevout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note: this call may add txin.prevout to the coins cache
|
||||||
|
// (pcoinsTip.cacheCoins) by way of FetchCoin(). It should be removed
|
||||||
|
// later (via coins_to_uncache) if this tx turns out to be invalid.
|
||||||
if (!view.HaveCoin(txin.prevout)) {
|
if (!view.HaveCoin(txin.prevout)) {
|
||||||
// Are inputs missing because we already have the tx?
|
// Are inputs missing because we already have the tx?
|
||||||
for (size_t out = 0; out < tx.vout.size(); out++) {
|
for (size_t out = 0; out < tx.vout.size(); out++) {
|
||||||
|
@ -981,6 +992,11 @@ static bool AcceptToMemoryPoolWithTime(const CChainParams& chainparams, CTxMemPo
|
||||||
std::vector<COutPoint> coins_to_uncache;
|
std::vector<COutPoint> coins_to_uncache;
|
||||||
bool res = AcceptToMemoryPoolWorker(chainparams, pool, state, tx, pfMissingInputs, nAcceptTime, plTxnReplaced, bypass_limits, nAbsurdFee, coins_to_uncache, test_accept);
|
bool res = AcceptToMemoryPoolWorker(chainparams, pool, state, tx, pfMissingInputs, nAcceptTime, plTxnReplaced, bypass_limits, nAbsurdFee, coins_to_uncache, test_accept);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
|
// Remove coins that were not present in the coins cache before calling ATMPW;
|
||||||
|
// this is to prevent memory DoS in case we receive a large number of
|
||||||
|
// invalid transactions that attempt to overrun the in-memory coins cache
|
||||||
|
// (`CCoinsViewCache::cacheCoins`).
|
||||||
|
|
||||||
for (const COutPoint& hashTx : coins_to_uncache)
|
for (const COutPoint& hashTx : coins_to_uncache)
|
||||||
pcoinsTip->Uncache(hashTx);
|
pcoinsTip->Uncache(hashTx);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue