@ -2345,6 +2345,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
CCheckQueueControl < CScriptCheck > control ( fScriptChecks & & nScriptCheckThreads ? & scriptcheckqueue : NULL ) ;
CCheckQueueControl < CScriptCheck > control ( fScriptChecks & & nScriptCheckThreads ? & scriptcheckqueue : NULL ) ;
std : : vector < uint256 > vOrphanErase ;
std : : vector < int > prevheights ;
std : : vector < int > prevheights ;
CAmount nFees = 0 ;
CAmount nFees = 0 ;
int nInputs = 0 ;
int nInputs = 0 ;
@ -2377,6 +2378,17 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
prevheights [ j ] = view . AccessCoins ( tx . vin [ j ] . prevout . hash ) - > nHeight ;
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 ) ) {
if ( ! SequenceLocks ( tx , nLockTimeFlags , & prevheights , * pindex ) ) {
return state . DoS ( 100 , error ( " %s: contains a non-BIP68-final transaction " , __func__ ) ,
return state . DoS ( 100 , error ( " %s: contains a non-BIP68-final transaction " , __func__ ) ,
REJECT_INVALID , " bad-txns-nonfinal " ) ;
REJECT_INVALID , " bad-txns-nonfinal " ) ;
@ -2464,6 +2476,15 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
GetMainSignals ( ) . UpdatedTransaction ( hashPrevBestCoinBase ) ;
GetMainSignals ( ) . UpdatedTransaction ( hashPrevBestCoinBase ) ;
hashPrevBestCoinBase = block . vtx [ 0 ] . GetHash ( ) ;
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 ;
int64_t nTime6 = GetTimeMicros ( ) ; nTimeCallbacks + = nTime6 - nTime5 ;
LogPrint ( " bench " , " - Callbacks: %.2fms [%.2fs] \n " , 0.001 * ( nTime6 - nTime5 ) , nTimeCallbacks * 0.000001 ) ;
LogPrint ( " bench " , " - Callbacks: %.2fms [%.2fs] \n " , 0.001 * ( nTime6 - nTime5 ) , nTimeCallbacks * 0.000001 ) ;