diff --git a/src/init.cpp b/src/init.cpp index 8ec4ec6a..a547b258 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -924,8 +924,11 @@ bool AppInit2(boost::thread_group& threadGroup) // scan for better chains in the block chain database, that are not yet connected in the active best chain CValidationState state; - if (!ConnectBestBlock(state)) - strErrors << "Failed to connect best block"; + if (!ConnectBestBlock(state)) { + // try again before giving up + if (!ConnectBestBlock(state)) + strErrors << "Failed to connect best block (try -reindex)"; + } std::vector vImportFiles; if (mapArgs.count("-loadblock")) diff --git a/src/main.cpp b/src/main.cpp index 2c9863c1..6631def4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1150,7 +1150,7 @@ bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, C CTransaction txPubKey; uint256 hashBlock; if( !GetTransaction(spamUser, txPubKey, hashBlock, block.nHeight) ) - return state.DoS(100, error("ConnectBlock() : spam signed by unknown user")); + return state.DoS(100, error("ConnectBlock() : spam signed by unknown user %s", spamUser.c_str())); std::vector< std::vector > vData; if( !txPubKey.pubKey.ExtractPushData(vData) || vData.size() < 1 ) @@ -1336,6 +1336,16 @@ bool SetBestChain(CValidationState &state, CBlockIndex* pindexNew) int64 nStart = GetTimeMicros(); if (!ConnectBlock(block, state, pindex, view)) { if (state.IsInvalid()) { + // [MF] invalidate all pindex between pindexNew and pindex + // trying to fix infinite recursion in SetBestChain. + CBlockIndex *pinvalid = pindexNew; + do { + pinvalid->nStatus |= BLOCK_FAILED_CHILD; + pblocktree->WriteBlockIndex(CDiskBlockIndex(pinvalid)); + setBlockIndexValid.erase(pinvalid); + pinvalid = pinvalid->pprev; + } while( pinvalid != NULL && pinvalid != pindex); + InvalidChainFound(pindexNew); InvalidBlockFound(pindex); }