aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/db.cpp1
-rw-r--r--src/init.cpp34
2 files changed, 34 insertions, 1 deletions
diff --git a/src/db.cpp b/src/db.cpp
index 06e5543b2e..5ca9ea2c34 100644
--- a/src/db.cpp
+++ b/src/db.cpp
@@ -636,7 +636,6 @@ bool LoadBlockIndex(CChainDB &chaindb)
{
if (pindexGenesisBlock == NULL)
return true;
- return error("CTxDB::LoadBlockIndex() : hashBestChain not loaded");
}
hashBestChain = pindexBest->GetBlockHash();
nBestHeight = pindexBest->nHeight;
diff --git a/src/init.cpp b/src/init.cpp
index b05d57abfe..85aa4f6007 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -780,6 +780,40 @@ bool AppInit2()
// ********************************************************* Step 9: import blocks
+ // scan for better chains in the block chain database, that are not yet connected in the active best chain
+ CBlockIndex *pindexFoundBest = pindexBest;
+ for (std::map<uint256,CBlockIndex*>::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) {
+ CBlockIndex *pindex = it->second;
+ if (pindexFoundBest==NULL || pindex->bnChainWork > pindexFoundBest->bnChainWork)
+ pindexFoundBest = pindex;
+ }
+ if (pindexFoundBest != pindexBest) {
+ uiInterface.InitMessage(_("Importing blocks from block database..."));
+ uint64 nTxs = 0;
+ uint64 nBlocks = 0;
+ std::vector<CBlockIndex*> vAttach;
+ vAttach.reserve(pindexFoundBest->nHeight - (pindexBest==NULL ? 0 : pindexBest->nHeight));
+ while (pindexFoundBest && pindexFoundBest->bnChainWork > (pindexBest==NULL ? 0 : pindexBest->bnChainWork)) {
+ vAttach.push_back(pindexFoundBest);
+ pindexFoundBest = pindexFoundBest->pprev;
+ }
+ for (std::vector<CBlockIndex*>::reverse_iterator it = vAttach.rbegin(); it != vAttach.rend(); it++) {
+ CBlockIndex *pindex = *it;
+ CBlock block;
+ if (!block.ReadFromDisk(pindex))
+ break;
+ nTxs += block.vtx.size();
+ nBlocks++;
+ if (pindex->nHeight == 0 || nTxs + nBlocks*3 > 500) {
+ nTxs=0;
+ nBlocks=0;
+ block.SetBestChain(pindex);
+ }
+ if (fRequestShutdown)
+ break;
+ }
+ }
+
std::vector<boost::filesystem::path> *vPath = new std::vector<boost::filesystem::path>();
if (mapArgs.count("-loadblock"))
{