|
|
@ -1521,8 +1521,63 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
bool UndoWriteToDisk(const CBlockUndo& blockundo, CDiskBlockPos& pos, const uint256& hashBlock); |
|
|
|
bool UndoReadFromDisk(CBlockUndo& blockundo, const CDiskBlockPos& pos, const uint256& hashBlock); |
|
|
|
namespace { |
|
|
|
|
|
|
|
bool UndoWriteToDisk(const CBlockUndo& blockundo, CDiskBlockPos& pos, const uint256& hashBlock) |
|
|
|
{ |
|
|
|
// Open history file to append
|
|
|
|
CAutoFile fileout(OpenUndoFile(pos), SER_DISK, CLIENT_VERSION); |
|
|
|
if (fileout.IsNull()) |
|
|
|
return error("%s : OpenUndoFile failed", __func__); |
|
|
|
|
|
|
|
// Write index header
|
|
|
|
unsigned int nSize = fileout.GetSerializeSize(blockundo); |
|
|
|
fileout << FLATDATA(Params().MessageStart()) << nSize; |
|
|
|
|
|
|
|
// Write undo data
|
|
|
|
long fileOutPos = ftell(fileout.Get()); |
|
|
|
if (fileOutPos < 0) |
|
|
|
return error("%s : ftell failed", __func__); |
|
|
|
pos.nPos = (unsigned int)fileOutPos; |
|
|
|
fileout << blockundo; |
|
|
|
|
|
|
|
// calculate & write checksum
|
|
|
|
CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION); |
|
|
|
hasher << hashBlock; |
|
|
|
hasher << blockundo; |
|
|
|
fileout << hasher.GetHash(); |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
bool UndoReadFromDisk(CBlockUndo& blockundo, const CDiskBlockPos& pos, const uint256& hashBlock) |
|
|
|
{ |
|
|
|
// Open history file to read
|
|
|
|
CAutoFile filein(OpenUndoFile(pos, true), SER_DISK, CLIENT_VERSION); |
|
|
|
if (filein.IsNull()) |
|
|
|
return error("%s : OpenBlockFile failed", __func__); |
|
|
|
|
|
|
|
// Read block
|
|
|
|
uint256 hashChecksum; |
|
|
|
try { |
|
|
|
filein >> blockundo; |
|
|
|
filein >> hashChecksum; |
|
|
|
} |
|
|
|
catch (const std::exception& e) { |
|
|
|
return error("%s : Deserialize or I/O error - %s", __func__, e.what()); |
|
|
|
} |
|
|
|
|
|
|
|
// Verify checksum
|
|
|
|
CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION); |
|
|
|
hasher << hashBlock; |
|
|
|
hasher << blockundo; |
|
|
|
if (hashChecksum != hasher.GetHash()) |
|
|
|
return error("%s : Checksum mismatch", __func__); |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
} // anon namespace
|
|
|
|
|
|
|
|
bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool* pfClean) |
|
|
|
{ |
|
|
@ -4510,61 +4565,6 @@ bool SendMessages(CNode* pto, bool fSendTrickle) |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool UndoWriteToDisk(const CBlockUndo& blockundo, CDiskBlockPos& pos, const uint256& hashBlock) |
|
|
|
{ |
|
|
|
// Open history file to append
|
|
|
|
CAutoFile fileout(OpenUndoFile(pos), SER_DISK, CLIENT_VERSION); |
|
|
|
if (fileout.IsNull()) |
|
|
|
return error("%s : OpenUndoFile failed", __func__); |
|
|
|
|
|
|
|
// Write index header
|
|
|
|
unsigned int nSize = fileout.GetSerializeSize(blockundo); |
|
|
|
fileout << FLATDATA(Params().MessageStart()) << nSize; |
|
|
|
|
|
|
|
// Write undo data
|
|
|
|
long fileOutPos = ftell(fileout.Get()); |
|
|
|
if (fileOutPos < 0) |
|
|
|
return error("%s : ftell failed", __func__); |
|
|
|
pos.nPos = (unsigned int)fileOutPos; |
|
|
|
fileout << blockundo; |
|
|
|
|
|
|
|
// calculate & write checksum
|
|
|
|
CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION); |
|
|
|
hasher << hashBlock; |
|
|
|
hasher << blockundo; |
|
|
|
fileout << hasher.GetHash(); |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
bool UndoReadFromDisk(CBlockUndo& blockundo, const CDiskBlockPos& pos, const uint256& hashBlock) |
|
|
|
{ |
|
|
|
// Open history file to read
|
|
|
|
CAutoFile filein(OpenUndoFile(pos, true), SER_DISK, CLIENT_VERSION); |
|
|
|
if (filein.IsNull()) |
|
|
|
return error("%s : OpenBlockFile failed", __func__); |
|
|
|
|
|
|
|
// Read block
|
|
|
|
uint256 hashChecksum; |
|
|
|
try { |
|
|
|
filein >> blockundo; |
|
|
|
filein >> hashChecksum; |
|
|
|
} |
|
|
|
catch (const std::exception& e) { |
|
|
|
return error("%s : Deserialize or I/O error - %s", __func__, e.what()); |
|
|
|
} |
|
|
|
|
|
|
|
// Verify checksum
|
|
|
|
CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION); |
|
|
|
hasher << hashBlock; |
|
|
|
hasher << blockundo; |
|
|
|
if (hashChecksum != hasher.GetHash()) |
|
|
|
return error("%s : Checksum mismatch", __func__); |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
std::string CBlockFileInfo::ToString() const { |
|
|
|
return strprintf("CBlockFileInfo(blocks=%u, size=%u, heights=%u...%u, time=%s...%s)", nBlocks, nSize, nHeightFirst, nHeightLast, DateTimeStrFormat("%Y-%m-%d", nTimeFirst), DateTimeStrFormat("%Y-%m-%d", nTimeLast)); |
|
|
|
} |
|
|
|