@ -211,9 +211,7 @@ CBlockIndex* BlockManager::InsertBlockIndex(const uint256& hash)
return pindex ;
return pindex ;
}
}
bool BlockManager : : LoadBlockIndex (
bool BlockManager : : LoadBlockIndex ( const Consensus : : Params & consensus_params )
const Consensus : : Params & consensus_params ,
ChainstateManager & chainman )
{
{
if ( ! m_block_tree_db - > LoadBlockIndexGuts ( consensus_params , [ this ] ( const uint256 & hash ) EXCLUSIVE_LOCKS_REQUIRED ( cs_main ) { return this - > InsertBlockIndex ( hash ) ; } ) ) {
if ( ! m_block_tree_db - > LoadBlockIndexGuts ( consensus_params , [ this ] ( const uint256 & hash ) EXCLUSIVE_LOCKS_REQUIRED ( cs_main ) { return this - > InsertBlockIndex ( hash ) ; } ) ) {
return false ;
return false ;
@ -230,26 +228,6 @@ bool BlockManager::LoadBlockIndex(
return pa - > nHeight < pb - > nHeight ;
return pa - > nHeight < pb - > nHeight ;
} ) ;
} ) ;
// Find start of assumed-valid region.
int first_assumed_valid_height = std : : numeric_limits < int > : : max ( ) ;
for ( const CBlockIndex * block : vSortedByHeight ) {
if ( block - > IsAssumedValid ( ) ) {
auto chainstates = chainman . GetAll ( ) ;
// If we encounter an assumed-valid block index entry, ensure that we have
// one chainstate that tolerates assumed-valid entries and another that does
// not (i.e. the background validation chainstate), since assumed-valid
// entries should always be pending validation by a fully-validated chainstate.
auto any_chain = [ & ] ( auto fnc ) { return std : : any_of ( chainstates . cbegin ( ) , chainstates . cend ( ) , fnc ) ; } ;
assert ( any_chain ( [ ] ( auto chainstate ) { return chainstate - > reliesOnAssumedValid ( ) ; } ) ) ;
assert ( any_chain ( [ ] ( auto chainstate ) { return ! chainstate - > reliesOnAssumedValid ( ) ; } ) ) ;
first_assumed_valid_height = block - > nHeight ;
break ;
}
}
for ( CBlockIndex * pindex : vSortedByHeight ) {
for ( CBlockIndex * pindex : vSortedByHeight ) {
if ( ShutdownRequested ( ) ) return false ;
if ( ShutdownRequested ( ) ) return false ;
pindex - > nChainWork = ( pindex - > pprev ? pindex - > pprev - > nChainWork : 0 ) + GetBlockProof ( * pindex ) ;
pindex - > nChainWork = ( pindex - > pprev ? pindex - > pprev - > nChainWork : 0 ) + GetBlockProof ( * pindex ) ;
@ -275,43 +253,6 @@ bool BlockManager::LoadBlockIndex(
pindex - > nStatus | = BLOCK_FAILED_CHILD ;
pindex - > nStatus | = BLOCK_FAILED_CHILD ;
m_dirty_blockindex . insert ( pindex ) ;
m_dirty_blockindex . insert ( pindex ) ;
}
}
if ( pindex - > IsAssumedValid ( ) | |
( pindex - > IsValid ( BLOCK_VALID_TRANSACTIONS ) & &
( pindex - > HaveTxsDownloaded ( ) | | pindex - > pprev = = nullptr ) ) ) {
// Fill each chainstate's block candidate set. Only add assumed-valid
// blocks to the tip candidate set if the chainstate is allowed to rely on
// assumed-valid blocks.
//
// If all setBlockIndexCandidates contained the assumed-valid blocks, the
// background chainstate's ActivateBestChain() call would add assumed-valid
// blocks to the chain (based on how FindMostWorkChain() works). Obviously
// we don't want this since the purpose of the background validation chain
// is to validate assued-valid blocks.
//
// Note: This is considering all blocks whose height is greater or equal to
// the first assumed-valid block to be assumed-valid blocks, and excluding
// them from the background chainstate's setBlockIndexCandidates set. This
// does mean that some blocks which are not technically assumed-valid
// (later blocks on a fork beginning before the first assumed-valid block)
// might not get added to the background chainstate, but this is ok,
// because they will still be attached to the active chainstate if they
// actually contain more work.
//
// Instead of this height-based approach, an earlier attempt was made at
// detecting "holistically" whether the block index under consideration
// relied on an assumed-valid ancestor, but this proved to be too slow to
// be practical.
for ( CChainState * chainstate : chainman . GetAll ( ) ) {
if ( chainstate - > reliesOnAssumedValid ( ) | |
pindex - > nHeight < first_assumed_valid_height ) {
chainstate - > setBlockIndexCandidates . insert ( pindex ) ;
}
}
}
if ( pindex - > nStatus & BLOCK_FAILED_MASK & & ( ! chainman . m_best_invalid | | pindex - > nChainWork > chainman . m_best_invalid - > nChainWork ) ) {
chainman . m_best_invalid = pindex ;
}
if ( pindex - > pprev ) {
if ( pindex - > pprev ) {
pindex - > BuildSkip ( ) ;
pindex - > BuildSkip ( ) ;
}
}
@ -355,9 +296,9 @@ bool BlockManager::WriteBlockIndexDB()
return true ;
return true ;
}
}
bool BlockManager : : LoadBlockIndexDB ( ChainstateManager & chainman )
bool BlockManager : : LoadBlockIndexDB ( )
{
{
if ( ! LoadBlockIndex ( : : Params ( ) . GetConsensus ( ) , chainman )) {
if ( ! LoadBlockIndex ( : : Params ( ) . GetConsensus ( ) )) {
return false ;
return false ;
}
}