44#include <unordered_map>
81void BlockTreeDB::WriteBatchSync(
const std::vector<std::pair<int, const CBlockFileInfo*>>& fileInfo,
int nLastFile,
const std::vector<const CBlockIndex*>& blockinfo)
84 for (
const auto& [file, info] : fileInfo) {
105 fValue = ch == uint8_t{
'1'};
112 std::unique_ptr<CDBIterator> pcursor(
NewIterator());
116 while (pcursor->Valid()) {
117 if (interrupt)
return false;
118 std::pair<uint8_t, uint256> key;
121 if (pcursor->GetValue(diskindex)) {
126 pindexNew->nFile = diskindex.nFile;
127 pindexNew->nDataPos = diskindex.nDataPos;
128 pindexNew->nUndoPos = diskindex.nUndoPos;
134 pindexNew->nStatus = diskindex.nStatus;
135 pindexNew->
nTx = diskindex.
nTx;
138 LogError(
"%s: CheckProofOfWork failed: %s\n", __func__, pindexNew->
ToString());
144 LogError(
"%s: failed to read value\n", __func__);
171 if (pa < pb)
return false;
172 if (pa > pb)
return true;
183std::vector<CBlockIndex*> BlockManager::GetAllBlockIndices()
186 std::vector<CBlockIndex*> rv;
187 rv.reserve(m_block_index.size());
188 for (
auto& [
_, block_index] : m_block_index) {
189 rv.push_back(&block_index);
197 BlockMap::iterator it = m_block_index.find(hash);
198 return it == m_block_index.end() ? nullptr : &it->second;
204 BlockMap::const_iterator it = m_block_index.find(hash);
205 return it == m_block_index.end() ? nullptr : &it->second;
212 auto [mi, inserted] = m_block_index.try_emplace(block.
GetHash(), block);
224 BlockMap::iterator miPrev = m_block_index.find(block.
hashPrevBlock);
225 if (miPrev != m_block_index.end()) {
226 pindexNew->
pprev = &(*miPrev).second;
234 best_header = pindexNew;
247 for (
auto& entry : m_block_index) {
249 if (pindex->nFile == fileNumber) {
250 pindex->nStatus &= ~BLOCK_HAVE_DATA;
251 pindex->nStatus &= ~BLOCK_HAVE_UNDO;
253 pindex->nDataPos = 0;
254 pindex->nUndoPos = 0;
262 while (range.first != range.second) {
263 std::multimap<CBlockIndex*, CBlockIndex*>::iterator _it = range.first;
265 if (_it->second == pindex) {
277 std::set<int>& setFilesToPrune,
278 int nManualPruneHeight,
289 const auto [min_block_to_prune, last_block_can_prune] = chainman.GetPruneRange(chain, nManualPruneHeight);
292 for (
int fileNumber = 0; fileNumber < this->
MaxBlockfileNum(); fileNumber++) {
294 if (fileinfo.nSize == 0 || fileinfo.nHeightLast > (
unsigned)last_block_can_prune || fileinfo.nHeightFirst < (unsigned)min_block_to_prune) {
299 setFilesToPrune.insert(fileNumber);
302 LogInfo(
"[%s] Prune (Manual): prune_height=%d removed %d blk/rev pairs",
303 chain.GetRole(), last_block_can_prune,
count);
307 std::set<int>& setFilesToPrune,
314 const auto target = std::max(
316 const uint64_t target_sync_height = chainman.m_best_header->nHeight;
325 const auto [min_block_to_prune, last_block_can_prune] = chainman.GetPruneRange(chain, last_prune);
332 uint64_t nBytesToPrune;
335 if (nCurrentUsage + nBuffer >= target) {
343 static constexpr uint64_t average_block_size = 1000000;
344 const uint64_t remaining_blocks = target_sync_height - chain_tip_height;
345 nBuffer += average_block_size * remaining_blocks;
348 for (
int fileNumber = 0; fileNumber < this->
MaxBlockfileNum(); fileNumber++) {
350 nBytesToPrune = fileinfo.nSize + fileinfo.nUndoSize;
352 if (fileinfo.nSize == 0) {
356 if (nCurrentUsage + nBuffer < target) {
362 if (fileinfo.nHeightLast > (
unsigned)last_block_can_prune || fileinfo.nHeightFirst < (unsigned)min_block_to_prune) {
368 setFilesToPrune.insert(fileNumber);
369 nCurrentUsage -= nBytesToPrune;
374 LogDebug(
BCLog::PRUNE,
"[%s] target=%dMiB actual=%dMiB diff=%dMiB min_height=%d max_prune_height=%d removed %d blk/rev pairs\n",
375 chain.GetRole(), target / 1024 / 1024, nCurrentUsage / 1024 / 1024,
376 (int64_t(target) - int64_t(nCurrentUsage)) / 1024 / 1024,
377 min_block_to_prune, last_block_can_prune,
count);
380void BlockManager::UpdatePruneLock(
const std::string&
name,
const PruneLockInfo& lock_info) {
382 m_prune_locks[
name] = lock_info;
393 const auto [mi, inserted]{m_block_index.try_emplace(hash)};
403 if (!m_block_tree_db->LoadBlockIndexGuts(
408 if (snapshot_blockhash) {
410 if (!maybe_au_data) {
422 LogInfo(
"[snapshot] set m_chain_tx_count=%d for %s", au_data.
m_chain_tx_count, snapshot_blockhash->ToString());
433 std::vector<CBlockIndex*> vSortedByHeight{GetAllBlockIndices()};
434 std::sort(vSortedByHeight.begin(), vSortedByHeight.end(),
440 if (previous_index && pindex->nHeight > previous_index->nHeight + 1) {
441 LogError(
"%s: block index is non-contiguous, index of height %d missing\n", __func__, previous_index->nHeight + 1);
444 previous_index = pindex;
445 pindex->nChainWork = (pindex->pprev ? pindex->pprev->nChainWork : 0) +
GetBlockProof(*pindex);
446 pindex->nTimeMax = (pindex->pprev ? std::max(pindex->pprev->nTimeMax, pindex->nTime) : pindex->nTime);
452 if (pindex->nTx > 0) {
455 pindex->GetBlockHash() == *snapshot_blockhash) {
457 Assert(pindex->m_chain_tx_count > 0);
458 }
else if (pindex->pprev->m_chain_tx_count > 0) {
459 pindex->m_chain_tx_count = pindex->pprev->m_chain_tx_count + pindex->nTx;
461 pindex->m_chain_tx_count = 0;
465 pindex->m_chain_tx_count = pindex->nTx;
480void BlockManager::WriteBlockIndexDB()
483 std::vector<std::pair<int, const CBlockFileInfo*>> vFiles;
489 std::vector<const CBlockIndex*> vBlocks;
492 vBlocks.push_back(*it);
496 m_block_tree_db->WriteBatchSync(vFiles, max_blockfile, vBlocks);
499bool BlockManager::LoadBlockIndexDB(
const std::optional<uint256>& snapshot_blockhash)
504 int max_blockfile_num{0};
507 m_block_tree_db->ReadLastBlockFile(max_blockfile_num);
509 LogInfo(
"Loading block index db: last block file = %i", max_blockfile_num);
510 for (
int nFile = 0; nFile <= max_blockfile_num; nFile++) {
514 for (
int nFile = max_blockfile_num + 1;
true; nFile++) {
516 if (m_block_tree_db->ReadBlockFileInfo(nFile, info)) {
524 LogInfo(
"Checking all blk files are present...");
525 std::set<int> setBlkDataFiles;
526 for (
const auto& [
_, block_index] : m_block_index) {
528 setBlkDataFiles.insert(block_index.nFile);
531 for (std::set<int>::iterator it = setBlkDataFiles.begin(); it != setBlkDataFiles.end(); it++) {
548 m_block_tree_db->ReadFlag(
"prunedblockfiles",
m_have_pruned);
550 LogInfo(
"Loading block index db: Block files have previously been pruned");
554 bool fReindexing =
false;
555 m_block_tree_db->ReadReindexing(fReindexing);
561void BlockManager::ScanAndUnlinkAlreadyPrunedFiles()
569 std::set<int> block_files_to_prune;
570 for (
int file_number = 0; file_number < max_blockfile; file_number++) {
572 block_files_to_prune.insert(file_number);
579bool BlockManager::IsBlockPruned(
const CBlockIndex& block)
const
589 assert((last_block->nStatus & status_mask) == status_mask);
590 while (last_block->
pprev && ((last_block->
pprev->nStatus & status_mask) == status_mask)) {
593 if (last_block == lower_block)
return lower_block;
598 last_block = last_block->
pprev;
600 assert(last_block !=
nullptr);
607 return GetFirstBlock(upper_block,
BLOCK_HAVE_DATA, &lower_block) == &lower_block;
618 std::map<std::string, fs::path> mapBlockFiles;
623 LogInfo(
"Removing unusable blk?????.dat and rev?????.dat files for -reindex with -prune");
624 for (fs::directory_iterator it(
m_opts.
blocks_dir); it != fs::directory_iterator(); it++) {
626 if (fs::is_regular_file(*it) &&
627 path.length() == 12 &&
628 path.ends_with(
".dat"))
630 if (path.starts_with(
"blk")) {
631 mapBlockFiles[path.substr(3, 5)] = it->path();
632 }
else if (path.starts_with(
"rev")) {
642 int nContigCounter = 0;
643 for (
const std::pair<const std::string, fs::path>& item : mapBlockFiles) {
644 if (LocaleIndependentAtoi<int>(item.first) == nContigCounter) {
666 LogError(
"OpenUndoFile failed for %s while reading block undo", pos.ToString());
676 verifier >> blockundo;
679 filein >> hashChecksum;
682 if (hashChecksum != verifier.GetHash()) {
683 LogError(
"Checksum mismatch at %s while reading block undo", pos.ToString());
686 }
catch (
const std::exception& e) {
687 LogError(
"Deserialize or I/O error - %s at %s while reading block undo", e.what(), pos.ToString());
725 if (!fFinalize || finalize_undo) {
736 return BlockfileType::NORMAL;
761 retval += file.nSize + file.nUndoSize;
769 for (std::set<int>::iterator it = setFilesToPrune.begin(); it != setFilesToPrune.end(); ++it) {
773 if (removed_blockfile || removed_undofile) {
801 if (!m_blockfile_cursors[chain_type]) {
805 m_blockfile_cursors[chain_type] = new_cursor;
808 const int last_blockfile = m_blockfile_cursors[chain_type]->file_num;
810 int nFile = last_blockfile;
815 bool finalize_undo =
false;
820 max_blockfile_size = 0x10000;
821 if (nAddSize >= max_blockfile_size) {
823 max_blockfile_size = nAddSize + 1;
826 assert(nAddSize < max_blockfile_size);
833 Assert(m_blockfile_cursors[chain_type])->undo_height);
848 if (nFile != last_blockfile) {
861 "Failed to flush previous block file %05i (finalize=1, finalize_undo=%i) before opening new block file %05i\n",
862 last_blockfile, finalize_undo, nFile);
891 auto& cursor{m_blockfile_cursors[chain_type]};
892 if (!cursor || cursor->file_num < pos.
nFile) {
898 const int nFile = pos.
nFile;
938 const auto blockundo_size{
static_cast<uint32_t
>(
GetSerializeSize(blockundo))};
940 LogError(
"FindUndoPos failed for %s while writing block undo", pos.
ToString());
947 LogError(
"OpenUndoFile failed for %s while writing block undo", pos.
ToString());
961 fileout << blockundo << hasher.GetHash();
967 if (file.fclose() != 0) {
986 }
else if (pos.
nFile == cursor.file_num && block.
nHeight > cursor.undo_height) {
987 cursor.undo_height = block.
nHeight;
990 block.nUndoPos = pos.
nPos;
1003 std::vector<std::byte> block_data;
1011 }
catch (
const std::exception& e) {
1012 LogError(
"Deserialize or I/O error - %s at %s while reading block", e.what(), pos.
ToString());
1016 const auto block_hash{block.
GetHash()};
1020 LogError(
"Errors in block header at %s while reading block", pos.
ToString());
1026 LogError(
"Errors in block solution at %s while reading block", pos.
ToString());
1030 if (expected_hash && block_hash != *expected_hash) {
1031 LogError(
"GetHash() doesn't match index at %s while reading block (%s != %s)",
1032 pos.
ToString(), block_hash.ToString(), expected_hash->ToString());
1051 LogError(
"Failed for %s while reading raw block storage header", pos.
ToString());
1055 if (filein.IsNull()) {
1056 LogError(
"OpenBlockFile failed for %s while reading raw block", pos.
ToString());
1062 unsigned int blk_size;
1064 filein >> blk_start >> blk_size;
1066 if (blk_start !=
GetParams().MessageStart()) {
1067 LogError(
"Block magic mismatch for %s: %s versus expected %s while reading raw block",
1073 LogError(
"Block data is larger than maximum deserialization size for %s: %s versus %s while reading raw block",
1078 block.resize(blk_size);
1080 }
catch (
const std::exception& e) {
1081 LogError(
"Read from block file failed: %s for %s while reading raw block", e.what(), pos.
ToString());
1093 LogError(
"FindNextBlockPos failed for %s while writing block", pos.
ToString());
1097 if (file.IsNull()) {
1098 LogError(
"OpenBlockFile failed for %s while writing block", pos.
ToString());
1112 if (file.fclose() != 0) {
1125 std::array<std::byte, Obfuscation::KEY_SIZE> obfuscation{};
1130 bool first_run =
true;
1131 for (
const auto& entry : fs::directory_iterator(opts.
blocks_dir)) {
1133 if (!entry.is_regular_file() || !path.starts_with(
'.')) {
1139 if (opts.
use_xor && first_run) {
1145 const fs::path xor_key_path{opts.
blocks_dir /
"xor.dat"};
1149 xor_key_file >> obfuscation;
1159 xor_key_file << obfuscation;
1160 if (xor_key_file.fclose() != 0) {
1161 throw std::runtime_error{
strprintf(
"Error closing XOR key file %s: %s",
1167 if (!opts.
use_xor && obfuscation !=
decltype(obfuscation){}) {
1168 throw std::runtime_error{
1169 strprintf(
"The blocksdir XOR-key can not be disabled when a random key was already stored! "
1170 "Stored key: '%s', stored path: '%s'.",
1179 : m_prune_mode{opts.prune_target > 0},
1181 m_opts{
std::move(opts)},
1184 m_interrupt{interrupt}
1189 m_block_tree_db->WriteReindexing(
true);
1224 std::multimap<uint256, FlatFilePos> blocks_with_unknown_parent;
1231 if (file.IsNull()) {
1234 LogInfo(
"Reindexing block file blk%05u.dat...", (
unsigned int)nFile);
1237 LogInfo(
"Interrupt requested. Exit reindexing.");
1244 LogInfo(
"Reindexing finished");
1250 for (
const fs::path& path : import_paths) {
1252 if (!file.IsNull()) {
1256 LogInfo(
"Interrupt requested. Exit block importing.");
1271 if (!chainstate->ActivateBestChain(state,
nullptr)) {
1281 case BlockfileType::NORMAL: os <<
"normal";
break;
1283 default: os.setstate(std::ios_base::failbit);
void CheckBlockDataAvailability(BlockManager &blockman, const CBlockIndex &blockindex, bool check_for_undo)
arith_uint256 GetBlockProof(const CBlockIndex &block)
@ BLOCK_VALID_TREE
All parent headers found, difficulty matches, timestamp >= median previous.
@ BLOCK_HAVE_UNDO
undo data available in rev*.dat
@ BLOCK_HAVE_DATA
full block available in blk*.dat
@ BLOCK_FAILED_CHILD
descends from failed block
static constexpr int32_t SEQ_ID_INIT_FROM_DISK
#define Assert(val)
Identity function.
Non-refcounted RAII wrapper for FILE*.
Wrapper that buffers reads from an underlying stream.
Wrapper that buffers writes to an underlying stream.
The block chain is a tree shaped structure starting with the genesis block at the root,...
std::string ToString() const
CBlockIndex * pprev
pointer to the index of the predecessor of this block
uint64_t m_chain_tx_count
(memory only) Number of transactions in the chain up to and including this block.
void BuildSkip()
Build the skiplist pointer for this entry.
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
unsigned int nTimeMax
(memory only) Maximum nTime in the chain up to and including this block.
int32_t nSequenceId
(memory only) Sequential id assigned to distinguish order in which blocks are received.
uint256 GetBlockHash() const
FlatFilePos GetUndoPos() const EXCLUSIVE_LOCKS_REQUIRED(
bool RaiseValidity(enum BlockStatus nUpTo) EXCLUSIVE_LOCKS_REQUIRED(
Raise the validity level of this block index entry.
unsigned int nTx
Number of transactions in this block.
int32_t nVersion
block header
int nHeight
height of the entry in the chain. The genesis block has height 0
FlatFilePos GetBlockPos() const EXCLUSIVE_LOCKS_REQUIRED(
const uint256 * phashBlock
pointer to the hash of the block, if any. Memory is owned by this CBlockIndex
Undo information for a CBlock.
int Height() const
Return the maximal height in the chain.
const MessageStartChars & MessageStart() const
std::optional< AssumeutxoData > AssumeutxoForBlockhash(const uint256 &blockhash) const
uint64_t PruneAfterHeight() const
Batch of changes queued to be written to a CDBWrapper.
void Write(const K &key, const V &value)
bool Read(const K &key, V &value) const
CDBIterator * NewIterator()
bool Exists(const K &key) const
void Erase(const K &key, bool fSync=false)
void WriteBatch(CDBBatch &batch, bool fSync=false)
void Write(const K &key, const V &value, bool fSync=false)
Used to marshal pointers into hashes for db storage.
uint256 ConstructBlockHash() const
Chainstate stores and provides an API to update our local knowledge of the current best chain.
CChain m_chain
The current chain of blockheaders we consult and build on.
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
SnapshotCompletionResult MaybeCompleteSnapshotValidation() EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetSnapshotBaseBlock() const EXCLUSIVE_LOCKS_REQUIRED(Chainstate ActiveChainstate)() const
Once the background validation chainstate has reached the height which is the base of the UTXO snapsh...
kernel::Notifications & GetNotifications() const
bool IsInitialBlockDownload() const
Check whether we are doing an initial block download (synchronizing from disk or network)
const util::SignalInterrupt & m_interrupt
void LoadExternalBlockFile(AutoFile &file_in, FlatFilePos *dbp=nullptr, std::multimap< uint256, FlatFilePos > *blocks_with_unknown_parent=nullptr)
Import blocks from an external file.
const CChainParams & GetParams() const
Chainstate &InitializeChainstate(CTxMemPool *mempool) EXCLUSIVE_LOCKS_REQUIRED(std::vector< Chainstate * GetAll)()
Instantiate a new chainstate.
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
void fillrand(std::span< std::byte > output) noexcept
Fill a byte span with random bytes.
FlatFileSeq represents a sequence of numbered files storing raw data.
FILE * Open(const FlatFilePos &pos, bool read_only=false) const
Open a handle to the file at the given position.
fs::path FileName(const FlatFilePos &pos) const
Get the name of the file at the given position.
bool Flush(const FlatFilePos &pos, bool finalize=false) const
Commit a file to disk, and optionally truncate off extra pre-allocated bytes if final.
size_t Allocate(const FlatFilePos &pos, size_t add_size, bool &out_of_space) const
Allocate additional space in a file after the given starting position.
Reads data from an underlying stream, while hashing the read data.
A writer stream (for serialization) that computes a 256-bit hash.
Minimal stream for reading from an existing byte array by std::span.
std::string ToString() const
constexpr bool IsNull() const
void WriteBatchSync(const std::vector< std::pair< int, const CBlockFileInfo * > > &fileInfo, int nLastFile, const std::vector< const CBlockIndex * > &blockinfo)
bool ReadLastBlockFile(int &nFile)
void WriteReindexing(bool fReindexing)
bool ReadFlag(const std::string &name, bool &fValue)
bool ReadBlockFileInfo(int nFile, CBlockFileInfo &info)
void ReadReindexing(bool &fReindexing)
void WriteFlag(const std::string &name, bool fValue)
virtual void fatalError(const bilingual_str &message)
The fatal error notification is sent to notify the user when an error occurs in kernel code that can'...
virtual void flushError(const bilingual_str &message)
The flush error notification is sent to notify the user that an error occurred while flushing block d...
const kernel::BlockManagerOpts m_opts
std::set< int > m_dirty_fileinfo
Dirty block file entries.
const FlatFileSeq m_undo_file_seq
RecursiveMutex cs_LastBlockFile
const CChainParams & GetParams() const
bool FlushChainstateBlockFile(int tip_height)
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 use...
void UpdateBlockInfo(const CBlock &block, unsigned int nHeight, const FlatFilePos &pos)
Update blockfile info while processing a block during reindex.
const Obfuscation m_obfuscation
CBlockIndex * LookupBlockIndex(const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
bool ReadBlockUndo(CBlockUndo &blockundo, const CBlockIndex &index) const
void PruneOneBlockFile(const int fileNumber) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Mark one block file as pruned (modify associated database entries)
BlockfileType BlockfileTypeForHeight(int height)
std::atomic_bool m_blockfiles_indexed
Whether all blockfiles have been added to the block tree database.
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.
const Consensus::Params & GetConsensus() const
BlockManager(const util::SignalInterrupt &interrupt, Options opts)
std::set< CBlockIndex * > m_dirty_blockindex
Dirty block index entries.
fs::path GetBlockPosFilename(const FlatFilePos &pos) const
Translation to a filesystem path.
bool FlushBlockFile(int blockfile_num, bool fFinalize, bool finalize_undo)
Return false if block file or undo file flushing fails.
uint64_t GetPruneTarget() const
Attempt to stay below this number of bytes of block files.
int MaxBlockfileNum() const EXCLUSIVE_LOCKS_REQUIRED(cs_LastBlockFile)
void UnlinkPrunedFiles(const std::set< int > &setFilesToPrune) const
Actually unlink the specified files.
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.
FlatFilePos FindNextBlockPos(unsigned int nAddSize, unsigned int nHeight, uint64_t nTime)
Helper function performing various preparations before a block can be saved to disk: Returns the corr...
bool CheckBlockDataAvailability(const CBlockIndex &upper_block LIFETIMEBOUND, const CBlockIndex &lower_block LIFETIMEBOUND) EXCLUSIVE_LOCKS_REQUIRED(const CBlockIndex *GetFirstBlock(const CBlockIndex &upper_block LIFETIMEBOUND, uint32_t status_mask, const CBlockIndex *lower_block=nullptr) const EXCLUSIVE_LOCKS_REQUIRED(boo m_have_pruned)
Check if all blocks in the [upper_block, lower_block] range have data available.
bool FlushUndoFile(int block_file, bool finalize=false)
Return false if undo file flushing fails.
uint64_t CalculateCurrentUsage()
Calculate the amount of disk space the block & undo files currently use.
bool ReadRawBlock(std::vector< std::byte > &block, const FlatFilePos &pos) const
const util::SignalInterrupt & m_interrupt
const FlatFileSeq m_block_file_seq
CBlockIndex * InsertBlockIndex(const uint256 &hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Create a new block index entry for a given block hash.
bool ReadBlock(CBlock &block, const FlatFilePos &pos, const std::optional< uint256 > &expected_hash) const
Functions for disk access for blocks.
bool m_check_for_pruning
Global flag to indicate we should check to see if there are block/undo files that should be deleted.
bool FindUndoPos(BlockValidationState &state, int nFile, FlatFilePos &pos, unsigned int nAddSize)
bool IsPruneMode() const
Whether running in -prune mode.
void CleanupBlockRevFiles() const
void FindFilesToPruneManual(std::set< int > &setFilesToPrune, int nManualPruneHeight, const Chainstate &chain, ChainstateManager &chainman)
std::atomic< bool > m_importing
bool WriteBlockUndo(const CBlockUndo &blockundo, BlockValidationState &state, CBlockIndex &block) EXCLUSIVE_LOCKS_REQUIRED(FlatFilePos WriteBlock(const CBlock &block, int nHeight)
Store block on disk and update block file statistics.
bool IsBlockPruned(const CBlockIndex &block) const EXCLUSIVE_LOCKS_REQUIRED(void UpdatePruneLock(const std::string &name, const PruneLockInfo &lock_info) EXCLUSIVE_LOCKS_REQUIRED(AutoFile OpenBlockFile(const FlatFilePos &pos, bool fReadOnly) const
Check whether the block associated with this index entry is pruned or not.
std::vector< CBlockFileInfo > m_blockfile_info
CBlockFileInfo * GetBlockFileInfo(size_t n)
Get block file info entry for one block file.
bool LoadBlockIndex(const std::optional< uint256 > &snapshot_blockhash) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Load the blocktree off disk and into memory.
AutoFile OpenUndoFile(const FlatFilePos &pos, bool fReadOnly=false) const
Open an undo file (rev?????.dat)
std::optional< int > m_snapshot_height
The height of the base block of an assumeutxo snapshot, if one is in use.
ImportingNow(std::atomic< bool > &importing)
std::atomic< bool > & m_importing
Helper class that manages an interrupt flag, and allows a thread or signal to interrupt another threa...
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
static bool exists(const path &p)
static std::string PathToString(const path &path)
Convert path object to a byte string.
std::string HexStr(const std::span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
#define LogPrintLevel(category, level,...)
#define LogDebug(category,...)
std::array< uint8_t, 4 > MessageStartChars
FILE * fopen(const fs::path &p, const char *mode)
static constexpr uint8_t DB_REINDEX_FLAG
static constexpr uint8_t DB_FLAG
static constexpr uint8_t DB_BLOCK_INDEX
static constexpr uint8_t DB_LAST_BLOCK
static constexpr uint8_t DB_BLOCK_FILES
static const unsigned int UNDOFILE_CHUNK_SIZE
The pre-allocation chunk size for rev?????.dat files (since 0.8)
static auto InitBlocksdirXorKey(const BlockManager::Options &opts)
static const unsigned int BLOCKFILE_CHUNK_SIZE
The pre-allocation chunk size for blk?????.dat files (since 0.8)
static constexpr uint32_t STORAGE_HEADER_BYTES
Size of header written by WriteBlock before a serialized CBlock (8 bytes)
std::ostream & operator<<(std::ostream &os, const BlockfileType &type)
static constexpr uint32_t UNDO_DATA_DISK_OVERHEAD
Total overhead when writing undo data: header (8 bytes) plus checksum (32 bytes)
static const unsigned int MAX_BLOCKFILE_SIZE
The maximum size of a blk?????.dat file (since 0.8)
void ImportBlocks(ChainstateManager &chainman, std::span< const fs::path > import_paths)
std::string ToString(const T &t)
Locale-independent version of std::to_string.
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params ¶ms)
Check whether a block hash satisfies the proof-of-work requirement specified by nBits.
static constexpr TransactionSerParams TX_WITH_WITNESS
size_t GetSerializeSize(const T &t)
static constexpr uint64_t MAX_SIZE
The maximum size of a serialized object in bytes or number of elements (for eg vectors) when the size...
bool CheckSignetBlockSolution(const CBlock &block, const Consensus::Params &consensusParams)
Extract signature and check whether a block has a valid solution.
Holds configuration for use during UTXO snapshot load and validation.
uint64_t m_chain_tx_count
Used to populate the m_chain_tx_count value, which is used during BlockManager::LoadBlockIndex().
Parameters that influence chain consensus.
bool wipe_data
If true, remove all existing data.
std::string ToString() const
An options struct for BlockManager, more ergonomically referred to as BlockManager::Options due to th...
Notifications & notifications
const fs::path blocks_dir
DBParams block_tree_db_params
bool operator()(const CBlockIndex *pa, const CBlockIndex *pb) const
bool operator()(const CBlockIndex *pa, const CBlockIndex *pb) const
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
std::string SysErrorString(int err)
Return system error string from errno value.
#define EXCLUSIVE_LOCKS_REQUIRED(...)
consteval auto _(util::TranslatedLiteral str)
bool FatalError(Notifications ¬ifications, BlockValidationState &state, const bilingual_str &message)
static const uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES