ReadBestInvalidWork(bnBestInvalidWork);\r
\r
// Verify blocks in the best chain\r
- vector<CBlockIndex*> vChain;\r
- vector<CBlockIndex*> vBad;\r
CBlockIndex* pindexFork = NULL;\r
for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev)\r
{\r
- vChain.push_back(pindex);\r
CBlock block;\r
if (!block.ReadFromDisk(pindex))\r
return error("LoadBlockIndex() : block.ReadFromDisk failed");\r
{\r
printf("LoadBlockIndex() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());\r
pindexFork = pindex->pprev;\r
- vBad = vChain;\r
}\r
}\r
if (pindexFork)\r
{\r
+ // Reorg back to the fork\r
printf("LoadBlockIndex() : *** moving best chain pointer back to block %d\n", pindexFork->nHeight);\r
CBlock block;\r
if (!block.ReadFromDisk(pindexFork))\r
return error("LoadBlockIndex() : block.ReadFromDisk failed");\r
CTxDB txdb;\r
block.SetBestChain(txdb, pindexFork);\r
-\r
- // Delete the bad chain\r
- foreach(CBlockIndex* pindex, vBad)\r
- {\r
- txdb.EraseBlockIndex(pindex->GetBlockHash());\r
- mapBlockIndex.erase(pindex->GetBlockHash());\r
- delete pindex;\r
- }\r
}\r
\r
return true;\r
\r
bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex)\r
{\r
+ // Check it again in case a previous version let a bad block in\r
+ if (!CheckBlock())\r
+ return false;\r
+\r
//// issue here: it doesn't know the version\r
unsigned int nTxPos = pindex->nBlockPos + ::GetSerializeSize(CBlock(), SER_DISK) - 1 + GetSizeOfCompactSize(vtx.size());\r
\r