mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 20:12:57 +01:00
blocks-1,
verify block chain on load, so wouldn't have needed to delete blk*.dat, it would have done a reorg automatically
This commit is contained in:
parent
c923cdbd5b
commit
bb3fd02930
23
db.cpp
23
db.cpp
@ -459,6 +459,29 @@ bool CTxDB::LoadBlockIndex()
|
|||||||
// Load bnBestInvalidWork, OK if it doesn't exist
|
// Load bnBestInvalidWork, OK if it doesn't exist
|
||||||
ReadBestInvalidWork(bnBestInvalidWork);
|
ReadBestInvalidWork(bnBestInvalidWork);
|
||||||
|
|
||||||
|
// Verify blocks in the best chain
|
||||||
|
CBlockIndex* pindexFork = NULL;
|
||||||
|
for (CBlockIndex* pindex = pindexBest; pindex && pindex->pprev; pindex = pindex->pprev)
|
||||||
|
{
|
||||||
|
CBlock block;
|
||||||
|
if (!block.ReadFromDisk(pindex))
|
||||||
|
return error("LoadBlockIndex() : block.ReadFromDisk failed");
|
||||||
|
if (!block.CheckBlock())
|
||||||
|
{
|
||||||
|
printf("LoadBlockIndex() : *** found bad block at %d, hash=%s\n", pindex->nHeight, pindex->GetBlockHash().ToString().c_str());
|
||||||
|
pindexFork = pindex->pprev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pindexFork)
|
||||||
|
{
|
||||||
|
printf("LoadBlockIndex() : *** moving best chain pointer back to block %d\n", pindexFork->nHeight);
|
||||||
|
CBlock block;
|
||||||
|
if (!block.ReadFromDisk(pindexFork))
|
||||||
|
return error("LoadBlockIndex() : block.ReadFromDisk failed");
|
||||||
|
CTxDB txdb;
|
||||||
|
block.SetBestChain(txdb, pindexFork);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
108
main.cpp
108
main.cpp
@ -1234,6 +1234,57 @@ bool Reorganize(CTxDB& txdb, CBlockIndex* pindexNew)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew)
|
||||||
|
{
|
||||||
|
uint256 hash = GetHash();
|
||||||
|
|
||||||
|
txdb.TxnBegin();
|
||||||
|
if (pindexGenesisBlock == NULL && hash == hashGenesisBlock)
|
||||||
|
{
|
||||||
|
pindexGenesisBlock = pindexNew;
|
||||||
|
txdb.WriteHashBestChain(hash);
|
||||||
|
}
|
||||||
|
else if (hashPrevBlock == hashBestChain)
|
||||||
|
{
|
||||||
|
// Adding to current best branch
|
||||||
|
if (!ConnectBlock(txdb, pindexNew) || !txdb.WriteHashBestChain(hash))
|
||||||
|
{
|
||||||
|
txdb.TxnAbort();
|
||||||
|
Lockdown(pindexNew);
|
||||||
|
return error("SetBestChain() : ConnectBlock failed");
|
||||||
|
}
|
||||||
|
txdb.TxnCommit();
|
||||||
|
pindexNew->pprev->pnext = pindexNew;
|
||||||
|
|
||||||
|
// Delete redundant memory transactions
|
||||||
|
foreach(CTransaction& tx, vtx)
|
||||||
|
tx.RemoveFromMemoryPool();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// New best branch
|
||||||
|
if (!Reorganize(txdb, pindexNew))
|
||||||
|
{
|
||||||
|
txdb.TxnAbort();
|
||||||
|
Lockdown(pindexNew);
|
||||||
|
return error("SetBestChain() : Reorganize failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
txdb.TxnCommit();
|
||||||
|
|
||||||
|
// New best block
|
||||||
|
hashBestChain = hash;
|
||||||
|
pindexBest = pindexNew;
|
||||||
|
nBestHeight = pindexBest->nHeight;
|
||||||
|
bnBestChainWork = pindexNew->bnChainWork;
|
||||||
|
nTimeBestReceived = GetTime();
|
||||||
|
nTransactionsUpdated++;
|
||||||
|
printf("SetBestChain: new best=%s height=%d work=%s\n", hashBestChain.ToString().substr(0,22).c_str(), nBestHeight, bnBestChainWork.ToString().c_str());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool CBlock::AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos)
|
bool CBlock::AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos)
|
||||||
{
|
{
|
||||||
// Check for duplicate
|
// Check for duplicate
|
||||||
@ -1260,50 +1311,8 @@ bool CBlock::AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos)
|
|||||||
|
|
||||||
// New best
|
// New best
|
||||||
if (pindexNew->bnChainWork > bnBestChainWork)
|
if (pindexNew->bnChainWork > bnBestChainWork)
|
||||||
{
|
if (!SetBestChain(txdb, pindexNew))
|
||||||
txdb.TxnBegin();
|
return false;
|
||||||
if (pindexGenesisBlock == NULL && hash == hashGenesisBlock)
|
|
||||||
{
|
|
||||||
pindexGenesisBlock = pindexNew;
|
|
||||||
txdb.WriteHashBestChain(hash);
|
|
||||||
}
|
|
||||||
else if (hashPrevBlock == hashBestChain)
|
|
||||||
{
|
|
||||||
// Adding to current best branch
|
|
||||||
if (!ConnectBlock(txdb, pindexNew) || !txdb.WriteHashBestChain(hash))
|
|
||||||
{
|
|
||||||
txdb.TxnAbort();
|
|
||||||
Lockdown(pindexNew);
|
|
||||||
return error("AddToBlockIndex() : ConnectBlock failed");
|
|
||||||
}
|
|
||||||
txdb.TxnCommit();
|
|
||||||
pindexNew->pprev->pnext = pindexNew;
|
|
||||||
|
|
||||||
// Delete redundant memory transactions
|
|
||||||
foreach(CTransaction& tx, vtx)
|
|
||||||
tx.RemoveFromMemoryPool();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// New best branch
|
|
||||||
if (!Reorganize(txdb, pindexNew))
|
|
||||||
{
|
|
||||||
txdb.TxnAbort();
|
|
||||||
Lockdown(pindexNew);
|
|
||||||
return error("AddToBlockIndex() : Reorganize failed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
txdb.TxnCommit();
|
|
||||||
|
|
||||||
// New best block
|
|
||||||
hashBestChain = hash;
|
|
||||||
pindexBest = pindexNew;
|
|
||||||
nBestHeight = pindexBest->nHeight;
|
|
||||||
bnBestChainWork = pindexNew->bnChainWork;
|
|
||||||
nTimeBestReceived = GetTime();
|
|
||||||
nTransactionsUpdated++;
|
|
||||||
printf("AddToBlockIndex: new best=%s height=%d work=%s\n", hashBestChain.ToString().substr(0,22).c_str(), nBestHeight, bnBestChainWork.ToString().c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
txdb.Close();
|
txdb.Close();
|
||||||
|
|
||||||
@ -1393,7 +1402,16 @@ bool CBlock::AcceptBlock()
|
|||||||
(pindexPrev->nHeight+1 == 68555 && hash != uint256("0x00000000001e1b4903550a0b96e9a9405c8a95f387162e4944e8d9fbe501cd6a")) ||
|
(pindexPrev->nHeight+1 == 68555 && hash != uint256("0x00000000001e1b4903550a0b96e9a9405c8a95f387162e4944e8d9fbe501cd6a")) ||
|
||||||
(pindexPrev->nHeight+1 == 70567 && hash != uint256("0x00000000006a49b14bcf27462068f1264c961f11fa2e0eddd2be0791e1d4124a")) ||
|
(pindexPrev->nHeight+1 == 70567 && hash != uint256("0x00000000006a49b14bcf27462068f1264c961f11fa2e0eddd2be0791e1d4124a")) ||
|
||||||
(pindexPrev->nHeight+1 == 74000 && hash != uint256("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20")))
|
(pindexPrev->nHeight+1 == 74000 && hash != uint256("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20")))
|
||||||
return error("AcceptBlock() : rejected by checkpoint lockin");
|
return error("AcceptBlock() : rejected by checkpoint lockin at %d", pindexPrev->nHeight+1);
|
||||||
|
|
||||||
|
// Scanback checkpoint lockin
|
||||||
|
for (CBlockIndex* pindex = pindexPrev; pindex->nHeight >= 74000; pindex = pindex->pprev)
|
||||||
|
{
|
||||||
|
if (pindex->nHeight == 74000 && pindex->GetBlockHash() != uint256("0x0000000000573993a3c9e41ce34471c079dcf5f52a0e824a81e7f953b8661a20"))
|
||||||
|
return error("AcceptBlock() : rejected by scanback lockin at %d", pindex->nHeight);
|
||||||
|
if (pindex->nHeight == 74638 && pindex->GetBlockHash() == uint256("0x0000000000790ab3f22ec756ad43b6ab569abf0bddeb97c67a6f7b1470a7ec1c"))
|
||||||
|
return error("AcceptBlock() : rejected by scanback lockin at %d", pindex->nHeight);
|
||||||
|
}
|
||||||
|
|
||||||
// Write block to history file
|
// Write block to history file
|
||||||
if (!CheckDiskSpace(::GetSerializeSize(*this, SER_DISK)))
|
if (!CheckDiskSpace(::GetSerializeSize(*this, SER_DISK)))
|
||||||
|
1
main.h
1
main.h
@ -1065,6 +1065,7 @@ public:
|
|||||||
bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
|
bool DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex);
|
||||||
bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex);
|
bool ConnectBlock(CTxDB& txdb, CBlockIndex* pindex);
|
||||||
bool ReadFromDisk(const CBlockIndex* blockindex, bool fReadTransactions=true);
|
bool ReadFromDisk(const CBlockIndex* blockindex, bool fReadTransactions=true);
|
||||||
|
bool SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew);
|
||||||
bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
|
bool AddToBlockIndex(unsigned int nFile, unsigned int nBlockPos);
|
||||||
bool CheckBlock() const;
|
bool CheckBlock() const;
|
||||||
bool AcceptBlock();
|
bool AcceptBlock();
|
||||||
|
4
rpc.cpp
4
rpc.cpp
@ -120,7 +120,7 @@ Value getblockcount(const Array& params, bool fHelp)
|
|||||||
"getblockcount\n"
|
"getblockcount\n"
|
||||||
"Returns the number of blocks in the longest block chain.");
|
"Returns the number of blocks in the longest block chain.");
|
||||||
|
|
||||||
return nBestHeight + 1;
|
return nBestHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -240,7 +240,7 @@ Value getinfo(const Array& params, bool fHelp)
|
|||||||
Object obj;
|
Object obj;
|
||||||
obj.push_back(Pair("version", (int)VERSION));
|
obj.push_back(Pair("version", (int)VERSION));
|
||||||
obj.push_back(Pair("balance", (double)GetBalance() / (double)COIN));
|
obj.push_back(Pair("balance", (double)GetBalance() / (double)COIN));
|
||||||
obj.push_back(Pair("blocks", (int)nBestHeight + 1));
|
obj.push_back(Pair("blocks", (int)nBestHeight));
|
||||||
obj.push_back(Pair("connections", (int)vNodes.size()));
|
obj.push_back(Pair("connections", (int)vNodes.size()));
|
||||||
obj.push_back(Pair("proxy", (fUseProxy ? addrProxy.ToStringIPPort() : string())));
|
obj.push_back(Pair("proxy", (fUseProxy ? addrProxy.ToStringIPPort() : string())));
|
||||||
obj.push_back(Pair("generate", (bool)fGenerateBitcoins));
|
obj.push_back(Pair("generate", (bool)fGenerateBitcoins));
|
||||||
|
@ -20,7 +20,7 @@ class CDataStream;
|
|||||||
class CAutoFile;
|
class CAutoFile;
|
||||||
|
|
||||||
static const int VERSION = 310;
|
static const int VERSION = 310;
|
||||||
static const char* pszSubVer = ".0";
|
static const char* pszSubVer = ".2";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2
ui.cpp
2
ui.cpp
@ -1027,7 +1027,7 @@ void CMainFrame::OnPaintListCtrl(wxPaintEvent& event)
|
|||||||
strGen = _("(not connected)");
|
strGen = _("(not connected)");
|
||||||
m_statusBar->SetStatusText(strGen, 1);
|
m_statusBar->SetStatusText(strGen, 1);
|
||||||
|
|
||||||
string strStatus = strprintf(_(" %d connections %d blocks %d transactions"), vNodes.size(), nBestHeight + 1, nTransactionCount);
|
string strStatus = strprintf(_(" %d connections %d blocks %d transactions"), vNodes.size(), nBestHeight, nTransactionCount);
|
||||||
m_statusBar->SetStatusText(strStatus, 2);
|
m_statusBar->SetStatusText(strStatus, 2);
|
||||||
|
|
||||||
if (fDebug && GetTime() - nThreadSocketHandlerHeartbeat > 60)
|
if (fDebug && GetTime() - nThreadSocketHandlerHeartbeat > 60)
|
||||||
|
Loading…
Reference in New Issue
Block a user