mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-12-10 12:43:30 +01:00
Introduce CHashVerifier to hash read data
This is necessary later, when we drop the nVersion field from the undo data. At that point deserializing and reserializing the data won't roundtrip anymore, and thus that approach can't be used to verify checksums anymore. With this CHashVerifier approach, we can deserialize while hashing the exact serialized form that was used. This is both more efficient and more correct in that case.
This commit is contained in:
@@ -1210,8 +1210,10 @@ bool UndoReadFromDisk(CBlockUndo& blockundo, const CDiskBlockPos& pos, const uin
|
||||
|
||||
// Read block
|
||||
uint256 hashChecksum;
|
||||
CHashVerifier<CAutoFile> verifier(&filein); // We need a CHashVerifier as reserializing may lose data
|
||||
try {
|
||||
filein >> blockundo;
|
||||
verifier << hashBlock;
|
||||
verifier >> blockundo;
|
||||
filein >> hashChecksum;
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
@@ -1219,10 +1221,7 @@ bool UndoReadFromDisk(CBlockUndo& blockundo, const CDiskBlockPos& pos, const uin
|
||||
}
|
||||
|
||||
// Verify checksum
|
||||
CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION);
|
||||
hasher << hashBlock;
|
||||
hasher << blockundo;
|
||||
if (hashChecksum != hasher.GetHash())
|
||||
if (hashChecksum != verifier.GetHash())
|
||||
return error("%s: Checksum mismatch", __func__);
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user