|
|
|
@ -1520,7 +1520,8 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi
@@ -1520,7 +1520,8 @@ 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); |
|
|
|
|
|
|
|
|
|
bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool* pfClean) |
|
|
|
|
{ |
|
|
|
@ -1535,7 +1536,7 @@ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex
@@ -1535,7 +1536,7 @@ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex
|
|
|
|
|
CDiskBlockPos pos = pindex->GetUndoPos(); |
|
|
|
|
if (pos.IsNull()) |
|
|
|
|
return error("DisconnectBlock() : no undo data available"); |
|
|
|
|
if (!blockUndo.ReadFromDisk(pos, pindex->pprev->GetBlockHash())) |
|
|
|
|
if (!UndoReadFromDisk(blockUndo, pos, pindex->pprev->GetBlockHash())) |
|
|
|
|
return error("DisconnectBlock() : failure reading undo data"); |
|
|
|
|
|
|
|
|
|
if (blockUndo.vtxundo.size() + 1 != block.vtx.size()) |
|
|
|
@ -1777,7 +1778,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
@@ -1777,7 +1778,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
|
|
|
|
CDiskBlockPos pos; |
|
|
|
|
if (!FindUndoPos(state, pindex->nFile, pos, ::GetSerializeSize(blockundo, SER_DISK, CLIENT_VERSION) + 40)) |
|
|
|
|
return error("ConnectBlock() : FindUndoPos failed"); |
|
|
|
|
if (!blockundo.WriteToDisk(pos, pindex->pprev->GetBlockHash())) |
|
|
|
|
if (!UndoWriteToDisk(blockundo, pos, pindex->pprev->GetBlockHash())) |
|
|
|
|
return state.Abort("Failed to write undo data"); |
|
|
|
|
|
|
|
|
|
// update nUndoPos in block index
|
|
|
|
@ -2943,7 +2944,7 @@ bool CVerifyDB::VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth
@@ -2943,7 +2944,7 @@ bool CVerifyDB::VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth
|
|
|
|
|
CBlockUndo undo; |
|
|
|
|
CDiskBlockPos pos = pindex->GetUndoPos(); |
|
|
|
|
if (!pos.IsNull()) { |
|
|
|
|
if (!undo.ReadFromDisk(pos, pindex->pprev->GetBlockHash())) |
|
|
|
|
if (!UndoReadFromDisk(undo, pos, pindex->pprev->GetBlockHash())) |
|
|
|
|
return error("VerifyDB() : *** found bad undo data at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -4509,44 +4510,44 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
@@ -4509,44 +4510,44 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool CBlockUndo::WriteToDisk(CDiskBlockPos &pos, const uint256 &hashBlock) |
|
|
|
|
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("CBlockUndo::WriteToDisk : OpenUndoFile failed"); |
|
|
|
|
return error("%s : OpenUndoFile failed", __func__); |
|
|
|
|
|
|
|
|
|
// Write index header
|
|
|
|
|
unsigned int nSize = fileout.GetSerializeSize(*this); |
|
|
|
|
unsigned int nSize = fileout.GetSerializeSize(blockundo); |
|
|
|
|
fileout << FLATDATA(Params().MessageStart()) << nSize; |
|
|
|
|
|
|
|
|
|
// Write undo data
|
|
|
|
|
long fileOutPos = ftell(fileout.Get()); |
|
|
|
|
if (fileOutPos < 0) |
|
|
|
|
return error("CBlockUndo::WriteToDisk : ftell failed"); |
|
|
|
|
return error("%s : ftell failed", __func__); |
|
|
|
|
pos.nPos = (unsigned int)fileOutPos; |
|
|
|
|
fileout << *this; |
|
|
|
|
fileout << blockundo; |
|
|
|
|
|
|
|
|
|
// calculate & write checksum
|
|
|
|
|
CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION); |
|
|
|
|
hasher << hashBlock; |
|
|
|
|
hasher << *this; |
|
|
|
|
hasher << blockundo; |
|
|
|
|
fileout << hasher.GetHash(); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool CBlockUndo::ReadFromDisk(const CDiskBlockPos &pos, const uint256 &hashBlock) |
|
|
|
|
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("CBlockUndo::ReadFromDisk : OpenBlockFile failed"); |
|
|
|
|
return error("%s : OpenBlockFile failed", __func__); |
|
|
|
|
|
|
|
|
|
// Read block
|
|
|
|
|
uint256 hashChecksum; |
|
|
|
|
try { |
|
|
|
|
filein >> *this; |
|
|
|
|
filein >> blockundo; |
|
|
|
|
filein >> hashChecksum; |
|
|
|
|
} |
|
|
|
|
catch (const std::exception& e) { |
|
|
|
@ -4556,9 +4557,9 @@ bool CBlockUndo::ReadFromDisk(const CDiskBlockPos &pos, const uint256 &hashBlock
@@ -4556,9 +4557,9 @@ bool CBlockUndo::ReadFromDisk(const CDiskBlockPos &pos, const uint256 &hashBlock
|
|
|
|
|
// Verify checksum
|
|
|
|
|
CHashWriter hasher(SER_GETHASH, PROTOCOL_VERSION); |
|
|
|
|
hasher << hashBlock; |
|
|
|
|
hasher << *this; |
|
|
|
|
hasher << blockundo; |
|
|
|
|
if (hashChecksum != hasher.GetHash()) |
|
|
|
|
return error("CBlockUndo::ReadFromDisk : Checksum mismatch"); |
|
|
|
|
return error("%s : Checksum mismatch", __func__); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|