|
|
@ -11,6 +11,7 @@ |
|
|
|
#include "main.h" |
|
|
|
#include "main.h" |
|
|
|
#include "policy/fees.h" |
|
|
|
#include "policy/fees.h" |
|
|
|
#include "streams.h" |
|
|
|
#include "streams.h" |
|
|
|
|
|
|
|
#include "timedata.h" |
|
|
|
#include "util.h" |
|
|
|
#include "util.h" |
|
|
|
#include "utilmoneystr.h" |
|
|
|
#include "utilmoneystr.h" |
|
|
|
#include "utiltime.h" |
|
|
|
#include "utiltime.h" |
|
|
@ -478,22 +479,26 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list<CTransaction>& rem |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void CTxMemPool::removeCoinbaseSpends(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight) |
|
|
|
void CTxMemPool::removeForReorg(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Remove transactions spending a coinbase which are now immature
|
|
|
|
// Remove transactions spending a coinbase which are now immature
|
|
|
|
LOCK(cs); |
|
|
|
LOCK(cs); |
|
|
|
list<CTransaction> transactionsToRemove; |
|
|
|
list<CTransaction> transactionsToRemove; |
|
|
|
for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { |
|
|
|
for (indexed_transaction_set::const_iterator it = mapTx.begin(); it != mapTx.end(); it++) { |
|
|
|
const CTransaction& tx = it->GetTx(); |
|
|
|
const CTransaction& tx = it->GetTx(); |
|
|
|
BOOST_FOREACH(const CTxIn& txin, tx.vin) { |
|
|
|
if (!IsFinalTx(tx, nMemPoolHeight, GetAdjustedTime())) { |
|
|
|
indexed_transaction_set::const_iterator it2 = mapTx.find(txin.prevout.hash); |
|
|
|
transactionsToRemove.push_back(tx); |
|
|
|
if (it2 != mapTx.end()) |
|
|
|
} else { |
|
|
|
continue; |
|
|
|
BOOST_FOREACH(const CTxIn& txin, tx.vin) { |
|
|
|
const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash); |
|
|
|
indexed_transaction_set::const_iterator it2 = mapTx.find(txin.prevout.hash); |
|
|
|
if (nCheckFrequency != 0) assert(coins); |
|
|
|
if (it2 != mapTx.end()) |
|
|
|
if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) { |
|
|
|
continue; |
|
|
|
transactionsToRemove.push_back(tx); |
|
|
|
const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash); |
|
|
|
break; |
|
|
|
if (nCheckFrequency != 0) assert(coins); |
|
|
|
|
|
|
|
if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) { |
|
|
|
|
|
|
|
transactionsToRemove.push_back(tx); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|