Changeset View
Changeset View
Standalone View
Standalone View
src/validation.cpp
Show First 20 Lines • Show All 2,413 Lines • ▼ Show 20 Lines | void NotifyEntryRemoved(CTransactionRef txRemoved, | ||||
assert(!blocksConnected.back().pindex); | assert(!blocksConnected.back().pindex); | ||||
if (reason == MemPoolRemovalReason::CONFLICT) { | if (reason == MemPoolRemovalReason::CONFLICT) { | ||||
blocksConnected.back().conflictedTxs->emplace_back( | blocksConnected.back().conflictedTxs->emplace_back( | ||||
std::move(txRemoved)); | std::move(txRemoved)); | ||||
} | } | ||||
} | } | ||||
}; | }; | ||||
bool CChainState::MarkBlockAsFinal(const Config &config, | bool CChainState::MarkBlockAsFinal(BlockValidationState &state, | ||||
BlockValidationState &state, | |||||
const CBlockIndex *pindex) { | const CBlockIndex *pindex) { | ||||
AssertLockHeld(cs_main); | AssertLockHeld(cs_main); | ||||
if (pindex->nStatus.isInvalid()) { | if (pindex->nStatus.isInvalid()) { | ||||
// We try to finalize an invalid block. | // We try to finalize an invalid block. | ||||
LogPrintf("ERROR: %s: Trying to finalize invalid block %s\n", __func__, | LogPrintf("ERROR: %s: Trying to finalize invalid block %s\n", __func__, | ||||
pindex->GetBlockHash().ToString()); | pindex->GetBlockHash().ToString()); | ||||
return state.Invalid(BlockValidationResult::BLOCK_CACHED_INVALID, | return state.Invalid(BlockValidationResult::BLOCK_CACHED_INVALID, | ||||
"finalize-invalid-block"); | "finalize-invalid-block"); | ||||
Show All 14 Lines | if (IsBlockFinalized(pindex)) { | ||||
return true; | return true; | ||||
} | } | ||||
// We have a new block to finalize. | // We have a new block to finalize. | ||||
m_finalizedBlockIndex = pindex; | m_finalizedBlockIndex = pindex; | ||||
return true; | return true; | ||||
} | } | ||||
static const CBlockIndex *FindBlockToFinalize(const Config &config, | static const CBlockIndex *FindBlockToFinalize(CBlockIndex *pindexNew) | ||||
CBlockIndex *pindexNew) | |||||
EXCLUSIVE_LOCKS_REQUIRED(cs_main) { | EXCLUSIVE_LOCKS_REQUIRED(cs_main) { | ||||
AssertLockHeld(cs_main); | AssertLockHeld(cs_main); | ||||
const int32_t maxreorgdepth = | const int32_t maxreorgdepth = | ||||
gArgs.GetArg("-maxreorgdepth", DEFAULT_MAX_REORG_DEPTH); | gArgs.GetArg("-maxreorgdepth", DEFAULT_MAX_REORG_DEPTH); | ||||
const int64_t finalizationdelay = | const int64_t finalizationdelay = | ||||
gArgs.GetArg("-finalizationdelay", DEFAULT_MIN_FINALIZATION_DELAY); | gArgs.GetArg("-finalizationdelay", DEFAULT_MIN_FINALIZATION_DELAY); | ||||
▲ Show 20 Lines • Show All 87 Lines • ▼ Show 20 Lines | LogPrint(BCLog::BENCH, " - Load block from disk: %.2fms [%.2fs]\n", | ||||
} | } | ||||
return error("%s: ConnectBlock %s failed, %s", __func__, | return error("%s: ConnectBlock %s failed, %s", __func__, | ||||
pindexNew->GetBlockHash().ToString(), | pindexNew->GetBlockHash().ToString(), | ||||
state.ToString()); | state.ToString()); | ||||
} | } | ||||
// Update the finalized block. | // Update the finalized block. | ||||
const CBlockIndex *pindexToFinalize = | const CBlockIndex *pindexToFinalize = FindBlockToFinalize(pindexNew); | ||||
FindBlockToFinalize(config, pindexNew); | if (pindexToFinalize && !MarkBlockAsFinal(state, pindexToFinalize)) { | ||||
if (pindexToFinalize && | |||||
!MarkBlockAsFinal(config, state, pindexToFinalize)) { | |||||
return error("ConnectTip(): MarkBlockAsFinal %s failed (%s)", | return error("ConnectTip(): MarkBlockAsFinal %s failed (%s)", | ||||
pindexNew->GetBlockHash().ToString(), | pindexNew->GetBlockHash().ToString(), | ||||
state.ToString()); | state.ToString()); | ||||
} | } | ||||
nTime3 = GetTimeMicros(); | nTime3 = GetTimeMicros(); | ||||
nTimeConnectTotal += nTime3 - nTime2; | nTimeConnectTotal += nTime3 - nTime2; | ||||
LogPrint(BCLog::BENCH, | LogPrint(BCLog::BENCH, | ||||
▲ Show 20 Lines • Show All 797 Lines • ▼ Show 20 Lines | bool CChainState::FinalizeBlock(const Config &config, | ||||
AssertLockNotHeld(m_cs_chainstate); | AssertLockNotHeld(m_cs_chainstate); | ||||
// See 'Note for backport of Core PR16849' in CChainState::UnwindBlock | // See 'Note for backport of Core PR16849' in CChainState::UnwindBlock | ||||
LOCK(m_cs_chainstate); | LOCK(m_cs_chainstate); | ||||
AssertLockNotHeld(cs_main); | AssertLockNotHeld(cs_main); | ||||
CBlockIndex *pindexToInvalidate = nullptr; | CBlockIndex *pindexToInvalidate = nullptr; | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
if (!MarkBlockAsFinal(config, state, pindex)) { | if (!MarkBlockAsFinal(state, pindex)) { | ||||
// state is set by MarkBlockAsFinal. | // state is set by MarkBlockAsFinal. | ||||
return false; | return false; | ||||
} | } | ||||
// We have a valid candidate, make sure it is not parked. | // We have a valid candidate, make sure it is not parked. | ||||
if (pindex->nStatus.isOnParkedChain()) { | if (pindex->nStatus.isOnParkedChain()) { | ||||
UnparkBlock(pindex); | UnparkBlock(pindex); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 2,658 Lines • Show Last 20 Lines |