init: skip block verification for snapshot-sourced chains
After LoadSnapshot, the daemon has headers + UTXOs but the raw block bodies haven't been downloaded yet — they'll arrive via P2P as the node syncs past the snapshot tip. LoadBlockIndex's verification loop tries to read the last 50 block bodies from disk and fails with 'OpenBlockFile failed' because the data isn't on disk yet. Add fLoadedFromSnapshot global, set true at the end of successful LoadSnapshot. In both txdb-leveldb.cpp and txdb-rocksdb.cpp LoadBlockIndex verification loops, when ReadFromDisk fails AND fLoadedFromSnapshot is true, log a warning and continue (the UTXO set itself was already content-hash verified during LoadSnapshot, so we have strong evidence the chain state is correct). For non-snapshot chains (full blk0001.dat downloaded, normal IBD), the ReadFromDisk failure remains a fatal error as before. Combined with the prior fix in utxosnapshot.cpp that sets fSerializeChainTrust=true before writes, the full snapshot path now works end-to-end on a fresh datadir.
This commit is contained in:
@@ -624,7 +624,18 @@ bool CTxDB::LoadBlockIndex()
|
||||
break;
|
||||
CBlock block;
|
||||
if (!block.ReadFromDisk(pindex))
|
||||
{
|
||||
// Snapshot-sourced chains have block headers + UTXOs but not raw
|
||||
// block bodies on disk yet. Skip verification for those — the
|
||||
// UTXO set itself was content-hash verified during LoadSnapshot.
|
||||
// For non-snapshot chains, this remains a fatal error.
|
||||
if (fLoadedFromSnapshot) {
|
||||
printf("LoadBlockIndex(): block %d not on disk (snapshot-sourced), skipping verification\n",
|
||||
pindex->nHeight);
|
||||
continue;
|
||||
}
|
||||
return error("LoadBlockIndex() : block.ReadFromDisk failed");
|
||||
}
|
||||
if (nCheckLevel>0 && !block.CheckBlock(true, true, (nCheckLevel>6)))
|
||||
{
|
||||
printf("LoadBlockIndex() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
|
||||
|
||||
Reference in New Issue
Block a user