mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-25 02:33:24 -03:00
refactor: Move GuessVerificationProgress into ChainstateManager
This commit is contained in:
parent
d73f37dda2
commit
facb4d010c
5 changed files with 22 additions and 21 deletions
|
@ -1827,7 +1827,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
|
||||||
if (tip_info) {
|
if (tip_info) {
|
||||||
tip_info->block_height = chain_active_height;
|
tip_info->block_height = chain_active_height;
|
||||||
tip_info->block_time = best_block_time;
|
tip_info->block_time = best_block_time;
|
||||||
tip_info->verification_progress = GuessVerificationProgress(chainman.GetParams().TxData(), &tip);
|
tip_info->verification_progress = chainman.GuessVerificationProgress(&tip);
|
||||||
}
|
}
|
||||||
if (tip_info && chainman.m_best_header) {
|
if (tip_info && chainman.m_best_header) {
|
||||||
tip_info->header_height = chainman.m_best_header->nHeight;
|
tip_info->header_height = chainman.m_best_header->nHeight;
|
||||||
|
|
|
@ -324,7 +324,7 @@ public:
|
||||||
}
|
}
|
||||||
double getVerificationProgress() override
|
double getVerificationProgress() override
|
||||||
{
|
{
|
||||||
return GuessVerificationProgress(chainman().GetParams().TxData(), WITH_LOCK(::cs_main, return chainman().ActiveChain().Tip()));
|
return chainman().GuessVerificationProgress(WITH_LOCK(chainman().GetMutex(), return chainman().ActiveChain().Tip()));
|
||||||
}
|
}
|
||||||
bool isInitialBlockDownload() override
|
bool isInitialBlockDownload() override
|
||||||
{
|
{
|
||||||
|
@ -406,9 +406,9 @@ public:
|
||||||
}
|
}
|
||||||
std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn) override
|
std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn) override
|
||||||
{
|
{
|
||||||
return MakeSignalHandler(::uiInterface.NotifyBlockTip_connect([fn](SynchronizationState sync_state, const CBlockIndex* block) {
|
return MakeSignalHandler(::uiInterface.NotifyBlockTip_connect([fn, this](SynchronizationState sync_state, const CBlockIndex* block) {
|
||||||
fn(sync_state, BlockTip{block->nHeight, block->GetBlockTime(), block->GetBlockHash()},
|
fn(sync_state, BlockTip{block->nHeight, block->GetBlockTime(), block->GetBlockHash()},
|
||||||
GuessVerificationProgress(Params().TxData(), block));
|
chainman().GuessVerificationProgress(block));
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn) override
|
std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn) override
|
||||||
|
@ -639,8 +639,8 @@ public:
|
||||||
void findCoins(std::map<COutPoint, Coin>& coins) override { return FindCoins(m_node, coins); }
|
void findCoins(std::map<COutPoint, Coin>& coins) override { return FindCoins(m_node, coins); }
|
||||||
double guessVerificationProgress(const uint256& block_hash) override
|
double guessVerificationProgress(const uint256& block_hash) override
|
||||||
{
|
{
|
||||||
LOCK(::cs_main);
|
LOCK(chainman().GetMutex());
|
||||||
return GuessVerificationProgress(chainman().GetParams().TxData(), chainman().m_blockman.LookupBlockIndex(block_hash));
|
return chainman().GuessVerificationProgress(chainman().m_blockman.LookupBlockIndex(block_hash));
|
||||||
}
|
}
|
||||||
bool hasBlocks(const uint256& block_hash, int min_height, std::optional<int> max_height) override
|
bool hasBlocks(const uint256& block_hash, int min_height, std::optional<int> max_height) override
|
||||||
{
|
{
|
||||||
|
|
|
@ -1336,7 +1336,7 @@ RPCHelpMan getblockchaininfo()
|
||||||
obj.pushKV("difficulty", GetDifficulty(tip));
|
obj.pushKV("difficulty", GetDifficulty(tip));
|
||||||
obj.pushKV("time", tip.GetBlockTime());
|
obj.pushKV("time", tip.GetBlockTime());
|
||||||
obj.pushKV("mediantime", tip.GetMedianTimePast());
|
obj.pushKV("mediantime", tip.GetMedianTimePast());
|
||||||
obj.pushKV("verificationprogress", GuessVerificationProgress(chainman.GetParams().TxData(), &tip));
|
obj.pushKV("verificationprogress", chainman.GuessVerificationProgress(&tip));
|
||||||
obj.pushKV("initialblockdownload", chainman.IsInitialBlockDownload());
|
obj.pushKV("initialblockdownload", chainman.IsInitialBlockDownload());
|
||||||
obj.pushKV("chainwork", tip.nChainWork.GetHex());
|
obj.pushKV("chainwork", tip.nChainWork.GetHex());
|
||||||
obj.pushKV("size_on_disk", chainman.m_blockman.CalculateCurrentUsage());
|
obj.pushKV("size_on_disk", chainman.m_blockman.CalculateCurrentUsage());
|
||||||
|
@ -3338,7 +3338,7 @@ return RPCHelpMan{
|
||||||
data.pushKV("blocks", (int)chain.Height());
|
data.pushKV("blocks", (int)chain.Height());
|
||||||
data.pushKV("bestblockhash", tip->GetBlockHash().GetHex());
|
data.pushKV("bestblockhash", tip->GetBlockHash().GetHex());
|
||||||
data.pushKV("difficulty", GetDifficulty(*tip));
|
data.pushKV("difficulty", GetDifficulty(*tip));
|
||||||
data.pushKV("verificationprogress", GuessVerificationProgress(Params().TxData(), tip));
|
data.pushKV("verificationprogress", chainman.GuessVerificationProgress(tip));
|
||||||
data.pushKV("coins_db_cache_bytes", cs.m_coinsdb_cache_size_bytes);
|
data.pushKV("coins_db_cache_bytes", cs.m_coinsdb_cache_size_bytes);
|
||||||
data.pushKV("coins_tip_cache_bytes", cs.m_coinstip_cache_size_bytes);
|
data.pushKV("coins_tip_cache_bytes", cs.m_coinstip_cache_size_bytes);
|
||||||
if (cs.m_from_snapshot_blockhash) {
|
if (cs.m_from_snapshot_blockhash) {
|
||||||
|
|
|
@ -2983,9 +2983,9 @@ void Chainstate::PruneAndFlush()
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UpdateTipLog(
|
static void UpdateTipLog(
|
||||||
|
const ChainstateManager& chainman,
|
||||||
const CCoinsViewCache& coins_tip,
|
const CCoinsViewCache& coins_tip,
|
||||||
const CBlockIndex* tip,
|
const CBlockIndex* tip,
|
||||||
const CChainParams& params,
|
|
||||||
const std::string& func_name,
|
const std::string& func_name,
|
||||||
const std::string& prefix,
|
const std::string& prefix,
|
||||||
const std::string& warning_messages) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
|
const std::string& warning_messages) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
|
||||||
|
@ -2997,7 +2997,7 @@ static void UpdateTipLog(
|
||||||
tip->GetBlockHash().ToString(), tip->nHeight, tip->nVersion,
|
tip->GetBlockHash().ToString(), tip->nHeight, tip->nVersion,
|
||||||
log(tip->nChainWork.getdouble()) / log(2.0), tip->m_chain_tx_count,
|
log(tip->nChainWork.getdouble()) / log(2.0), tip->m_chain_tx_count,
|
||||||
FormatISO8601DateTime(tip->GetBlockTime()),
|
FormatISO8601DateTime(tip->GetBlockTime()),
|
||||||
GuessVerificationProgress(params.TxData(), tip),
|
chainman.GuessVerificationProgress(tip),
|
||||||
coins_tip.DynamicMemoryUsage() * (1.0 / (1 << 20)),
|
coins_tip.DynamicMemoryUsage() * (1.0 / (1 << 20)),
|
||||||
coins_tip.GetCacheSize(),
|
coins_tip.GetCacheSize(),
|
||||||
!warning_messages.empty() ? strprintf(" warning='%s'", warning_messages) : "");
|
!warning_messages.empty() ? strprintf(" warning='%s'", warning_messages) : "");
|
||||||
|
@ -3008,15 +3008,13 @@ void Chainstate::UpdateTip(const CBlockIndex* pindexNew)
|
||||||
AssertLockHeld(::cs_main);
|
AssertLockHeld(::cs_main);
|
||||||
const auto& coins_tip = this->CoinsTip();
|
const auto& coins_tip = this->CoinsTip();
|
||||||
|
|
||||||
const CChainParams& params{m_chainman.GetParams()};
|
|
||||||
|
|
||||||
// The remainder of the function isn't relevant if we are not acting on
|
// The remainder of the function isn't relevant if we are not acting on
|
||||||
// the active chainstate, so return if need be.
|
// the active chainstate, so return if need be.
|
||||||
if (this != &m_chainman.ActiveChainstate()) {
|
if (this != &m_chainman.ActiveChainstate()) {
|
||||||
// Only log every so often so that we don't bury log messages at the tip.
|
// Only log every so often so that we don't bury log messages at the tip.
|
||||||
constexpr int BACKGROUND_LOG_INTERVAL = 2000;
|
constexpr int BACKGROUND_LOG_INTERVAL = 2000;
|
||||||
if (pindexNew->nHeight % BACKGROUND_LOG_INTERVAL == 0) {
|
if (pindexNew->nHeight % BACKGROUND_LOG_INTERVAL == 0) {
|
||||||
UpdateTipLog(coins_tip, pindexNew, params, __func__, "[background validation] ", "");
|
UpdateTipLog(m_chainman, coins_tip, pindexNew, __func__, "[background validation] ", "");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3031,7 +3029,7 @@ void Chainstate::UpdateTip(const CBlockIndex* pindexNew)
|
||||||
const CBlockIndex* pindex = pindexNew;
|
const CBlockIndex* pindex = pindexNew;
|
||||||
for (int bit = 0; bit < VERSIONBITS_NUM_BITS; bit++) {
|
for (int bit = 0; bit < VERSIONBITS_NUM_BITS; bit++) {
|
||||||
WarningBitsConditionChecker checker(m_chainman, bit);
|
WarningBitsConditionChecker checker(m_chainman, bit);
|
||||||
ThresholdState state = checker.GetStateFor(pindex, params.GetConsensus(), m_chainman.m_warningcache.at(bit));
|
ThresholdState state = checker.GetStateFor(pindex, m_chainman.GetConsensus(), m_chainman.m_warningcache.at(bit));
|
||||||
if (state == ThresholdState::ACTIVE || state == ThresholdState::LOCKED_IN) {
|
if (state == ThresholdState::ACTIVE || state == ThresholdState::LOCKED_IN) {
|
||||||
const bilingual_str warning = strprintf(_("Unknown new rules activated (versionbit %i)"), bit);
|
const bilingual_str warning = strprintf(_("Unknown new rules activated (versionbit %i)"), bit);
|
||||||
if (state == ThresholdState::ACTIVE) {
|
if (state == ThresholdState::ACTIVE) {
|
||||||
|
@ -3042,7 +3040,7 @@ void Chainstate::UpdateTip(const CBlockIndex* pindexNew)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UpdateTipLog(coins_tip, pindexNew, params, __func__, "",
|
UpdateTipLog(m_chainman, coins_tip, pindexNew, __func__, "",
|
||||||
util::Join(warning_messages, Untranslated(", ")).original);
|
util::Join(warning_messages, Untranslated(", ")).original);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4720,7 +4718,7 @@ bool Chainstate::LoadChainTip()
|
||||||
tip->GetBlockHash().ToString(),
|
tip->GetBlockHash().ToString(),
|
||||||
m_chain.Height(),
|
m_chain.Height(),
|
||||||
FormatISO8601DateTime(tip->GetBlockTime()),
|
FormatISO8601DateTime(tip->GetBlockTime()),
|
||||||
GuessVerificationProgress(m_chainman.GetParams().TxData(), tip));
|
m_chainman.GuessVerificationProgress(tip));
|
||||||
|
|
||||||
// Ensure KernelNotifications m_tip_block is set even if no new block arrives.
|
// Ensure KernelNotifications m_tip_block is set even if no new block arrives.
|
||||||
if (this->GetRole() != ChainstateRole::BACKGROUND) {
|
if (this->GetRole() != ChainstateRole::BACKGROUND) {
|
||||||
|
@ -5611,9 +5609,12 @@ bool Chainstate::ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size)
|
||||||
|
|
||||||
//! Guess how far we are in the verification process at the given block index
|
//! Guess how far we are in the verification process at the given block index
|
||||||
//! require cs_main if pindex has not been validated yet (because m_chain_tx_count might be unset)
|
//! require cs_main if pindex has not been validated yet (because m_chain_tx_count might be unset)
|
||||||
double GuessVerificationProgress(const ChainTxData& data, const CBlockIndex *pindex) {
|
double ChainstateManager::GuessVerificationProgress(const CBlockIndex* pindex) const
|
||||||
if (pindex == nullptr)
|
{
|
||||||
|
const ChainTxData& data{GetParams().TxData()};
|
||||||
|
if (pindex == nullptr) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!Assume(pindex->m_chain_tx_count > 0)) {
|
if (!Assume(pindex->m_chain_tx_count > 0)) {
|
||||||
LogWarning("Internal bug detected: block %d has unset m_chain_tx_count (%s %s). Please report this issue here: %s\n",
|
LogWarning("Internal bug detected: block %d has unset m_chain_tx_count (%s %s). Please report this issue here: %s\n",
|
||||||
|
|
|
@ -95,9 +95,6 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams);
|
||||||
|
|
||||||
bool FatalError(kernel::Notifications& notifications, BlockValidationState& state, const bilingual_str& message);
|
bool FatalError(kernel::Notifications& notifications, BlockValidationState& state, const bilingual_str& message);
|
||||||
|
|
||||||
/** Guess verification progress (as a fraction between 0.0=genesis and 1.0=current tip). */
|
|
||||||
double GuessVerificationProgress(const ChainTxData& data, const CBlockIndex* pindex);
|
|
||||||
|
|
||||||
/** Prune block files up to a given height */
|
/** Prune block files up to a given height */
|
||||||
void PruneBlockFilesManual(Chainstate& active_chainstate, int nManualPruneHeight);
|
void PruneBlockFilesManual(Chainstate& active_chainstate, int nManualPruneHeight);
|
||||||
|
|
||||||
|
@ -1151,6 +1148,9 @@ public:
|
||||||
/** Check whether we are doing an initial block download (synchronizing from disk or network) */
|
/** Check whether we are doing an initial block download (synchronizing from disk or network) */
|
||||||
bool IsInitialBlockDownload() const;
|
bool IsInitialBlockDownload() const;
|
||||||
|
|
||||||
|
/** Guess verification progress (as a fraction between 0.0=genesis and 1.0=current tip). */
|
||||||
|
double GuessVerificationProgress(const CBlockIndex* pindex) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Import blocks from an external file
|
* Import blocks from an external file
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue