@ -2461,7 +2461,6 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
CCheckQueueControl < CScriptCheck > control ( fScriptChecks & & nScriptCheckThreads ? & scriptcheckqueue : NULL ) ;
std : : vector < uint256 > vOrphanErase ;
std : : vector < int > prevheights ;
CAmount nFees = 0 ;
int nInputs = 0 ;
@ -2492,17 +2491,6 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
prevheights [ j ] = view . AccessCoins ( tx . vin [ j ] . prevout . hash ) - > nHeight ;
}
// Which orphan pool entries must we evict?
for ( size_t j = 0 ; j < tx . vin . size ( ) ; j + + ) {
auto itByPrev = mapOrphanTransactionsByPrev . find ( tx . vin [ j ] . prevout ) ;
if ( itByPrev = = mapOrphanTransactionsByPrev . end ( ) ) continue ;
for ( auto mi = itByPrev - > second . begin ( ) ; mi ! = itByPrev - > second . end ( ) ; + + mi ) {
const CTransaction & orphanTx = ( * mi ) - > second . tx ;
const uint256 & orphanHash = orphanTx . GetHash ( ) ;
vOrphanErase . push_back ( orphanHash ) ;
}
}
if ( ! SequenceLocks ( tx , nLockTimeFlags , & prevheights , * pindex ) ) {
return state . DoS ( 100 , error ( " %s: contains a non-BIP68-final transaction " , __func__ ) ,
REJECT_INVALID , " bad-txns-nonfinal " ) ;
@ -2592,14 +2580,6 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
GetMainSignals ( ) . UpdatedTransaction ( hashPrevBestCoinBase ) ;
hashPrevBestCoinBase = block . vtx [ 0 ] . GetHash ( ) ;
// Erase orphan transactions include or precluded by this block
if ( vOrphanErase . size ( ) ) {
int nErased = 0 ;
BOOST_FOREACH ( uint256 & orphanHash , vOrphanErase ) {
nErased + = EraseOrphanTx ( orphanHash ) ;
}
LogPrint ( " mempool " , " Erased %d orphan tx included or conflicted by block \n " , nErased ) ;
}
int64_t nTime6 = GetTimeMicros ( ) ; nTimeCallbacks + = nTime6 - nTime5 ;
LogPrint ( " bench " , " - Callbacks: %.2fms [%.2fs] \n " , 0.001 * ( nTime6 - nTime5 ) , nTimeCallbacks * 0.000001 ) ;
@ -3105,6 +3085,33 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
}
// When we reach this point, we switched to a new tip (stored in pindexNewTip).
// Remove orphan transactions with cs_main
{
LOCK ( cs_main ) ;
std : : vector < uint256 > vOrphanErase ;
for ( unsigned int i = 0 ; i < txChanged . size ( ) ; i + + ) {
const CTransaction & tx = std : : get < 0 > ( txChanged [ i ] ) ;
// Which orphan pool entries must we evict?
for ( size_t j = 0 ; j < tx . vin . size ( ) ; j + + ) {
auto itByPrev = mapOrphanTransactionsByPrev . find ( tx . vin [ j ] . prevout ) ;
if ( itByPrev = = mapOrphanTransactionsByPrev . end ( ) ) continue ;
for ( auto mi = itByPrev - > second . begin ( ) ; mi ! = itByPrev - > second . end ( ) ; + + mi ) {
const CTransaction & orphanTx = ( * mi ) - > second . tx ;
const uint256 & orphanHash = orphanTx . GetHash ( ) ;
vOrphanErase . push_back ( orphanHash ) ;
}
}
}
// Erase orphan transactions include or precluded by this block
if ( vOrphanErase . size ( ) ) {
int nErased = 0 ;
BOOST_FOREACH ( uint256 & orphanHash , vOrphanErase ) {
nErased + = EraseOrphanTx ( orphanHash ) ;
}
LogPrint ( " mempool " , " Erased %d orphan tx included or conflicted by block \n " , nErased ) ;
}
}
// Notifications/callbacks that can run without cs_main
// throw all transactions though the signal-interface