![]() |
Bitcoin Core 31.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 |
| using | ReadRawBlockResult = util::Expected< std::vector< std::byte >, ReadRawError > |
Public Member Functions | |
| BlockManager (const util::SignalInterrupt &interrupt, Options opts) | |
| BlockMap m_block_index | GUARDED_BY (cs_main) |
| void | AddUnlinkedBlock (CBlockIndex *block) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
| std::unique_ptr< BlockTreeDB > 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 (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) |
| uint64_t | GetPruneTarget () const |
| Attempt to stay below this number of bytes of block files. More... | |
| bool | LoadingBlocks () const |
| 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 | ReadBlock (CBlock &block, const FlatFilePos &pos, const std::optional< uint256 > &expected_hash) const |
| Functions for disk access for blocks. More... | |
| bool | ReadBlock (CBlock &block, const CBlockIndex &index) const |
| ReadRawBlockResult | ReadRawBlock (const FlatFilePos &pos, std::optional< std::pair< size_t, size_t > > block_part=std::nullopt) const |
| bool | ReadBlockUndo (CBlockUndo &blockundo, const CBlockIndex &index) const |
| void | CleanupBlockRevFiles () const |
Public Attributes | |
| const util::SignalInterrupt & | m_interrupt |
| std::atomic< bool > | m_importing {false} |
| std::atomic_bool | m_blockfiles_indexed {true} |
| Whether all blockfiles have been added to the block tree database. More... | |
| 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... | |
| void WriteBlockIndexDB() EXCLUSIVE_LOCKS_REQUIRED(bool LoadBlockIndexDB(const std::optional< uint256 > &snapshot_blockhash) EXCLUSIVE_LOCKS_REQUIRED(void ScanAndUnlinkAlreadyPrunedFiles() EXCLUSIVE_LOCKS_REQUIRED(CBlockIndex * | AddToBlockIndex (const CBlockHeader &block, CBlockIndex *&best_header) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
| Remove any pruned block & undo files that are still on disk. More... | |
| CBlockFileInfo *GetBlockFileInfo(size_t n) EXCLUSIVE_LOCKS_REQUIRED(bool WriteBlockUndo(const CBlockUndo &blockundo, BlockValidationState &state, CBlockIndex &block) EXCLUSIVE_LOCKS_REQUIRED(FlatFilePos WriteBlock(const CBlock &block, int nHeight) EXCLUSIVE_LOCKS_REQUIRED(void UpdateBlockInfo(const CBlock &block, unsigned int nHeight, const FlatFilePos &pos) EXCLUSIVE_LOCKS_REQUIRED(bool | IsPruneMode () const |
| Get block file info entry for one block file. More... | |
| uint64_t CalculateCurrentUsage() EXCLUSIVE_LOCKS_REQUIRED(bool CheckBlockDataAvailability(const CBlockIndex &upper_block, const CBlockIndex &lower_block, BlockStatus block_status=BLOCK_HAVE_DATA) EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex &GetFirstBlock(const CBlockIndex &upper_block LIFETIMEBOUND, uint32_t status_mask, const CBlockIndex *lower_block LIFETIMEBOUND=nullptr) const EXCLUSIVE_LOCKS_REQUIRED(boo | m_have_pruned ) = false |
| Calculate the amount of disk space the block & undo files currently use. More... | |
| bool IsBlockPruned(const CBlockIndex &block) const EXCLUSIVE_LOCKS_REQUIRED(void UpdatePruneLock(const std::string &name, const PruneLockInfo &lock_info) EXCLUSIVE_LOCKS_REQUIRED(bool DeletePruneLock(const std::string &name) EXCLUSIVE_LOCKS_REQUIRED(AutoFile | OpenBlockFile (const FlatFilePos &pos, bool fReadOnly) 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()} |
Protected Attributes | |
| std::vector< CBlockFileInfo > | m_blockfile_info |
| std::set< CBlockIndex * > | m_dirty_blockindex |
| Dirty block index entries. More... | |
| std::set< int > | m_dirty_fileinfo |
| Dirty block file entries. More... | |
Private Member Functions | |
| const CChainParams & | GetParams () const |
| const Consensus::Params & | GetConsensus () 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) EXCLUSIVE_LOCKS_REQUIRED(bool | FlushUndoFile (int block_file, bool finalize=false) |
| Return false if block file or undo file flushing fails. More... | |
| void | FindFilesToPruneManual (std::set< int > &setFilesToPrune, int nManualPruneHeight, const Chainstate &chain) |
| 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_main) |
| 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( |
| 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 |
| FlatFilePos FindNextBlockPos(unsigned int nAddSize, unsigned int nHeight, uint64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(bool FlushChainstateBlockFile(int tip_height) EXCLUSIVE_LOCKS_REQUIRED(bool FindUndoPos(BlockValidationState &state, int nFile, FlatFilePos &pos, unsigned int nAddSize) EXCLUSIVE_LOCKS_REQUIRED(AutoFile | OpenUndoFile (const FlatFilePos &pos, bool fReadOnly=false) const |
| Helper function performing various preparations before a block can be saved to disk: Returns the correct position for the block to be saved, which may be in the current or a new block file depending on nAddSize. More... | |
| 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 |
| const Obfuscation | m_obfuscation |
| const kernel::BlockManagerOpts | m_opts |
| const FlatFileSeq | m_block_file_seq |
| const FlatFileSeq | m_undo_file_seq |
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 195 of file blockstorage.h.
Definition at line 319 of file blockstorage.h.
| using node::BlockManager::ReadRawBlockResult = util::Expected<std::vector<std::byte>, ReadRawError> |
Definition at line 320 of file blockstorage.h.
|
explicit |
| void node::BlockManager::AddUnlinkedBlock | ( | CBlockIndex * | block | ) |
Definition at line 258 of file blockstorage.cpp.
|
private |
Definition at line 789 of file blockstorage.cpp.
| void node::BlockManager::CleanupBlockRevFiles | ( | ) | const |
Definition at line 673 of file blockstorage.cpp.
|
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 |
| last_prune | The last height we're able to prune, according to the prune locks |
Definition at line 332 of file blockstorage.cpp.
|
private |
Definition at line 303 of file blockstorage.cpp.
|
private |
Return false if block file or undo file flushing fails.
Return false if undo file flushing fails.
Definition at line 750 of file blockstorage.cpp.
| fs::path node::BlockManager::GetBlockPosFilename | ( | const FlatFilePos & | pos | ) | const |
Translation to a filesystem path.
Definition at line 845 of file blockstorage.cpp.
|
inlineprivate |
Definition at line 202 of file blockstorage.h.
|
inlineprivate |
|
inline |
Attempt to stay below this number of bytes of block files.
Definition at line 410 of file blockstorage.h.
|
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 FindNextBlockPos().
The first element is the NORMAL cursor, second is ASSUMED.
|
private |
Map from external index name to oldest block that must not be pruned.
| std::unique_ptr< BlockTreeDB > 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 424 of file blockstorage.cpp.
|
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 440 of file blockstorage.cpp.
|
inline |
| const CBlockIndex * node::BlockManager::LookupBlockIndex | ( | const uint256 & | hash | ) | const |
| CBlockIndex * node::BlockManager::LookupBlockIndex | ( | const uint256 & | hash | ) |
Definition at line 210 of file blockstorage.cpp.
|
inlineprivate |
Definition at line 275 of file blockstorage.h.
| void node::BlockManager::PruneOneBlockFile | ( | int | fileNumber | ) |
Mark one block file as pruned (modify associated database entries)
Definition at line 270 of file blockstorage.cpp.
| bool node::BlockManager::ReadBlock | ( | CBlock & | block, |
| const CBlockIndex & | index | ||
| ) | const |
| bool node::BlockManager::ReadBlock | ( | CBlock & | block, |
| const FlatFilePos & | pos, | ||
| const std::optional< uint256 > & | expected_hash | ||
| ) | const |
Functions for disk access for blocks.
Definition at line 1050 of file blockstorage.cpp.
| bool node::BlockManager::ReadBlockUndo | ( | CBlockUndo & | blockundo, |
| const CBlockIndex & | index | ||
| ) | const |
Definition at line 715 of file blockstorage.cpp.
| BlockManager::ReadRawBlockResult node::BlockManager::ReadRawBlock | ( | const FlatFilePos & | pos, |
| std::optional< std::pair< size_t, size_t > > | block_part = std::nullopt |
||
| ) | const |
Definition at line 1097 of file blockstorage.cpp.
| void node::BlockManager::UnlinkPrunedFiles | ( | const std::set< int > & | setFilesToPrune | ) | const |
Actually unlink the specified files.
Definition at line 821 of file blockstorage.cpp.
| 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 372 of file blockstorage.h.
|
private |
Definition at line 197 of file blockstorage.h.
|
private |
Definition at line 198 of file blockstorage.h.
|
inline |
Get block file info entry for one block file.
Store block on disk and update block file statistics.
| [in] | block | the block to be stored |
| [in] | nHeight | the height of the block |
| [in] | block | the block being processed |
| [in] | nHeight | the height of the block |
| [in] | pos | the position of the serialized CBlock on disk Whether running in -prune mode. |
Definition at line 407 of file blockstorage.h.
|
private |
Definition at line 306 of file blockstorage.h.
|
protected |
Definition at line 310 of file blockstorage.h.
| std::atomic_bool node::BlockManager::m_blockfiles_indexed {true} |
Whether all blockfiles have been added to the block tree database.
Normally true, but set to false when a reindex is requested and the database is wiped. The value is persisted in the database across restarts and will be false until reindexing completes.
Definition at line 333 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.
Definition at line 356 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 288 of file blockstorage.h.
|
protected |
Dirty block index entries.
Definition at line 313 of file blockstorage.h.
|
protected |
Dirty block file entries.
Definition at line 316 of file blockstorage.h.
| uint64_t CalculateCurrentUsage () EXCLUSIVE_LOCKS_REQUIRED( bool CheckBlockDataAvailability (const CBlockIndex& upper_block, const CBlockIndex& lower_block, BlockStatus block_status = BLOCK_HAVE_DATA) EXCLUSIVE_LOCKS_REQUIRED( const CBlockIndex& GetFirstBlock ( const CBlockIndex& upper_block LIFETIMEBOUND, uint32_t status_mask, const CBlockIndex* lower_block LIFETIMEBOUND = nullptr ) const EXCLUSIVE_LOCKS_REQUIRED( boo node::BlockManager::m_have_pruned) = false |
Calculate the amount of disk space the block & undo files currently use.
Check if all blocks in the [upper_block, lower_block] range have data available as defined by the status mask. The caller is responsible for ensuring that lower_block is an ancestor of upper_block (part of the same chain).
Returns the earliest block with specified status_mask flags set after the latest block not having those flags.
This function starts from upper_block, which must have all status_mask flags set, and iterates backwards through its ancestors. It continues as long as each block has all status_mask flags set, until reaching the oldest ancestor or lower_block.
upper_block must have all status_mask flags set. lower_block must be null or an ancestor of upper_block| upper_block | The starting block for the search, which must have all status_mask flags set. |
| status_mask | Bitmask specifying required status flags. |
| lower_block | The earliest possible block to return. If null, the search can extend to the genesis block. |
upper_block and lower_block, inclusive, such that every block between the returned block and upper_block has status_mask flags set. True if any block files have ever been pruned. Definition at line 453 of file blockstorage.h.
| std::atomic<bool> node::BlockManager::m_importing {false} |
Definition at line 325 of file blockstorage.h.
| const util::SignalInterrupt& node::BlockManager::m_interrupt |
Definition at line 324 of file blockstorage.h.
|
private |
Definition at line 292 of file blockstorage.h.
|
private |
Definition at line 304 of file blockstorage.h.
|
private |
Definition at line 290 of file blockstorage.h.
| 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 349 of file blockstorage.h.
|
private |
Definition at line 307 of file blockstorage.h.
| 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 Delete a prune lock identified by its name. Returns true if the lock existed. Open a block file (blk?????.dat)
Definition at line 465 of file blockstorage.h.
|
private |
Helper function performing various preparations before a block can be saved to disk: Returns the correct position for the block to be saved, which may be in the current or a new block file depending on nAddSize.
Open an undo file (rev?????.dat)
May flush the previous blockfile to disk if full, updates blockfile info, and checks if there is enough disk space to save the block.
The nAddSize argument passed to this function should include not just the size of the serialized CBlock, but also the size of separator fields (STORAGE_HEADER_BYTES).
Definition at line 230 of file blockstorage.h.
|
staticconstexpr |
Definition at line 411 of file blockstorage.h.