@ -1234,33 +1234,10 @@ bool Reorganize(CTxDB& txdb, CBlockIndex* pindexNew)
}
}
bool CBlock : : AddToBlockIndex ( unsigned int nFile , unsigned int nBlockPos )
bool CBlock : : SetBestChain ( CTxDB & txdb , CBlockIndex * pindexNew )
{
{
// Check for duplicate
uint256 hash = GetHash ( ) ;
uint256 hash = GetHash ( ) ;
if ( mapBlockIndex . count ( hash ) )
return error ( " AddToBlockIndex() : % s already exists " , hash.ToString().substr(0,16).c_str()) ;
// Construct new block index object
CBlockIndex * pindexNew = new CBlockIndex ( nFile , nBlockPos , * this ) ;
if ( ! pindexNew )
return error ( " AddToBlockIndex() : new CBlockIndex failed " ) ;
map < uint256 , CBlockIndex * > : : iterator mi = mapBlockIndex . insert ( make_pair ( hash , pindexNew ) ) . first ;
pindexNew - > phashBlock = & ( ( * mi ) . first ) ;
map < uint256 , CBlockIndex * > : : iterator miPrev = mapBlockIndex . find ( hashPrevBlock ) ;
if ( miPrev ! = mapBlockIndex . end ( ) )
{
pindexNew - > pprev = ( * miPrev ) . second ;
pindexNew - > nHeight = pindexNew - > pprev - > nHeight + 1 ;
}
pindexNew - > bnChainWork = ( pindexNew - > pprev ? pindexNew - > pprev - > bnChainWork : 0 ) + pindexNew - > GetBlockWork ( ) ;
CTxDB txdb ;
txdb . WriteBlockIndex ( CDiskBlockIndex ( pindexNew ) ) ;
// New best
if ( pindexNew - > bnChainWork > bnBestChainWork )
{
txdb . TxnBegin ( ) ;
txdb . TxnBegin ( ) ;
if ( pindexGenesisBlock = = NULL & & hash = = hashGenesisBlock )
if ( pindexGenesisBlock = = NULL & & hash = = hashGenesisBlock )
{
{
@ -1274,7 +1251,7 @@ bool CBlock::AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos)
{
{
txdb . TxnAbort ( ) ;
txdb . TxnAbort ( ) ;
Lockdown ( pindexNew ) ;
Lockdown ( pindexNew ) ;
return error ( " AddToBlockIndex () : ConnectBlock failed " ) ;
return error ( " SetBestChain () : ConnectBlock failed " ) ;
}
}
txdb . TxnCommit ( ) ;
txdb . TxnCommit ( ) ;
pindexNew - > pprev - > pnext = pindexNew ;
pindexNew - > pprev - > pnext = pindexNew ;
@ -1290,7 +1267,7 @@ bool CBlock::AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos)
{
{
txdb . TxnAbort ( ) ;
txdb . TxnAbort ( ) ;
Lockdown ( pindexNew ) ;
Lockdown ( pindexNew ) ;
return error ( " AddToBlockIndex () : Reorganize failed " ) ;
return error ( " SetBestChain () : Reorganize failed " ) ;
}
}
}
}
txdb . TxnCommit ( ) ;
txdb . TxnCommit ( ) ;
@ -1302,8 +1279,40 @@ bool CBlock::AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos)
bnBestChainWork = pindexNew - > bnChainWork ;
bnBestChainWork = pindexNew - > bnChainWork ;
nTimeBestReceived = GetTime ( ) ;
nTimeBestReceived = GetTime ( ) ;
nTransactionsUpdated + + ;
nTransactionsUpdated + + ;
printf ( " AddToBlockIndex: new best=%s height=%d work=%s \n " , hashBestChain . ToString ( ) . substr ( 0 , 22 ) . c_str ( ) , nBestHeight , bnBestChainWork . ToString ( ) . c_str ( ) ) ;
printf ( " SetBestChain: new best=%s height=%d work=%s \n " , hashBestChain . ToString ( ) . substr ( 0 , 22 ) . c_str ( ) , nBestHeight , bnBestChainWork . ToString ( ) . c_str ( ) ) ;
return true ;
}
bool CBlock : : AddToBlockIndex ( unsigned int nFile , unsigned int nBlockPos )
{
// Check for duplicate
uint256 hash = GetHash ( ) ;
if ( mapBlockIndex . count ( hash ) )
return error ( " AddToBlockIndex() : % s already exists " , hash.ToString().substr(0,16).c_str()) ;
// Construct new block index object
CBlockIndex * pindexNew = new CBlockIndex ( nFile , nBlockPos , * this ) ;
if ( ! pindexNew )
return error ( " AddToBlockIndex() : new CBlockIndex failed " ) ;
map < uint256 , CBlockIndex * > : : iterator mi = mapBlockIndex . insert ( make_pair ( hash , pindexNew ) ) . first ;
pindexNew - > phashBlock = & ( ( * mi ) . first ) ;
map < uint256 , CBlockIndex * > : : iterator miPrev = mapBlockIndex . find ( hashPrevBlock ) ;
if ( miPrev ! = mapBlockIndex . end ( ) )
{
pindexNew - > pprev = ( * miPrev ) . second ;
pindexNew - > nHeight = pindexNew - > pprev - > nHeight + 1 ;
}
}
pindexNew - > bnChainWork = ( pindexNew - > pprev ? pindexNew - > pprev - > bnChainWork : 0 ) + pindexNew - > GetBlockWork ( ) ;
CTxDB txdb ;
txdb . WriteBlockIndex ( CDiskBlockIndex ( pindexNew ) ) ;
// New best
if ( pindexNew - > bnChainWork > bnBestChainWork )
if ( ! SetBestChain ( txdb , pindexNew ) )
return false ;
txdb . Close ( ) ;
txdb . Close ( ) ;
@ -1393,7 +1402,16 @@ bool CBlock::AcceptBlock()
( pindexPrev - > nHeight + 1 = = 68555 & & hash ! = uint256 ( " 0x00000000001e1b4903550a0b96e9a9405c8a95f387162e4944e8d9fbe501cd6a " ) ) | |
( pindexPrev - > nHeight + 1 = = 68555 & & hash ! = uint256 ( " 0x00000000001e1b4903550a0b96e9a9405c8a95f387162e4944e8d9fbe501cd6a " ) ) | |
( pindexPrev - > nHeight + 1 = = 70567 & & hash ! = uint256 ( " 0x00000000006a49b14bcf27462068f1264c961f11fa2e0eddd2be0791e1d4124a " ) ) | |
( pindexPrev - > nHeight + 1 = = 70567 & & hash ! = uint256 ( " 0x00000000006a49b14bcf27462068f1264c961f11fa2e0eddd2be0791e1d4124a " ) ) | |
( pindexPrev - > nHeight + 1 = = 74000 & & hash ! = uint256 ( " 0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20 " ) ) )
( pindexPrev - > nHeight + 1 = = 74000 & & hash ! = uint256 ( " 0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20 " ) ) )
return error ( " AcceptBlock() : rejected by checkpoint lockin " ) ;
return error ( " AcceptBlock() : rejected by checkpoint lockin at % d " , pindexPrev->nHeight+1) ;
// Scanback checkpoint lockin
for ( CBlockIndex * pindex = pindexPrev ; pindex - > nHeight > = 74000 ; pindex = pindex - > pprev )
{
if ( pindex - > nHeight = = 74000 & & pindex - > GetBlockHash ( ) ! = uint256 ( " 0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20 " ) )
return error ( " AcceptBlock() : rejected by scanback lockin at % d " , pindex->nHeight) ;
if ( pindex - > nHeight = = 74638 & & pindex - > GetBlockHash ( ) = = uint256 ( " 0x0000000000790ab3f22ec756ad43b6ab569abf0bddeb97c67a6f7b1470a7ec1c " ) )
return error ( " AcceptBlock() : rejected by scanback lockin at % d " , pindex->nHeight) ;
}
// Write block to history file
// Write block to history file
if ( ! CheckDiskSpace ( : : GetSerializeSize ( * this , SER_DISK ) ) )
if ( ! CheckDiskSpace ( : : GetSerializeSize ( * this , SER_DISK ) ) )