Bitcoin Core
22.99.0
P2P Digital Currency
|
CChainState stores and provides an API to update our local knowledge of the current best chain. More...
#include <validation.h>
Public Member Functions | |
CChainState (CTxMemPool *mempool, node::BlockManager &blockman, ChainstateManager &chainman, std::optional< uint256 > from_snapshot_blockhash=std::nullopt) | |
void | InitCoinsDB (size_t cache_size_bytes, bool in_memory, bool should_wipe, std::string leveldb_name="chainstate") |
Initialize the CoinsViews UTXO set database management data structures. More... | |
bool | reliesOnAssumedValid () |
Return true if this chainstate relies on blocks that are assumed-valid. More... | |
CCoinsViewCache & | CoinsTip () EXCLUSIVE_LOCKS_REQUIRED( |
CCoinsViewDB & | CoinsDB () EXCLUSIVE_LOCKS_REQUIRED( |
CTxMemPool * | GetMempool () |
CCoinsViewErrorCatcher & | CoinsErrorCatcher () EXCLUSIVE_LOCKS_REQUIRED( |
void | ResetCoinsViews () |
Destructs all objects related to accessing the UTXO set. More... | |
bool | FlushStateToDisk (BlockValidationState &state, FlushStateMode mode, int nManualPruneHeight=0) |
Update the on-disk chain state. More... | |
void | ForceFlushStateToDisk () |
Unconditionally flush all changes to disk. More... | |
void | PruneAndFlush () |
Prune blockfiles from the disk if necessary and then flush chainstate changes if we pruned. More... | |
bool | DisconnectTip (BlockValidationState &state, DisconnectedBlockTransactions *disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main |
Disconnect m_chain's tip. More... | |
bool | ReplayBlocks () |
Replay blocks that aren't fully applied to the database. More... | |
bool | NeedsRedownload () const EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Whether the chain state needs to be redownloaded due to lack of witness data. More... | |
bool | LoadGenesisBlock () |
Ensures we have a genesis block in the block tree, possibly writing one to disk. More... | |
void | PruneBlockIndexCandidates () |
Delete all entries in setBlockIndexCandidates that are worse than the current tip. More... | |
CBlockIndex * | FindForkInGlobalIndex (const CBlockLocator &locator) const EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Find the last common block of this chain and a locator. More... | |
void | CheckBlockIndex () |
Make various assertions about the state of the block index. More... | |
void | LoadMempool (const ArgsManager &args) |
Load the persisted mempool from disk. More... | |
bool | LoadChainTip () EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Update the chain tip based on database information, i.e. More... | |
Public Attributes | |
node::BlockManager & | m_blockman |
Reference to a BlockManager instance which itself is shared across all CChainState instances. More... | |
const CChainParams & | m_params |
Chain parameters for this chainstate. More... | |
ChainstateManager & | m_chainman |
The chainstate manager that owns this chainstate. More... | |
CChain | m_chain |
The current chain of blockheaders we consult and build on. More... | |
const std::optional< uint256 > | m_from_snapshot_blockhash |
The blockhash which is the base of the snapshot this chainstate was created from. More... | |
std::set< CBlockIndex *, node::CBlockIndexWorkComparator > | setBlockIndexCandidates |
The set of all CBlockIndex entries with either BLOCK_VALID_TRANSACTIONS (for itself and all ancestors) or BLOCK_ASSUMED_VALID (if using background chainstates) and as good as our current tip or better. More... | |
size_t | m_coinsdb_cache_size_bytes {0} |
The cache size of the on-disk coins view. More... | |
size_t | m_coinstip_cache_size_bytes {0} |
The cache size of the in-memory coins view. More... | |
bool ActivateBestChain(BlockValidationState &state, std::shared_ptr< const CBlock > pblock=nullptr) LOCKS_EXCLUDED(bool | AcceptBlock (const std::shared_ptr< const CBlock > &pblock, BlockValidationState &state, CBlockIndex **ppindex, bool fRequested, const FlatFilePos *dbp, bool *fNewBlock) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Find the best known block, and make it the tip of the block chain. More... | |
DisconnectResult DisconnectBlock(const CBlock &block, const CBlockIndex *pindex, CCoinsViewCache &view) EXCLUSIVE_LOCKS_REQUIRED(boo | ConnectBlock )(const CBlock &block, BlockValidationState &state, CBlockIndex *pindex, CCoinsViewCache &view, bool fJustCheck=false) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Apply the effects of this block (with given index) on the UTXO set represented by coins. More... | |
bool m_mempool | cs |
bool PreciousBlock(BlockValidationState &state, CBlockIndex *pindex) LOCKS_EXCLUDED(bool InvalidateBlock(BlockValidationState &state, CBlockIndex *pindex) LOCKS_EXCLUDED(voi | ResetBlockFailureFlags )(CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Mark a block as precious and reorganize. More... | |
Protected Member Functions | |
int32_t nBlockSequenceId | GUARDED_BY (::cs_main) |
Every received block is assigned a unique and increasing identifier, so we know which one to give priority in case of a fork. More... | |
Protected Attributes | |
int32_t | nBlockReverseSequenceId = -1 |
Decreasing counter (used by subsequent preciousblock calls). More... | |
arith_uint256 | nLastPreciousChainwork = 0 |
chainwork for the last block that preciousblock has been applied to. More... | |
Mutex | m_chainstate_mutex |
The ChainState Mutex A lock that must be held when modifying this ChainState - held in ActivateBestChain() and InvalidateBlock() More... | |
std::atomic< bool > | m_cached_finished_ibd {false} |
Whether this chainstate is undergoing initial block download. More... | |
CTxMemPool * | m_mempool |
Optional mempool that is kept in sync with the chain. More... | |
std::unique_ptr< CoinsViews > | m_coins_views |
Manages the UTXO set, which is a reflection of the contents of m_chain . More... | |
Private Member Functions | |
bool | ActivateBestChainStep (BlockValidationState &state, CBlockIndex *pindexMostWork, const std::shared_ptr< const CBlock > &pblock, bool &fInvalidFound, ConnectTrace &connectTrace) EXCLUSIVE_LOCKS_REQUIRED(cs_main |
Dictates whether we need to flush the cache to disk or not. More... | |
bool | ConnectTip (BlockValidationState &state, CBlockIndex *pindexNew, const std::shared_ptr< const CBlock > &pblock, ConnectTrace &connectTrace, DisconnectedBlockTransactions &disconnectpool) EXCLUSIVE_LOCKS_REQUIRED(cs_main |
Connect a new block to m_chain. More... | |
void | InvalidBlockFound (CBlockIndex *pindex, const BlockValidationState &state) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
CBlockIndex * | FindMostWorkChain () EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Return the tip of the chain with the most work in it, that isn't known to be invalid (it's however far from certain to be valid). More... | |
void | ReceivedBlockTransactions (const CBlock &block, CBlockIndex *pindexNew, const FlatFilePos &pos) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Mark a block as having its data received and checked (up to BLOCK_VALID_TRANSACTIONS). More... | |
bool | RollforwardBlock (const CBlockIndex *pindex, CCoinsViewCache &inputs) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Apply the effects of a block on the utxo cache, ignoring that it may already have been applied. More... | |
void | CheckForkWarningConditions () EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
void | InvalidChainFound (CBlockIndex *pindexNew) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
RecursiveMutex * | MempoolMutex () const LOCK_RETURNED(m_mempool -> cs) |
Indirection necessary to make lock annotations work with an optional mempool. More... | |
void | MaybeUpdateMempoolForReorg (DisconnectedBlockTransactions &disconnectpool, bool fAddToMempool) EXCLUSIVE_LOCKS_REQUIRED(cs_main |
Make mempool consistent after a reorg, by re-adding or recursively erasing disconnected block transactions from the mempool, and also removing any other transactions from the mempool that are no longer valid given the new tip/height. More... | |
Private Attributes | |
void m_mempool | cs |
void UpdateTip(const CBlockIndex *pindexNew) EXCLUSIVE_LOCKS_REQUIRED(frien | ChainstateManager ) |
Check warning conditions and do some notifications on new chain tip set. More... | |
CChainState stores and provides an API to update our local knowledge of the current best chain.
Eventually, the API here is targeted at being exposed externally as a consumable libconsensus library, so any functions added must only call other class member functions, pure functions in other parts of the consensus library, callbacks via the validation interface, or read/write-to-disk functions (eventually this will also be via callbacks).
Anything that is contingent on the current tip of the chain is stored here, whereas block information and metadata independent of the current tip is kept in BlockManager
.
Definition at line 459 of file validation.h.
|
explicit |
Definition at line 1441 of file validation.cpp.
|
private |
Dictates whether we need to flush the cache to disk or not.
Try to make some progress towards making pindexMostWork the active block.
pblock is either nullptr or a pointer to a CBlock corresponding to pindexMostWork.
Definition at line 2752 of file validation.cpp.
void CChainState::CheckBlockIndex | ( | ) |
Make various assertions about the state of the block index.
By default this only executes fully when using the Regtest chain; see: fCheckBlockIndex.
Definition at line 4244 of file validation.cpp.
|
private |
Definition at line 1521 of file validation.cpp.
|
inline |
Definition at line 570 of file validation.h.
|
inline |
Definition at line 584 of file validation.h.
|
inline |
Definition at line 562 of file validation.h.
|
private |
Connect a new block to m_chain.
pblock is either nullptr or a pointer to a CBlock corresponding to pindexNew, to bypass loading it again from disk.
The block is added to connectTrace if connection succeeds.
Definition at line 2609 of file validation.cpp.
bool CChainState::DisconnectTip | ( | BlockValidationState & | state, |
DisconnectedBlockTransactions * | disconnectpool | ||
) |
Disconnect m_chain's tip.
After calling, the mempool will be in an inconsistent state, with transactions from disconnected blocks being added to disconnectpool. You should make the mempool consistent again by calling MaybeUpdateMempoolForReorg. with cs_main held.
If disconnectpool is nullptr, then no disconnected transactions are added to disconnectpool (note that the caller is responsible for mempool consistency in any case).
Definition at line 2506 of file validation.cpp.
CBlockIndex * CChainState::FindForkInGlobalIndex | ( | const CBlockLocator & | locator | ) | const |
Find the last common block of this chain and a locator.
Definition at line 155 of file validation.cpp.
|
private |
Return the tip of the chain with the most work in it, that isn't known to be invalid (it's however far from certain to be valid).
Definition at line 2676 of file validation.cpp.
bool CChainState::FlushStateToDisk | ( | BlockValidationState & | state, |
FlushStateMode | mode, | ||
int | nManualPruneHeight = 0 |
||
) |
Update the on-disk chain state.
The caches and indexes are flushed depending on the mode we're called with if they're too large, if it's been a while since the last write, or always and in all cases if we're in prune mode and are deleting files.
If FlushStateMode::NONE is used, then FlushStateToDisk(...) won't do anything besides checking if we need to prune.
Definition at line 2263 of file validation.cpp.
void CChainState::ForceFlushStateToDisk | ( | ) |
Unconditionally flush all changes to disk.
Definition at line 2395 of file validation.cpp.
|
inline |
Definition at line 577 of file validation.h.
|
protected |
Every received block is assigned a unique and increasing identifier, so we know which one to give priority in case of a fork.
Blocks loaded from disk are assigned id 0, so start the counter at 1.
void CChainState::InitCoinsDB | ( | size_t | cache_size_bytes, |
bool | in_memory, | ||
bool | should_wipe, | ||
std::string | leveldb_name = "chainstate" |
||
) |
Initialize the CoinsViews UTXO set database management data structures.
The in-memory cache is initialized separately.
All parameters forwarded to CoinsViews.
Definition at line 1452 of file validation.cpp.
|
private |
Definition at line 1563 of file validation.cpp.
|
private |
Definition at line 1540 of file validation.cpp.
bool CChainState::LoadChainTip | ( | ) |
Update the chain tip based on database information, i.e.
CoinsTip()'s best block.
Definition at line 3798 of file validation.cpp.
bool CChainState::LoadGenesisBlock | ( | ) |
Ensures we have a genesis block in the block tree, possibly writing one to disk.
Definition at line 4099 of file validation.cpp.
void CChainState::LoadMempool | ( | const ArgsManager & | args | ) |
Load the persisted mempool from disk.
Definition at line 3789 of file validation.cpp.
|
private |
Make mempool consistent after a reorg, by re-adding or recursively erasing disconnected block transactions from the mempool, and also removing any other transactions from the mempool that are no longer valid given the new tip/height.
Note: we assume that disconnectpool only contains transactions that are NOT confirmed in the current chain nor already in the mempool (otherwise, in-mempool descendants of such transactions would be removed).
Passing fAddToMempool=false will skip trying to add the transactions back, and instead just erase from the mempool as needed.
Definition at line 316 of file validation.cpp.
|
inlineprivate |
Indirection necessary to make lock annotations work with an optional mempool.
Definition at line 736 of file validation.h.
bool CChainState::NeedsRedownload | ( | ) | const |
Whether the chain state needs to be redownloaded due to lack of witness data.
Definition at line 4035 of file validation.cpp.
void CChainState::PruneAndFlush | ( | ) |
Prune blockfiles from the disk if necessary and then flush chainstate changes if we pruned.
Definition at line 2403 of file validation.cpp.
void CChainState::PruneBlockIndexCandidates | ( | ) |
Delete all entries in setBlockIndexCandidates that are worse than the current tip.
Definition at line 2735 of file validation.cpp.
|
private |
Mark a block as having its data received and checked (up to BLOCK_VALID_TRANSACTIONS).
Definition at line 3187 of file validation.cpp.
|
inline |
Return true if this chainstate relies on blocks that are assumed-valid.
In practice this means it was created based on a UTXO snapshot.
Definition at line 551 of file validation.h.
bool CChainState::ReplayBlocks | ( | ) |
Replay blocks that aren't fully applied to the database.
Definition at line 3968 of file validation.cpp.
|
inline |
Destructs all objects related to accessing the UTXO set.
Definition at line 591 of file validation.h.
|
private |
Apply the effects of a block on the utxo cache, ignoring that it may already have been applied.
Definition at line 3947 of file validation.cpp.
bool CChainState::AcceptBlock |
Find the best known block, and make it the tip of the block chain.
Store block on disk.
The result is either failure or an activated best chain. pblock is either nullptr or a pointer to a block that is already loaded (to avoid loading it again from disk).
ActivateBestChain is split into steps (see ActivateBestChainStep) so that we avoid holding cs_main for an extended period of time; the length of this call may be quite long during reindexing or a substantial reorg.
May not be called with cs_main held. May not be called in a validationinterface callback.
If dbp is non-nullptr, the file is known to already reside on disk
Definition at line 652 of file validation.h.
|
private |
Check warning conditions and do some notifications on new chain tip set.
Definition at line 759 of file validation.h.
bool CChainState::ConnectBlock |
Apply the effects of this block (with given index) on the UTXO set represented by coins.
Validity checks that depend on the UTXO set are also done; ConnectBlock() can fail if those validity checks fail (among other reasons).
Definition at line 657 of file validation.h.
bool m_mempool CChainState::cs |
Definition at line 661 of file validation.h.
|
private |
Definition at line 756 of file validation.h.
node::BlockManager& CChainState::m_blockman |
Reference to a BlockManager instance which itself is shared across all CChainState instances.
Definition at line 498 of file validation.h.
|
mutableprotected |
Whether this chainstate is undergoing initial block download.
Mutable because we need to be able to mark IsInitialBlockDownload() const, which latches this for caching purposes.
Definition at line 486 of file validation.h.
CChain CChainState::m_chain |
The current chain of blockheaders we consult and build on.
Definition at line 540 of file validation.h.
ChainstateManager& CChainState::m_chainman |
The chainstate manager that owns this chainstate.
The reference is necessary so that this instance can check whether it is the active chainstate within deeply nested method calls.
Definition at line 506 of file validation.h.
|
protected |
The ChainState Mutex A lock that must be held when modifying this ChainState - held in ActivateBestChain() and InvalidateBlock()
Definition at line 478 of file validation.h.
|
protected |
Manages the UTXO set, which is a reflection of the contents of m_chain
.
Definition at line 493 of file validation.h.
size_t CChainState::m_coinsdb_cache_size_bytes {0} |
The cache size of the on-disk coins view.
Definition at line 594 of file validation.h.
size_t CChainState::m_coinstip_cache_size_bytes {0} |
The cache size of the in-memory coins view.
Definition at line 597 of file validation.h.
const std::optional<uint256> CChainState::m_from_snapshot_blockhash |
The blockhash which is the base of the snapshot this chainstate was created from.
std::nullopt if this chainstate was not created from a snapshot.
Definition at line 547 of file validation.h.
|
protected |
Optional mempool that is kept in sync with the chain.
Only the active chainstate has a mempool.
Definition at line 490 of file validation.h.
const CChainParams& CChainState::m_params |
Chain parameters for this chainstate.
Definition at line 501 of file validation.h.
|
protected |
Decreasing counter (used by subsequent preciousblock calls).
Definition at line 469 of file validation.h.
|
protected |
chainwork for the last block that preciousblock has been applied to.
Definition at line 471 of file validation.h.
void CChainState::ResetBlockFailureFlags |
Mark a block as precious and reorganize.
May not be called in a validationinterface callback. Mark a block as invalid. Remove invalidity status from a block and its descendants.
Definition at line 678 of file validation.h.
std::set<CBlockIndex*, node::CBlockIndexWorkComparator> CChainState::setBlockIndexCandidates |
The set of all CBlockIndex entries with either BLOCK_VALID_TRANSACTIONS (for itself and all ancestors) or BLOCK_ASSUMED_VALID (if using background chainstates) and as good as our current tip or better.
Entries may be failed, though, and pruning nodes may be missing the data for the block.
Definition at line 559 of file validation.h.