|
|
|
@ -3932,28 +3932,31 @@ bool static LoadBlockIndexDB(const CChainParams& chainparams) EXCLUSIVE_LOCKS_RE
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool LoadChainTip(const CChainParams& chainparams)
|
|
|
|
|
bool CChainState::LoadChainTip(const CChainParams& chainparams)
|
|
|
|
|
{
|
|
|
|
|
AssertLockHeld(cs_main);
|
|
|
|
|
const CCoinsViewCache& coins_cache = ::ChainstateActive().CoinsTip();
|
|
|
|
|
const CCoinsViewCache& coins_cache = CoinsTip();
|
|
|
|
|
assert(!coins_cache.GetBestBlock().IsNull()); // Never called when the coins view is empty
|
|
|
|
|
const CBlockIndex* tip = m_chain.Tip();
|
|
|
|
|
|
|
|
|
|
if (::ChainActive().Tip() &&
|
|
|
|
|
::ChainActive().Tip()->GetBlockHash() == coins_cache.GetBestBlock()) return true;
|
|
|
|
|
if (tip && tip->GetBlockHash() == coins_cache.GetBestBlock()) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Load pointer to end of best chain
|
|
|
|
|
CBlockIndex* pindex = LookupBlockIndex(coins_cache.GetBestBlock());
|
|
|
|
|
if (!pindex) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
::ChainActive().SetTip(pindex);
|
|
|
|
|
|
|
|
|
|
::ChainstateActive().PruneBlockIndexCandidates();
|
|
|
|
|
m_chain.SetTip(pindex);
|
|
|
|
|
PruneBlockIndexCandidates();
|
|
|
|
|
|
|
|
|
|
tip = m_chain.Tip();
|
|
|
|
|
LogPrintf("Loaded best chain: hashBestChain=%s height=%d date=%s progress=%f\n",
|
|
|
|
|
::ChainActive().Tip()->GetBlockHash().ToString(), ::ChainActive().Height(),
|
|
|
|
|
FormatISO8601DateTime(::ChainActive().Tip()->GetBlockTime()),
|
|
|
|
|
GuessVerificationProgress(chainparams.TxData(), ::ChainActive().Tip()));
|
|
|
|
|
tip->GetBlockHash().ToString(),
|
|
|
|
|
m_chain.Height(),
|
|
|
|
|
FormatISO8601DateTime(tip->GetBlockTime()),
|
|
|
|
|
GuessVerificationProgress(chainparams.TxData(), tip));
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|