Bitcoin Core  27.99.0
P2P Digital Currency
Public Types | Public Member Functions | Public Attributes | Static Public Attributes | Private Member Functions | Private Attributes | List of all members
node::BlockManager Class Reference

Maintains a tree of blocks (stored in m_block_index) which is consulted to determine where the most-work tip is. More...

#include <blockstorage.h>

Collaboration diagram for node::BlockManager:
[legend]

Public Types

using Options = kernel::BlockManagerOpts
 

Public Member Functions

 BlockManager (const util::SignalInterrupt &interrupt, Options opts)
 
BlockMap m_block_index GUARDED_BY (cs_main)
 
std::unique_ptr< BlockTreeDB > m_block_tree_db GUARDED_BY (::cs_main)
 
CBlockIndexInsertBlockIndex (const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 Create a new block index entry for a given block hash. More...
 
void PruneOneBlockFile (const int fileNumber) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 Mark one block file as pruned (modify associated database entries) More...
 
CBlockIndexLookupBlockIndex (const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 
const CBlockIndexLookupBlockIndex (const uint256 &hash) const EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 
CBlockFileInfoGetBlockFileInfo (size_t n)
 Get block file info entry for one block file. More...
 
bool IsPruneMode () const
 Whether running in -prune mode. More...
 
uint64_t GetPruneTarget () const
 Attempt to stay below this number of bytes of block files. More...
 
bool LoadingBlocks () const
 
uint64_t CalculateCurrentUsage ()
 Calculate the amount of disk space the block & undo files currently use. More...
 
const CBlockIndexGetLastCheckpoint (const CCheckpointData &data) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 Returns last CBlockIndex* that is a checkpoint. More...
 
fs::path GetBlockPosFilename (const FlatFilePos &pos) const
 Translation to a filesystem path. More...
 
void UnlinkPrunedFiles (const std::set< int > &setFilesToPrune) const
 Actually unlink the specified files. More...
 
bool ReadBlockFromDisk (CBlock &block, const FlatFilePos &pos) const
 Functions for disk access for blocks. More...
 
bool ReadBlockFromDisk (CBlock &block, const CBlockIndex &index) const
 
bool ReadRawBlockFromDisk (std::vector< uint8_t > &block, const FlatFilePos &pos) const
 
bool UndoReadFromDisk (CBlockUndo &blockundo, const CBlockIndex &index) const
 
void CleanupBlockRevFiles () const
 

Public Attributes

const util::SignalInterruptm_interrupt
 
std::atomic< bool > m_importing {false}
 
std::optional< int > m_snapshot_height
 The height of the base block of an assumeutxo snapshot, if one is in use. More...
 
std::vector< CBlockIndex * > GetAllBlockIndices() EXCLUSIVE_LOCKS_REQUIRED(std::multimap< CBlockIndex *, CBlockIndex * > m_blocks_unlinked
 All pairs A->B, where A (or one of its ancestors) misses transactions, but B has transactions. More...
 
bool WriteBlockIndexDB() EXCLUSIVE_LOCKS_REQUIRED(bool LoadBlockIndexDB(const std::optional< uint256 > &snapshot_blockhash) EXCLUSIVE_LOCKS_REQUIRED(void ScanAndUnlinkAlreadyPrunedFiles() EXCLUSIVE_LOCKS_REQUIRED(CBlockIndexAddToBlockIndex (const CBlockHeader &block, CBlockIndex *&best_header) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 Remove any pruned block & undo files that are still on disk. More...
 
bool WriteUndoDataForBlock(const CBlockUndo &blockundo, BlockValidationState &state, CBlockIndex &block) EXCLUSIVE_LOCKS_REQUIRED(FlatFilePos SaveBlockToDisk (const CBlock &block, int nHeight, const FlatFilePos *dbp)
 Store block on disk. More...
 
bool CheckBlockDataAvailability(const CBlockIndex &upper_block LIFETIMEBOUND, const CBlockIndex &lower_block LIFETIMEBOUND) EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetFirstStoredBlock(const CBlockIndex &start_block LIFETIMEBOUND, const CBlockIndex *lower_block=nullptr) EXCLUSIVE_LOCKS_REQUIRED(boo m_have_pruned ) = false
 Check if all blocks in the [upper_block, lower_block] range have data available. More...
 
bool IsBlockPruned(const CBlockIndex &block) EXCLUSIVE_LOCKS_REQUIRED(void UpdatePruneLock(const std::string &name, const PruneLockInfo &lock_info) EXCLUSIVE_LOCKS_REQUIRED(AutoFile OpenBlockFile (const FlatFilePos &pos, bool fReadOnly=false) const
 Check whether the block associated with this index entry is pruned or not. More...
 

Static Public Attributes

static constexpr auto PRUNE_TARGET_MANUAL {std::numeric_limits<uint64_t>::max()}
 

Private Member Functions

const CChainParamsGetParams () const
 
const Consensus::ParamsGetConsensus () const
 
bool LoadBlockIndex (const std::optional< uint256 > &snapshot_blockhash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 Load the blocktree off disk and into memory. More...
 
bool FlushBlockFile (int blockfile_num, bool fFinalize, bool finalize_undo)
 Return false if block file or undo file flushing fails. More...
 
bool FlushUndoFile (int block_file, bool finalize=false)
 Return false if undo file flushing fails. More...
 
bool FindBlockPos (FlatFilePos &pos, unsigned int nAddSize, unsigned int nHeight, uint64_t nTime, bool fKnown)
 
bool FlushChainstateBlockFile (int tip_height)
 
bool FindUndoPos (BlockValidationState &state, int nFile, FlatFilePos &pos, unsigned int nAddSize)
 
FlatFileSeq BlockFileSeq () const
 
FlatFileSeq UndoFileSeq () const
 
AutoFile OpenUndoFile (const FlatFilePos &pos, bool fReadOnly=false) const
 Open an undo file (rev?????.dat) More...
 
bool WriteBlockToDisk (const CBlock &block, FlatFilePos &pos) const
 
bool UndoWriteToDisk (const CBlockUndo &blockundo, FlatFilePos &pos, const uint256 &hashBlock) const
 
void FindFilesToPruneManual (std::set< int > &setFilesToPrune, int nManualPruneHeight, const Chainstate &chain, ChainstateManager &chainman)
 
void FindFilesToPrune (std::set< int > &setFilesToPrune, int last_prune, const Chainstate &chain, ChainstateManager &chainman)
 Prune block and undo files (blk???.dat and rev???.dat) so that the disk space used is less than a user-defined target. More...
 
std::array< std::optional< BlockfileCursor >, BlockfileType::NUM_TYPES > m_blockfile_cursors GUARDED_BY (cs_LastBlockFile)
 Since assumedvalid chainstates may be syncing a range of the chain that is very far away from the normal/background validation process, we should segment blockfiles for assumed chainstates. More...
 
int MaxBlockfileNum () const EXCLUSIVE_LOCKS_REQUIRED(cs_LastBlockFile)
 
std::unordered_map< std::string, PruneLockInfo > m_prune_locks GUARDED_BY (::cs_main)
 Map from external index name to oldest block that must not be pruned. More...
 
BlockfileType BlockfileTypeForHeight (int height)
 

Private Attributes

friend Chainstate
 
friend ChainstateManager
 
RecursiveMutex cs_LastBlockFile
 
std::vector< CBlockFileInfom_blockfile_info
 
bool m_check_for_pruning = false
 Global flag to indicate we should check to see if there are block/undo files that should be deleted. More...
 
const bool m_prune_mode
 
std::set< CBlockIndex * > m_dirty_blockindex
 Dirty block index entries. More...
 
std::set< int > m_dirty_fileinfo
 Dirty block file entries. More...
 
const kernel::BlockManagerOpts m_opts
 

Detailed Description

Maintains a tree of blocks (stored in m_block_index) which is consulted to determine where the most-work tip is.

This data is used mostly in Chainstate - information about, e.g., candidate tips is not maintained here.

Definition at line 136 of file blockstorage.h.

Member Typedef Documentation

◆ Options

Definition at line 252 of file blockstorage.h.

Constructor & Destructor Documentation

◆ BlockManager()

node::BlockManager::BlockManager ( const util::SignalInterrupt interrupt,
Options  opts 
)
inlineexplicit

Definition at line 254 of file blockstorage.h.

Member Function Documentation

◆ BlockFileSeq()

FlatFileSeq node::BlockManager::BlockFileSeq ( ) const
private

Definition at line 825 of file blockstorage.cpp.

Here is the caller graph for this function:

◆ BlockfileTypeForHeight()

BlockfileType node::BlockManager::BlockfileTypeForHeight ( int  height)
private

Definition at line 779 of file blockstorage.cpp.

Here is the caller graph for this function:

◆ CalculateCurrentUsage()

uint64_t node::BlockManager::CalculateCurrentUsage ( )

Calculate the amount of disk space the block & undo files currently use.

Definition at line 801 of file blockstorage.cpp.

Here is the caller graph for this function:

◆ CleanupBlockRevFiles()

void node::BlockManager::CleanupBlockRevFiles ( ) const

Definition at line 629 of file blockstorage.cpp.

Here is the call graph for this function:

◆ FindBlockPos()

bool node::BlockManager::FindBlockPos ( FlatFilePos pos,
unsigned int  nAddSize,
unsigned int  nHeight,
uint64_t  nTime,
bool  fKnown 
)
private

Definition at line 851 of file blockstorage.cpp.

Here is the call graph for this function:

◆ FindFilesToPrune()

void node::BlockManager::FindFilesToPrune ( std::set< int > &  setFilesToPrune,
int  last_prune,
const Chainstate chain,
ChainstateManager chainman 
)
private

Prune block and undo files (blk???.dat and rev???.dat) so that the disk space used is less than a user-defined target.

The user sets the target (in MB) on the command line or in config file. This will be run on startup and whenever new space is allocated in a block or undo file, staying below the target. Changing back to unpruned requires a reindex (which in this case means the blockchain must be re-downloaded.)

Pruning functions are called from FlushStateToDisk when the m_check_for_pruning flag has been set. Block and undo files are deleted in lock-step (when blk00003.dat is deleted, so is rev00003.dat.) Pruning cannot take place until the longest chain is at least a certain length (CChainParams::nPruneAfterHeight). Pruning will never delete a block within a defined distance (currently 288) from the active chain's tip. The block index is updated by unsetting HAVE_DATA and HAVE_UNDO for any blocks that were stored in the deleted files. A db flag records the fact that at least some block files have been pruned.

Parameters
[out]setFilesToPruneThe set of file indices that can be unlinked will be returned
last_pruneThe last height we're able to prune, according to the prune locks

Definition at line 302 of file blockstorage.cpp.

Here is the call graph for this function:

◆ FindFilesToPruneManual()

void node::BlockManager::FindFilesToPruneManual ( std::set< int > &  setFilesToPrune,
int  nManualPruneHeight,
const Chainstate chain,
ChainstateManager chainman 
)
private

Definition at line 272 of file blockstorage.cpp.

Here is the call graph for this function:

◆ FindUndoPos()

bool node::BlockManager::FindUndoPos ( BlockValidationState state,
int  nFile,
FlatFilePos pos,
unsigned int  nAddSize 
)
private

Definition at line 950 of file blockstorage.cpp.

Here is the call graph for this function:

◆ FlushBlockFile()

bool node::BlockManager::FlushBlockFile ( int  blockfile_num,
bool  fFinalize,
bool  finalize_undo 
)
private

Return false if block file or undo file flushing fails.

Definition at line 750 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FlushChainstateBlockFile()

bool node::BlockManager::FlushChainstateBlockFile ( int  tip_height)
private

Definition at line 787 of file blockstorage.cpp.

Here is the call graph for this function:

◆ FlushUndoFile()

bool node::BlockManager::FlushUndoFile ( int  block_file,
bool  finalize = false 
)
private

Return false if undo file flushing fails.

Definition at line 740 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetBlockFileInfo()

CBlockFileInfo * node::BlockManager::GetBlockFileInfo ( size_t  n)

Get block file info entry for one block file.

Definition at line 665 of file blockstorage.cpp.

◆ GetBlockPosFilename()

fs::path node::BlockManager::GetBlockPosFilename ( const FlatFilePos pos) const

Translation to a filesystem path.

Definition at line 846 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetConsensus()

const Consensus::Params& node::BlockManager::GetConsensus ( ) const
inlineprivate

Definition at line 143 of file blockstorage.h.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetLastCheckpoint()

const CBlockIndex * node::BlockManager::GetLastCheckpoint ( const CCheckpointData data)

Returns last CBlockIndex* that is a checkpoint.

Definition at line 578 of file blockstorage.cpp.

Here is the call graph for this function:

◆ GetParams()

const CChainParams& node::BlockManager::GetParams ( ) const
inlineprivate

Definition at line 142 of file blockstorage.h.

Here is the caller graph for this function:

◆ GetPruneTarget()

uint64_t node::BlockManager::GetPruneTarget ( ) const
inline

Attempt to stay below this number of bytes of block files.

Definition at line 322 of file blockstorage.h.

Here is the caller graph for this function:

◆ GUARDED_BY() [1/4]

std::unordered_map<std::string, PruneLockInfo> m_prune_locks node::BlockManager::GUARDED_BY ( ::cs_main  )
private

Map from external index name to oldest block that must not be pruned.

Note
Internally, only blocks at height (height_first - PRUNE_LOCK_BUFFER - 1) and below will be pruned, but callers should avoid assuming any particular buffer size.

◆ GUARDED_BY() [2/4]

std::unique_ptr<BlockTreeDB> m_block_tree_db node::BlockManager::GUARDED_BY ( ::cs_main  )

◆ GUARDED_BY() [3/4]

std::array<std::optional<BlockfileCursor>, BlockfileType::NUM_TYPES> m_blockfile_cursors node::BlockManager::GUARDED_BY ( cs_LastBlockFile  )
private

Since assumedvalid chainstates may be syncing a range of the chain that is very far away from the normal/background validation process, we should segment blockfiles for assumed chainstates.

Otherwise, we might have wildly different height ranges mixed into the same block files, which would impair our ability to prune effectively.

This data structure maintains separate blockfile number cursors for each BlockfileType. The ASSUMED state is initialized, when necessary, in FindBlockPos().

The first element is the NORMAL cursor, second is ASSUMED.

◆ GUARDED_BY() [4/4]

BlockMap m_block_index node::BlockManager::GUARDED_BY ( cs_main  )

◆ InsertBlockIndex()

CBlockIndex * node::BlockManager::InsertBlockIndex ( const uint256 hash)

Create a new block index entry for a given block hash.

Definition at line 381 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsPruneMode()

bool node::BlockManager::IsPruneMode ( ) const
inline

Whether running in -prune mode.

Definition at line 319 of file blockstorage.h.

Here is the caller graph for this function:

◆ LoadBlockIndex()

bool node::BlockManager::LoadBlockIndex ( const std::optional< uint256 > &  snapshot_blockhash)
private

Load the blocktree off disk and into memory.

Populate certain metadata per index entry (nStatus, nChainWork, nTimeMax, etc.) as well as peripheral collections like m_dirty_blockindex.

Definition at line 397 of file blockstorage.cpp.

Here is the call graph for this function:

◆ LoadingBlocks()

bool node::BlockManager::LoadingBlocks ( ) const
inline

Definition at line 325 of file blockstorage.h.

Here is the caller graph for this function:

◆ LookupBlockIndex() [1/2]

const CBlockIndex * node::BlockManager::LookupBlockIndex ( const uint256 hash) const

Definition at line 197 of file blockstorage.cpp.

Here is the call graph for this function:

◆ LookupBlockIndex() [2/2]

CBlockIndex * node::BlockManager::LookupBlockIndex ( const uint256 hash)

Definition at line 190 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ MaxBlockfileNum()

int node::BlockManager::MaxBlockfileNum ( ) const
inlineprivate

Definition at line 217 of file blockstorage.h.

Here is the caller graph for this function:

◆ OpenUndoFile()

AutoFile node::BlockManager::OpenUndoFile ( const FlatFilePos pos,
bool  fReadOnly = false 
) const
private

Open an undo file (rev?????.dat)

Definition at line 841 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ PruneOneBlockFile()

void node::BlockManager::PruneOneBlockFile ( const int  fileNumber)

Mark one block file as pruned (modify associated database entries)

Definition at line 238 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ReadBlockFromDisk() [1/2]

bool node::BlockManager::ReadBlockFromDisk ( CBlock block,
const CBlockIndex index 
) const

Definition at line 1073 of file blockstorage.cpp.

Here is the call graph for this function:

◆ ReadBlockFromDisk() [2/2]

bool node::BlockManager::ReadBlockFromDisk ( CBlock block,
const FlatFilePos pos 
) const

Functions for disk access for blocks.

Definition at line 1039 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ReadRawBlockFromDisk()

bool node::BlockManager::ReadRawBlockFromDisk ( std::vector< uint8_t > &  block,
const FlatFilePos pos 
) const

Definition at line 1088 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UndoFileSeq()

FlatFileSeq node::BlockManager::UndoFileSeq ( ) const
private

Definition at line 830 of file blockstorage.cpp.

Here is the caller graph for this function:

◆ UndoReadFromDisk()

bool node::BlockManager::UndoReadFromDisk ( CBlockUndo blockundo,
const CBlockIndex index 
) const

Definition at line 703 of file blockstorage.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ UndoWriteToDisk()

bool node::BlockManager::UndoWriteToDisk ( const CBlockUndo blockundo,
FlatFilePos pos,
const uint256 hashBlock 
) const
private

Definition at line 672 of file blockstorage.cpp.

Here is the call graph for this function:

◆ UnlinkPrunedFiles()

void node::BlockManager::UnlinkPrunedFiles ( const std::set< int > &  setFilesToPrune) const

Actually unlink the specified files.

Definition at line 812 of file blockstorage.cpp.

Here is the call graph for this function:

◆ WriteBlockToDisk()

bool node::BlockManager::WriteBlockToDisk ( const CBlock block,
FlatFilePos pos 
) const
private

Definition at line 972 of file blockstorage.cpp.

Here is the call graph for this function:

Member Data Documentation

◆ AddToBlockIndex

CBlockIndex * node::BlockManager::AddToBlockIndex

Remove any pruned block & undo files that are still on disk.

This could happen on some systems if the file was still being read while unlinked, or if we crash before unlinking.

Definition at line 299 of file blockstorage.h.

◆ Chainstate

friend node::BlockManager::Chainstate
private

Definition at line 138 of file blockstorage.h.

◆ ChainstateManager

friend node::BlockManager::ChainstateManager
private

Definition at line 139 of file blockstorage.h.

◆ cs_LastBlockFile

RecursiveMutex node::BlockManager::cs_LastBlockFile
private

Definition at line 199 of file blockstorage.h.

◆ m_blockfile_info

std::vector<CBlockFileInfo> node::BlockManager::m_blockfile_info
private

Definition at line 200 of file blockstorage.h.

◆ m_blocks_unlinked

std::vector<CBlockIndex*> GetAllBlockIndices () EXCLUSIVE_LOCKS_REQUIRED( std::multimap<CBlockIndex*, CBlockIndex*> node::BlockManager::m_blocks_unlinked

All pairs A->B, where A (or one of its ancestors) misses transactions, but B has transactions.

Pruned nodes may have entries where B is missing data.

Definition at line 284 of file blockstorage.h.

◆ m_check_for_pruning

bool node::BlockManager::m_check_for_pruning = false
private

Global flag to indicate we should check to see if there are block/undo files that should be deleted.

Set on startup or if we allocate more file space when we're in prune mode

Definition at line 229 of file blockstorage.h.

◆ m_dirty_blockindex

std::set<CBlockIndex*> node::BlockManager::m_dirty_blockindex
private

Dirty block index entries.

Definition at line 234 of file blockstorage.h.

◆ m_dirty_fileinfo

std::set<int> node::BlockManager::m_dirty_fileinfo
private

Dirty block file entries.

Definition at line 237 of file blockstorage.h.

◆ m_have_pruned

bool CheckBlockDataAvailability (const CBlockIndex& upper_block LIFETIMEBOUND, const CBlockIndex& lower_block LIFETIMEBOUND) EXCLUSIVE_LOCKS_REQUIRED( const CBlockIndex* GetFirstStoredBlock (const CBlockIndex& start_block LIFETIMEBOUND, const CBlockIndex* lower_block=nullptr) EXCLUSIVE_LOCKS_REQUIRED( boo node::BlockManager::m_have_pruned) = false

Check if all blocks in the [upper_block, lower_block] range have data available.

The caller is responsible for ensuring that lower_block is an ancestor of upper_block (part of the same chain). Find the first stored ancestor of start_block immediately after the last pruned ancestor. Return value will never be null. Caller is responsible for ensuring that start_block has data is not pruned. True if any block files have ever been pruned.

Definition at line 344 of file blockstorage.h.

◆ m_importing

std::atomic<bool> node::BlockManager::m_importing {false}

Definition at line 260 of file blockstorage.h.

◆ m_interrupt

const util::SignalInterrupt& node::BlockManager::m_interrupt

Definition at line 259 of file blockstorage.h.

◆ m_opts

const kernel::BlockManagerOpts node::BlockManager::m_opts
private

Definition at line 249 of file blockstorage.h.

◆ m_prune_mode

const bool node::BlockManager::m_prune_mode
private

Definition at line 231 of file blockstorage.h.

◆ m_snapshot_height

std::optional<int> node::BlockManager::m_snapshot_height

The height of the base block of an assumeutxo snapshot, if one is in use.

This controls how blockfiles are segmented by chainstate type to avoid comingling different height regions of the chain when an assumedvalid chainstate is in use. If heights are drastically different in the same blockfile, pruning suffers.

This is set during ActivateSnapshot() or upon LoadBlockIndex() if a snapshot had been previously loaded. After the snapshot is validated, this is unset to restore normal LoadBlockIndex behavior.

Definition at line 276 of file blockstorage.h.

◆ OpenBlockFile

AutoFile node::BlockManager::OpenBlockFile

Check whether the block associated with this index entry is pruned or not.

Create or update a prune lock identified by its name Open a block file (blk?????.dat)

Definition at line 353 of file blockstorage.h.

◆ PRUNE_TARGET_MANUAL

constexpr auto node::BlockManager::PRUNE_TARGET_MANUAL {std::numeric_limits<uint64_t>::max()}
staticconstexpr

Definition at line 323 of file blockstorage.h.

◆ SaveBlockToDisk

FlatFilePos node::BlockManager::SaveBlockToDisk

Store block on disk.

If dbp is not nullptr, then it provides the known position of the block within a block file on disk.

Definition at line 316 of file blockstorage.h.


The documentation for this class was generated from the following files: