![]() |
Bitcoin Core
25.99.0
P2P Digital Currency
|
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>
Public Types | |
using | Options = kernel::BlockManagerOpts |
Public Member Functions | |
BlockManager (Options opts) | |
BlockMap m_block_index | GUARDED_BY (cs_main) |
std::unique_ptr< CBlockTreeDB > m_block_tree_db | GUARDED_BY (::cs_main) |
CBlockIndex * | InsertBlockIndex (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... | |
CBlockIndex * | LookupBlockIndex (const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
const CBlockIndex * | LookupBlockIndex (const uint256 &hash) const EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
CBlockFileInfo * | GetBlockFileInfo (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 |
bool | StopAfterBlockImport () const |
uint64_t | CalculateCurrentUsage () |
Calculate the amount of disk space the block & undo files currently use. More... | |
const CBlockIndex * | GetLastCheckpoint (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 CMessageHeader::MessageStartChars &message_start) const |
bool | UndoReadFromDisk (CBlockUndo &blockundo, const CBlockIndex &index) const |
void | CleanupBlockRevFiles () const |
Public Attributes | |
std::atomic< bool > | m_importing {false} |
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 WriteUndoDataForBlock(const CBlockUndo &blockundo, BlockValidationState &state, CBlockIndex &block) EXCLUSIVE_LOCKS_REQUIRED(FlatFilePos | SaveBlockToDisk (const CBlock &block, int nHeight, CChain &active_chain, const FlatFilePos *dbp) |
Store block on disk. More... | |
const CBlockIndex *GetFirstStoredBlock(const CBlockIndex &start_block LIFETIMEBOUND) EXCLUSIVE_LOCKS_REQUIRED(bool | m_have_pruned = false |
Find the first block that is not pruned. More... | |
bool IsBlockPruned(const CBlockIndex *pblockindex) EXCLUSIVE_LOCKS_REQUIRED(void UpdatePruneLock(const std::string &name, const PruneLockInfo &lock_info) EXCLUSIVE_LOCKS_REQUIRED(FILE | 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 CChainParams & | GetParams () const |
const Consensus::Params & | GetConsensus () const |
bool | LoadBlockIndex () EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
Load the blocktree off disk and into memory. More... | |
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) |
FlatFileSeq | BlockFileSeq () const |
FlatFileSeq | UndoFileSeq () const |
FILE * | OpenUndoFile (const FlatFilePos &pos, bool fReadOnly=false) const |
Open an undo file (rev?????.dat) More... | |
bool | WriteBlockToDisk (const CBlock &block, FlatFilePos &pos, const CMessageHeader::MessageStartChars &messageStart) const |
bool | UndoWriteToDisk (const CBlockUndo &blockundo, FlatFilePos &pos, const uint256 &hashBlock, const CMessageHeader::MessageStartChars &messageStart) const |
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... | |
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... | |
Private Attributes | |
friend | Chainstate |
friend | ChainstateManager |
RecursiveMutex | cs_LastBlockFile |
std::vector< CBlockFileInfo > | m_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... | |
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 |
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 78 of file blockstorage.h.
Definition at line 154 of file blockstorage.h.
|
inlineexplicit |
Definition at line 156 of file blockstorage.h.
|
private |
uint64_t node::BlockManager::CalculateCurrentUsage | ( | ) |
Calculate the amount of disk space the block & undo files currently use.
Definition at line 557 of file blockstorage.cpp.
void node::BlockManager::CleanupBlockRevFiles | ( | ) | const |
|
private |
|
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.
[out] | setFilesToPrune | The set of file indices that can be unlinked will be returned |
Definition at line 172 of file blockstorage.cpp.
|
private |
Definition at line 149 of file blockstorage.cpp.
|
private |
|
private |
Definition at line 535 of file blockstorage.cpp.
|
private |
Definition at line 527 of file blockstorage.cpp.
CBlockFileInfo * node::BlockManager::GetBlockFileInfo | ( | size_t | n | ) |
Get block file info entry for one block file.
Definition at line 458 of file blockstorage.cpp.
fs::path node::BlockManager::GetBlockPosFilename | ( | const FlatFilePos & | pos | ) | const |
Translation to a filesystem path.
Definition at line 602 of file blockstorage.cpp.
|
inlineprivate |
Definition at line 85 of file blockstorage.h.
const CBlockIndex * node::BlockManager::GetLastCheckpoint | ( | const CCheckpointData & | data | ) |
Returns last CBlockIndex* that is a checkpoint.
Definition at line 386 of file blockstorage.cpp.
|
inlineprivate |
Definition at line 84 of file blockstorage.h.
|
inline |
Attempt to stay below this number of bytes of block files.
Definition at line 207 of file blockstorage.h.
|
private |
Map from external index name to oldest block that must not be pruned.
std::unique_ptr<CBlockTreeDB> m_block_tree_db node::BlockManager::GUARDED_BY | ( | ::cs_main | ) |
CBlockIndex * node::BlockManager::InsertBlockIndex | ( | const uint256 & | hash | ) |
Create a new block index entry for a given block hash.
Definition at line 236 of file blockstorage.cpp.
|
inline |
Whether running in -prune mode.
Definition at line 204 of file blockstorage.h.
|
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 252 of file blockstorage.cpp.
|
inline |
Definition at line 210 of file blockstorage.h.
const CBlockIndex * node::BlockManager::LookupBlockIndex | ( | const uint256 & | hash | ) | const |
CBlockIndex * node::BlockManager::LookupBlockIndex | ( | const uint256 & | hash | ) |
Definition at line 67 of file blockstorage.cpp.
|
private |
Open an undo file (rev?????.dat)
Definition at line 597 of file blockstorage.cpp.
void node::BlockManager::PruneOneBlockFile | ( | const int | fileNumber | ) |
Mark one block file as pruned (modify associated database entries)
Definition at line 115 of file blockstorage.cpp.
bool node::BlockManager::ReadBlockFromDisk | ( | CBlock & | block, |
const CBlockIndex & | index | ||
) | const |
bool node::BlockManager::ReadBlockFromDisk | ( | CBlock & | block, |
const FlatFilePos & | pos | ||
) | const |
Functions for disk access for blocks.
Definition at line 748 of file blockstorage.cpp.
bool node::BlockManager::ReadRawBlockFromDisk | ( | std::vector< uint8_t > & | block, |
const FlatFilePos & | pos, | ||
const CMessageHeader::MessageStartChars & | message_start | ||
) | const |
|
inline |
|
private |
bool node::BlockManager::UndoReadFromDisk | ( | CBlockUndo & | blockundo, |
const CBlockIndex & | index | ||
) | const |
Definition at line 494 of file blockstorage.cpp.
|
private |
void node::BlockManager::UnlinkPrunedFiles | ( | const std::set< int > & | setFilesToPrune | ) | const |
Actually unlink the specified files.
Definition at line 568 of file blockstorage.cpp.
|
private |
|
private |
Definition at line 80 of file blockstorage.h.
|
private |
Definition at line 81 of file blockstorage.h.
|
private |
Definition at line 126 of file blockstorage.h.
|
private |
Definition at line 127 of file blockstorage.h.
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 170 of file blockstorage.h.
|
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 133 of file blockstorage.h.
|
private |
Dirty block index entries.
Definition at line 138 of file blockstorage.h.
|
private |
Dirty block file entries.
Definition at line 141 of file blockstorage.h.
const CBlockIndex* GetFirstStoredBlock (const CBlockIndex& start_block LIFETIMEBOUND) EXCLUSIVE_LOCKS_REQUIRED( bool node::BlockManager::m_have_pruned = false |
Find the first block that is not pruned.
True if any block files have ever been pruned.
Definition at line 224 of file blockstorage.h.
std::atomic<bool> node::BlockManager::m_importing {false} |
Definition at line 160 of file blockstorage.h.
|
private |
Definition at line 128 of file blockstorage.h.
|
private |
Definition at line 151 of file blockstorage.h.
|
private |
Definition at line 135 of file blockstorage.h.
FILE * 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 233 of file blockstorage.h.
|
staticconstexpr |
Definition at line 208 of file blockstorage.h.
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 201 of file blockstorage.h.