Bitcoin Core  22.99.0
P2P Digital Currency
Public Member Functions | Public Attributes | Private Member Functions | Private Attributes | List of all members
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 BlockManager:
[legend]

Public Member Functions

BlockMap m_block_index GUARDED_BY (cs_main)
 
std::unique_ptr< CBlockTreeDB > m_block_tree_db GUARDED_BY (::cs_main)
 
void Unload () EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 Clear all data members. More...
 
CBlockIndexAddToBlockIndex (const CBlockHeader &block) EXCLUSIVE_LOCKS_REQUIRED(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) const EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 
CBlockFileInfoGetBlockFileInfo (size_t n)
 Get block file info entry for one block file. More...
 
bool WriteUndoDataForBlock (const CBlockUndo &blockundo, BlockValidationState &state, CBlockIndex *pindex, const CChainParams &chainparams)
 
FlatFilePos SaveBlockToDisk (const CBlock &block, int nHeight, CChain &active_chain, const CChainParams &chainparams, const FlatFilePos *dbp)
 Store block on disk. More...
 
uint64_t CalculateCurrentUsage ()
 Calculate the amount of disk space the block & undo files currently use. More...
 
CBlockIndexGetLastCheckpoint (const CCheckpointData &data) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 Returns last CBlockIndex* that is a checkpoint. More...
 
 ~BlockManager ()
 

Public Attributes

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(ChainstateManager &chainman) EXCLUSIVE_LOCKS_REQUIRED(bool LoadBlockIndex (const Consensus::Params &consensus_params, ChainstateManager &chainman) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
 Load the blocktree off disk and into memory. More...
 

Private Member Functions

void FlushBlockFile (bool fFinalize=false, bool finalize_undo=false)
 
void FlushUndoFile (int block_file, bool finalize=false)
 
bool FindBlockPos (FlatFilePos &pos, unsigned int nAddSize, unsigned int nHeight, CChain &active_chain, uint64_t nTime, bool fKnown)
 
bool FindUndoPos (BlockValidationState &state, int nFile, FlatFilePos &pos, unsigned int nAddSize)
 
void FindFilesToPruneManual (std::set< int > &setFilesToPrune, int nManualPruneHeight, int chain_tip_height)
 
void FindFilesToPrune (std::set< int > &setFilesToPrune, uint64_t nPruneAfterHeight, int chain_tip_height, int prune_height, bool is_ibd)
 Prune block and undo files (blk???.dat and rev???.dat) so that the disk space used is less than a user-defined target. More...
 

Private Attributes

friend CChainState
 
friend ChainstateManager
 
RecursiveMutex cs_LastBlockFile
 
std::vector< CBlockFileInfom_blockfile_info
 
int m_last_blockfile = 0
 
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...
 
std::set< CBlockIndex * > m_dirty_blockindex
 Dirty block index entries. More...
 
std::set< int > m_dirty_fileinfo
 Dirty block file entries. More...
 

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 CChainState - information about, e.g., candidate tips is not maintained here.

Definition at line 64 of file blockstorage.h.

Constructor & Destructor Documentation

◆ ~BlockManager()

BlockManager::~BlockManager ( )
inline

Definition at line 158 of file blockstorage.h.

Here is the call graph for this function:

Member Function Documentation

◆ AddToBlockIndex()

CBlockIndex * BlockManager::AddToBlockIndex ( const CBlockHeader block)

Definition at line 41 of file blockstorage.cpp.

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

◆ CalculateCurrentUsage()

uint64_t BlockManager::CalculateCurrentUsage ( )

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

Definition at line 570 of file blockstorage.cpp.

Here is the caller graph for this function:

◆ FindBlockPos()

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

Definition at line 617 of file blockstorage.cpp.

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

◆ FindFilesToPrune()

void BlockManager::FindFilesToPrune ( std::set< int > &  setFilesToPrune,
uint64_t  nPruneAfterHeight,
int  chain_tip_height,
int  prune_height,
bool  is_ibd 
)
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

Definition at line 134 of file blockstorage.cpp.

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

◆ FindFilesToPruneManual()

void BlockManager::FindFilesToPruneManual ( std::set< int > &  setFilesToPrune,
int  nManualPruneHeight,
int  chain_tip_height 
)
private

Definition at line 111 of file blockstorage.cpp.

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

◆ FindUndoPos()

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

Definition at line 672 of file blockstorage.cpp.

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

◆ FlushBlockFile()

void BlockManager::FlushBlockFile ( bool  fFinalize = false,
bool  finalize_undo = false 
)
private

Definition at line 558 of file blockstorage.cpp.

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

◆ FlushUndoFile()

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

Definition at line 550 of file blockstorage.cpp.

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

◆ GetBlockFileInfo()

CBlockFileInfo * BlockManager::GetBlockFileInfo ( size_t  n)

Get block file info entry for one block file.

Definition at line 482 of file blockstorage.cpp.

◆ GetLastCheckpoint()

CBlockIndex * BlockManager::GetLastCheckpoint ( const CCheckpointData data)

Returns last CBlockIndex* that is a checkpoint.

Definition at line 415 of file blockstorage.cpp.

Here is the call graph for this function:

◆ GUARDED_BY() [1/2]

std::unique_ptr<CBlockTreeDB> m_block_tree_db BlockManager::GUARDED_BY ( ::cs_main  )

◆ GUARDED_BY() [2/2]

BlockMap m_block_index BlockManager::GUARDED_BY ( cs_main  )

◆ InsertBlockIndex()

CBlockIndex * BlockManager::InsertBlockIndex ( const uint256 hash)

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

Definition at line 193 of file blockstorage.cpp.

Here is the call graph for this function:

◆ LookupBlockIndex()

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

Definition at line 34 of file blockstorage.cpp.

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

◆ PruneOneBlockFile()

void BlockManager::PruneOneBlockFile ( const int  fileNumber)

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

Definition at line 77 of file blockstorage.cpp.

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

◆ SaveBlockToDisk()

FlatFilePos BlockManager::SaveBlockToDisk ( const CBlock block,
int  nHeight,
CChain active_chain,
const CChainParams chainparams,
const FlatFilePos dbp 
)

Store block on disk.

If dbp is non-nullptr, the file is known to already reside on disk

Definition at line 837 of file blockstorage.cpp.

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

◆ Unload()

void BlockManager::Unload ( )

Clear all data members.

Definition at line 325 of file blockstorage.cpp.

Here is the caller graph for this function:

◆ WriteUndoDataForBlock()

bool BlockManager::WriteUndoDataForBlock ( const CBlockUndo blockundo,
BlockValidationState state,
CBlockIndex pindex,
const CChainParams chainparams 
)

Definition at line 717 of file blockstorage.cpp.

Here is the call graph for this function:

Member Data Documentation

◆ CChainState

friend BlockManager::CChainState
private

Definition at line 66 of file blockstorage.h.

◆ ChainstateManager

friend BlockManager::ChainstateManager
private

Definition at line 67 of file blockstorage.h.

◆ cs_LastBlockFile

RecursiveMutex BlockManager::cs_LastBlockFile
private

Definition at line 95 of file blockstorage.h.

◆ LoadBlockIndex

bool BlockManager::LoadBlockIndex

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 129 of file blockstorage.h.

◆ m_blockfile_info

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

Definition at line 96 of file blockstorage.h.

◆ m_blocks_unlinked

std::multimap<CBlockIndex*, CBlockIndex*> 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 117 of file blockstorage.h.

◆ m_check_for_pruning

bool 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 102 of file blockstorage.h.

◆ m_dirty_blockindex

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

Dirty block index entries.

Definition at line 105 of file blockstorage.h.

◆ m_dirty_fileinfo

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

Dirty block file entries.

Definition at line 108 of file blockstorage.h.

◆ m_last_blockfile

int BlockManager::m_last_blockfile = 0
private

Definition at line 97 of file blockstorage.h.


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