node: avoid recomputing block hash in ReadBlock

Eliminate one SHA‑256 double‑hash computation of the header per block read by reusing the hash for:
* proof‑of‑work verification;
* (optional) integrity check against the supplied hash.
This commit is contained in:
Lőrinc
2025-05-12 22:41:04 +02:00
parent 2bf173210f
commit 09ee8b7f27
2 changed files with 13 additions and 12 deletions

View File

@@ -38,6 +38,7 @@
#include <cstddef>
#include <map>
#include <optional>
#include <unordered_map>
namespace kernel {
@@ -989,7 +990,7 @@ bool BlockManager::WriteBlockUndo(const CBlockUndo& blockundo, BlockValidationSt
return true;
}
bool BlockManager::ReadBlock(CBlock& block, const FlatFilePos& pos) const
bool BlockManager::ReadBlock(CBlock& block, const FlatFilePos& pos, const std::optional<uint256>& expected_hash) const
{
block.SetNull();
@@ -1007,8 +1008,10 @@ bool BlockManager::ReadBlock(CBlock& block, const FlatFilePos& pos) const
return false;
}
const auto block_hash{block.GetHash()};
// Check the header
if (!CheckProofOfWork(block.GetHash(), block.nBits, GetConsensus())) {
if (!CheckProofOfWork(block_hash, block.nBits, GetConsensus())) {
LogError("Errors in block header at %s while reading block", pos.ToString());
return false;
}
@@ -1019,21 +1022,19 @@ bool BlockManager::ReadBlock(CBlock& block, const FlatFilePos& pos) const
return false;
}
if (expected_hash && block_hash != *expected_hash) {
LogError("GetHash() doesn't match index at %s while reading block (%s != %s)",
pos.ToString(), block_hash.ToString(), expected_hash->ToString());
return false;
}
return true;
}
bool BlockManager::ReadBlock(CBlock& block, const CBlockIndex& index) const
{
const FlatFilePos block_pos{WITH_LOCK(cs_main, return index.GetBlockPos())};
if (!ReadBlock(block, block_pos)) {
return false;
}
if (block.GetHash() != index.GetBlockHash()) {
LogError("GetHash() doesn't match index for %s at %s while reading block", index.ToString(), block_pos.ToString());
return false;
}
return true;
return ReadBlock(block, block_pos, index.GetBlockHash());
}
bool BlockManager::ReadRawBlock(std::vector<uint8_t>& block, const FlatFilePos& pos) const