diff --git a/src/validation.h b/src/validation.h --- a/src/validation.h +++ b/src/validation.h @@ -195,6 +195,11 @@ static const int DEFAULT_STOPATHEIGHT = 0; /** Default for -maxreorgdepth */ static const int DEFAULT_MAX_REORG_DEPTH = 10; +/** + * Default for -finalizationdelay in seconds. + * This is the delay after IBD completes before we will start finalizing blocks. + */ +static const int DEFAULT_FINALIZATION_DELAY = 2 * 60 * 60; extern CScript COINBASE_FLAGS; extern CCriticalSection cs_main; diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -80,6 +80,7 @@ size_t nCoinCacheUsage = 5000 * 300; uint64_t nPruneTarget = 0; int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE; +time_t g_IBDCompletionTime = 0; uint256 hashAssumeValid; arith_uint256 nMinimumChainWork; @@ -935,6 +936,9 @@ if (chainActive.Tip()->GetBlockTime() < (GetTime() - nMaxTipAge)) { return true; } + + g_IBDCompletionTime = GetTime(); + LogPrintf("Leaving InitialBlockDownload (latching to false)\n"); latchToFalse.store(true, std::memory_order_relaxed); return false; @@ -2369,6 +2373,10 @@ FormatStateMessage(state)); } + // Update the finalized block. + time_t finalizationDelay = + gArgs.GetArg("-finalizationdelay", DEFAULT_FINALIZATION_DELAY); + // Update the finalized block. int32_t nHeightToFinalize = pindexNew->nHeight - @@ -2376,6 +2384,7 @@ CBlockIndex *pindexToFinalize = pindexNew->GetAncestor(nHeightToFinalize); if (pindexToFinalize && + g_IBDCompletionTime + finalizationDelay >= GetTime() && !FinalizeBlockInternal(config, state, pindexToFinalize)) { state.SetCorruptionPossible(); return error("ConnectTip(): FinalizeBlock %s failed (%s)",