@ -33,7 +33,7 @@ unsigned int nTransactionsUpdated = 0;
map < uint256 , CBlockIndex * > mapBlockIndex ;
CChain chainActive ;
uint256 nBestInvalidWork = 0 ;
CBlockIndex * pindexBestInvalid ;
set < CBlockIndex * , CBlockIndexWorkComparator > setBlockIndexValid ; // may contain all CBlockIndex*'s that have validness >=BLOCK_VALID_TRANSACTIONS, and must contain those who aren't failed
int64 nTimeBestReceived = 0 ;
int nScriptCheckThreads = 0 ;
@ -1349,7 +1349,7 @@ void CheckForkWarningConditions()
if ( pindexBestForkTip & & chainActive . Height ( ) - pindexBestForkTip - > nHeight > = 72 )
pindexBestForkTip = NULL ;
if ( pindexBestForkTip | | nBestInvalidWork > chainActive . Tip ( ) - > nChainWork + ( chainActive . Tip ( ) - > GetBlockWork ( ) * 6 ) . getuint256 ( ) )
if ( pindexBestForkTip | | ( pi ndex BestInvalid & & pindexBestInvalid - > nChain Work > chainActive . Tip ( ) - > nChainWork + ( chainActive . Tip ( ) - > GetBlockWork ( ) * 6 ) . getuint256 ( ) ) )
{
if ( ! fLargeWorkForkFound )
{
@ -1416,10 +1416,13 @@ void CheckForkWarningConditionsOnNewFork(CBlockIndex* pindexNewForkTip)
void static InvalidChainFound ( CBlockIndex * pindexNew )
{
if ( pindexNew - > nChainWork > nBestInvalidWork)
if ( ! pindexBestInvalid | | pindexNew - > nChainWork > pi ndex BestInvalid- > nChain Work)
{
nBestInvalidWork = pindexNew - > nChainWork ;
pblocktree - > WriteBestInvalidWork ( CBigNum ( nBestInvalidWork ) ) ;
pindexBestInvalid = pindexNew ;
// The current code doesn't actually read the BestInvalidWork entry in
// the block database anymore, as it is derived from the flags in block
// index entry. We only write it for backward compatibility.
pblocktree - > WriteBestInvalidWork ( CBigNum ( pindexBestInvalid - > nChainWork ) ) ;
uiInterface . NotifyBlocksChanged ( ) ;
}
LogPrintf ( " InvalidChainFound: invalid block=%s height=%d log2_work=%.8g date=%s \n " ,
@ -2769,6 +2772,8 @@ bool static LoadBlockIndexDB()
pindex - > nChainTx = ( pindex - > pprev ? pindex - > pprev - > nChainTx : 0 ) + pindex - > nTx ;
if ( ( pindex - > nStatus & BLOCK_VALID_MASK ) > = BLOCK_VALID_TRANSACTIONS & & ! ( pindex - > nStatus & BLOCK_FAILED_MASK ) )
setBlockIndexValid . insert ( pindex ) ;
if ( pindex - > nStatus & BLOCK_FAILED_MASK & & ( ! pindexBestInvalid | | pindex - > nChainWork > pindexBestInvalid - > nChainWork ) )
pindexBestInvalid = pindex ;
}
// Load block file info
@ -2777,11 +2782,6 @@ bool static LoadBlockIndexDB()
if ( pblocktree - > ReadBlockFileInfo ( nLastBlockFile , infoLastBlockFile ) )
LogPrintf ( " LoadBlockIndexDB(): last block file info: %s \n " , infoLastBlockFile . ToString ( ) . c_str ( ) ) ;
// Load nBestInvalidWork, OK if it doesn't exist
CBigNum bnBestInvalidWork ;
pblocktree - > ReadBestInvalidWork ( bnBestInvalidWork ) ;
nBestInvalidWork = bnBestInvalidWork . getuint256 ( ) ;
// Check whether we need to continue reindexing
bool fReindexing = false ;
pblocktree - > ReadReindexing ( fReindexing ) ;
@ -2791,12 +2791,10 @@ bool static LoadBlockIndexDB()
pblocktree - > ReadFlag ( " txindex " , fTxIndex ) ;
LogPrintf ( " LoadBlockIndexDB(): transaction index %s \n " , fTxIndex ? " enabled " : " disabled " ) ;
// Load hashBestChain pointer to end of best chain
// Load pointer to end of best chain
chainActive . SetTip ( pcoinsTip - > GetBestBlock ( ) ) ;
if ( chainActive . Tip ( ) = = NULL )
return true ;
// register best chain
LogPrintf ( " LoadBlockIndexDB(): hashBestChain=%s height=%d date=%s \n " ,
chainActive . Tip ( ) - > GetBlockHash ( ) . ToString ( ) . c_str ( ) , chainActive . Height ( ) ,
DateTimeStrFormat ( " %Y-%m-%d %H:%M:%S " , chainActive . Tip ( ) - > GetBlockTime ( ) ) . c_str ( ) ) ;
@ -2882,7 +2880,7 @@ void UnloadBlockIndex()
mapBlockIndex . clear ( ) ;
setBlockIndexValid . clear ( ) ;
chainActive . SetTip ( NULL ) ;
nBestInvalidWork = 0 ;
pindexBestInvalid = NULL ;
}
bool LoadBlockIndex ( )