mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-06 05:00:12 +02:00
validation: Move LoadExternalBlockFile to CChainState
[META] This commit should be followed up by removing the comments and assertions meant only to show that the change is correct. LoadExternalBlockFile mainly acts on CChainState.
This commit is contained in:
parent
5f8cd7b3a5
commit
e0dc305727
@ -705,7 +705,7 @@ static void ThreadImport(ChainstateManager& chainman, std::vector<fs::path> vImp
|
|||||||
if (!file)
|
if (!file)
|
||||||
break; // This error is logged in OpenBlockFile
|
break; // This error is logged in OpenBlockFile
|
||||||
LogPrintf("Reindexing block file blk%05u.dat...\n", (unsigned int)nFile);
|
LogPrintf("Reindexing block file blk%05u.dat...\n", (unsigned int)nFile);
|
||||||
LoadExternalBlockFile(chainparams, file, &pos);
|
::ChainstateActive().LoadExternalBlockFile(chainparams, file, &pos);
|
||||||
if (ShutdownRequested()) {
|
if (ShutdownRequested()) {
|
||||||
LogPrintf("Shutdown requested. Exit %s\n", __func__);
|
LogPrintf("Shutdown requested. Exit %s\n", __func__);
|
||||||
return;
|
return;
|
||||||
@ -724,7 +724,7 @@ static void ThreadImport(ChainstateManager& chainman, std::vector<fs::path> vImp
|
|||||||
FILE *file = fsbridge::fopen(path, "rb");
|
FILE *file = fsbridge::fopen(path, "rb");
|
||||||
if (file) {
|
if (file) {
|
||||||
LogPrintf("Importing blocks file %s...\n", path.string());
|
LogPrintf("Importing blocks file %s...\n", path.string());
|
||||||
LoadExternalBlockFile(chainparams, file);
|
::ChainstateActive().LoadExternalBlockFile(chainparams, file);
|
||||||
if (ShutdownRequested()) {
|
if (ShutdownRequested()) {
|
||||||
LogPrintf("Shutdown requested. Exit %s\n", __func__);
|
LogPrintf("Shutdown requested. Exit %s\n", __func__);
|
||||||
return;
|
return;
|
||||||
|
@ -27,5 +27,5 @@ FUZZ_TARGET_INIT(load_external_block_file, initialize_load_external_block_file)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
FlatFilePos flat_file_pos;
|
FlatFilePos flat_file_pos;
|
||||||
LoadExternalBlockFile(Params(), fuzzed_block_file, fuzzed_data_provider.ConsumeBool() ? &flat_file_pos : nullptr);
|
::ChainstateActive().LoadExternalBlockFile(Params(), fuzzed_block_file, fuzzed_data_provider.ConsumeBool() ? &flat_file_pos : nullptr);
|
||||||
}
|
}
|
||||||
|
@ -4602,7 +4602,7 @@ bool LoadGenesisBlock(const CChainParams& chainparams)
|
|||||||
return ::ChainstateActive().LoadGenesisBlock(chainparams);
|
return ::ChainstateActive().LoadGenesisBlock(chainparams);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, FlatFilePos* dbp)
|
void CChainState::LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, FlatFilePos* dbp)
|
||||||
{
|
{
|
||||||
// Map of disk positions for blocks with unknown parent (only used for reindex)
|
// Map of disk positions for blocks with unknown parent (only used for reindex)
|
||||||
static std::multimap<uint256, FlatFilePos> mapBlocksUnknownParent;
|
static std::multimap<uint256, FlatFilePos> mapBlocksUnknownParent;
|
||||||
@ -4651,7 +4651,8 @@ void LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, FlatFi
|
|||||||
{
|
{
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
// detect out of order blocks, and store them for later
|
// detect out of order blocks, and store them for later
|
||||||
if (hash != chainparams.GetConsensus().hashGenesisBlock && !g_chainman.m_blockman.LookupBlockIndex(block.hashPrevBlock)) {
|
assert(std::addressof(g_chainman.m_blockman) == std::addressof(m_blockman));
|
||||||
|
if (hash != chainparams.GetConsensus().hashGenesisBlock && !m_blockman.LookupBlockIndex(block.hashPrevBlock)) {
|
||||||
LogPrint(BCLog::REINDEX, "%s: Out of order block %s, parent %s not known\n", __func__, hash.ToString(),
|
LogPrint(BCLog::REINDEX, "%s: Out of order block %s, parent %s not known\n", __func__, hash.ToString(),
|
||||||
block.hashPrevBlock.ToString());
|
block.hashPrevBlock.ToString());
|
||||||
if (dbp)
|
if (dbp)
|
||||||
@ -4660,10 +4661,12 @@ void LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, FlatFi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// process in case the block isn't known yet
|
// process in case the block isn't known yet
|
||||||
CBlockIndex* pindex = g_chainman.m_blockman.LookupBlockIndex(hash);
|
assert(std::addressof(g_chainman.m_blockman) == std::addressof(m_blockman));
|
||||||
|
CBlockIndex* pindex = m_blockman.LookupBlockIndex(hash);
|
||||||
if (!pindex || (pindex->nStatus & BLOCK_HAVE_DATA) == 0) {
|
if (!pindex || (pindex->nStatus & BLOCK_HAVE_DATA) == 0) {
|
||||||
BlockValidationState state;
|
BlockValidationState state;
|
||||||
if (::ChainstateActive().AcceptBlock(pblock, state, chainparams, nullptr, true, dbp, nullptr)) {
|
assert(std::addressof(::ChainstateActive()) == std::addressof(*this));
|
||||||
|
if (AcceptBlock(pblock, state, chainparams, nullptr, true, dbp, nullptr)) {
|
||||||
nLoaded++;
|
nLoaded++;
|
||||||
}
|
}
|
||||||
if (state.IsError()) {
|
if (state.IsError()) {
|
||||||
@ -4677,12 +4680,14 @@ void LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, FlatFi
|
|||||||
// Activate the genesis block so normal node progress can continue
|
// Activate the genesis block so normal node progress can continue
|
||||||
if (hash == chainparams.GetConsensus().hashGenesisBlock) {
|
if (hash == chainparams.GetConsensus().hashGenesisBlock) {
|
||||||
BlockValidationState state;
|
BlockValidationState state;
|
||||||
if (!::ChainstateActive().ActivateBestChain(state, chainparams, nullptr)) {
|
assert(std::addressof(::ChainstateActive()) == std::addressof(*this));
|
||||||
|
if (!ActivateBestChain(state, chainparams, nullptr)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NotifyHeaderTip(::ChainstateActive());
|
assert(std::addressof(::ChainstateActive()) == std::addressof(*this));
|
||||||
|
NotifyHeaderTip(*this);
|
||||||
|
|
||||||
// Recursively process earlier encountered successors of this block
|
// Recursively process earlier encountered successors of this block
|
||||||
std::deque<uint256> queue;
|
std::deque<uint256> queue;
|
||||||
@ -4700,7 +4705,8 @@ void LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, FlatFi
|
|||||||
head.ToString());
|
head.ToString());
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
BlockValidationState dummy;
|
BlockValidationState dummy;
|
||||||
if (::ChainstateActive().AcceptBlock(pblockrecursive, dummy, chainparams, nullptr, true, &it->second, nullptr))
|
assert(std::addressof(::ChainstateActive()) == std::addressof(*this));
|
||||||
|
if (AcceptBlock(pblockrecursive, dummy, chainparams, nullptr, true, &it->second, nullptr))
|
||||||
{
|
{
|
||||||
nLoaded++;
|
nLoaded++;
|
||||||
queue.push_back(pblockrecursive->GetHash());
|
queue.push_back(pblockrecursive->GetHash());
|
||||||
@ -4708,7 +4714,8 @@ void LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, FlatFi
|
|||||||
}
|
}
|
||||||
range.first++;
|
range.first++;
|
||||||
mapBlocksUnknownParent.erase(it);
|
mapBlocksUnknownParent.erase(it);
|
||||||
NotifyHeaderTip(::ChainstateActive());
|
assert(std::addressof(::ChainstateActive()) == std::addressof(*this));
|
||||||
|
NotifyHeaderTip(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
|
@ -144,8 +144,6 @@ extern const std::vector<std::string> CHECKLEVEL_DOC;
|
|||||||
FILE* OpenBlockFile(const FlatFilePos &pos, bool fReadOnly = false);
|
FILE* OpenBlockFile(const FlatFilePos &pos, bool fReadOnly = false);
|
||||||
/** Translation to a filesystem path */
|
/** Translation to a filesystem path */
|
||||||
fs::path GetBlockPosFilename(const FlatFilePos &pos);
|
fs::path GetBlockPosFilename(const FlatFilePos &pos);
|
||||||
/** Import blocks from an external file */
|
|
||||||
void LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, FlatFilePos* dbp = nullptr);
|
|
||||||
/** Ensures we have a genesis block in the block tree, possibly writing one to disk. */
|
/** Ensures we have a genesis block in the block tree, possibly writing one to disk. */
|
||||||
bool LoadGenesisBlock(const CChainParams& chainparams);
|
bool LoadGenesisBlock(const CChainParams& chainparams);
|
||||||
/** Unload database information */
|
/** Unload database information */
|
||||||
@ -616,6 +614,9 @@ public:
|
|||||||
bool ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size)
|
bool ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size)
|
||||||
EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
|
EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
|
||||||
|
|
||||||
|
/** Import blocks from an external file */
|
||||||
|
void LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, FlatFilePos* dbp = nullptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the on-disk chain state.
|
* Update the on-disk chain state.
|
||||||
* The caches and indexes are flushed depending on the mode we're called with
|
* The caches and indexes are flushed depending on the mode we're called with
|
||||||
|
Loading…
x
Reference in New Issue
Block a user