|
|
@ -2288,7 +2288,7 @@ static void PruneBlockIndexCandidates() { |
|
|
|
* Try to make some progress towards making pindexMostWork the active block. |
|
|
|
* Try to make some progress towards making pindexMostWork the active block. |
|
|
|
* pblock is either NULL or a pointer to a CBlock corresponding to pindexMostWork. |
|
|
|
* pblock is either NULL or a pointer to a CBlock corresponding to pindexMostWork. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
static bool ActivateBestChainStep(CValidationState& state, const CChainParams& chainparams, CBlockIndex* pindexMostWork, const CBlock* pblock, bool& fInvalidFound, ConnectTrace& connectTrace) |
|
|
|
static bool ActivateBestChainStep(CValidationState& state, const CChainParams& chainparams, CBlockIndex* pindexMostWork, const std::shared_ptr<const CBlock>& pblock, bool& fInvalidFound, ConnectTrace& connectTrace) |
|
|
|
{ |
|
|
|
{ |
|
|
|
AssertLockHeld(cs_main); |
|
|
|
AssertLockHeld(cs_main); |
|
|
|
const CBlockIndex *pindexOldTip = chainActive.Tip(); |
|
|
|
const CBlockIndex *pindexOldTip = chainActive.Tip(); |
|
|
@ -2321,8 +2321,7 @@ static bool ActivateBestChainStep(CValidationState& state, const CChainParams& c |
|
|
|
|
|
|
|
|
|
|
|
// Connect new blocks.
|
|
|
|
// Connect new blocks.
|
|
|
|
BOOST_REVERSE_FOREACH(CBlockIndex *pindexConnect, vpindexToConnect) { |
|
|
|
BOOST_REVERSE_FOREACH(CBlockIndex *pindexConnect, vpindexToConnect) { |
|
|
|
//TODO: The pblock copy is a major performance regression, but callers need updated to fix this
|
|
|
|
if (!ConnectTip(state, chainparams, pindexConnect, pindexConnect == pindexMostWork ? pblock : std::shared_ptr<const CBlock>(), connectTrace)) { |
|
|
|
if (!ConnectTip(state, chainparams, pindexConnect, (pblock && pindexConnect == pindexMostWork) ? std::make_shared<const CBlock>(*pblock) : std::shared_ptr<const CBlock>(), connectTrace)) { |
|
|
|
|
|
|
|
if (state.IsInvalid()) { |
|
|
|
if (state.IsInvalid()) { |
|
|
|
// The block violates a consensus rule.
|
|
|
|
// The block violates a consensus rule.
|
|
|
|
if (!state.CorruptionPossible()) |
|
|
|
if (!state.CorruptionPossible()) |
|
|
@ -2389,7 +2388,7 @@ static void NotifyHeaderTip() { |
|
|
|
* or an activated best chain. pblock is either NULL or a pointer to a block |
|
|
|
* or an activated best chain. pblock is either NULL or a pointer to a block |
|
|
|
* that is already loaded (to avoid loading it again from disk). |
|
|
|
* that is already loaded (to avoid loading it again from disk). |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, const CBlock *pblock) { |
|
|
|
bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, std::shared_ptr<const CBlock> pblock) { |
|
|
|
CBlockIndex *pindexMostWork = NULL; |
|
|
|
CBlockIndex *pindexMostWork = NULL; |
|
|
|
CBlockIndex *pindexNewTip = NULL; |
|
|
|
CBlockIndex *pindexNewTip = NULL; |
|
|
|
do { |
|
|
|
do { |
|
|
@ -2412,7 +2411,8 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
|
bool fInvalidFound = false; |
|
|
|
bool fInvalidFound = false; |
|
|
|
if (!ActivateBestChainStep(state, chainparams, pindexMostWork, pblock && pblock->GetHash() == pindexMostWork->GetBlockHash() ? pblock : NULL, fInvalidFound, connectTrace)) |
|
|
|
std::shared_ptr<const CBlock> nullBlockPtr; |
|
|
|
|
|
|
|
if (!ActivateBestChainStep(state, chainparams, pindexMostWork, pblock && pblock->GetHash() == pindexMostWork->GetBlockHash() ? pblock : nullBlockPtr, fInvalidFound, connectTrace)) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
if (fInvalidFound) { |
|
|
|
if (fInvalidFound) { |
|
|
@ -3142,8 +3142,13 @@ bool ProcessNewBlock(const CChainParams& chainparams, const CBlock* pblock, bool |
|
|
|
|
|
|
|
|
|
|
|
NotifyHeaderTip(); |
|
|
|
NotifyHeaderTip(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//TODO: This copy is a major performance regression, but callers need updated to fix this
|
|
|
|
|
|
|
|
std::shared_ptr<const CBlock> block_ptr; |
|
|
|
|
|
|
|
if (pblock) |
|
|
|
|
|
|
|
block_ptr.reset(new CBlock(*pblock)); |
|
|
|
|
|
|
|
|
|
|
|
CValidationState state; // Only used to report errors, not invalidity - ignore it
|
|
|
|
CValidationState state; // Only used to report errors, not invalidity - ignore it
|
|
|
|
if (!ActivateBestChain(state, chainparams, pblock)) |
|
|
|
if (!ActivateBestChain(state, chainparams, block_ptr)) |
|
|
|
return error("%s: ActivateBestChain failed", __func__); |
|
|
|
return error("%s: ActivateBestChain failed", __func__); |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|