|
|
|
@ -1593,7 +1593,7 @@ static int64_t nTimeIndex = 0;
@@ -1593,7 +1593,7 @@ static int64_t nTimeIndex = 0;
|
|
|
|
|
static int64_t nTimeCallbacks = 0; |
|
|
|
|
static int64_t nTimeTotal = 0; |
|
|
|
|
|
|
|
|
|
bool ConnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool fJustCheck) |
|
|
|
|
bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool fJustCheck) |
|
|
|
|
{ |
|
|
|
|
AssertLockHeld(cs_main); |
|
|
|
|
// Check it again in case a previous version let a bad block in
|
|
|
|
@ -2573,6 +2573,30 @@ bool ProcessNewBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDis
@@ -2573,6 +2573,30 @@ bool ProcessNewBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDis
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool TestBlockValidity(CValidationState &state, const CBlock& block, CBlockIndex * const pindexPrev, bool fCheckPOW, bool fCheckMerkleRoot) |
|
|
|
|
{ |
|
|
|
|
AssertLockHeld(cs_main); |
|
|
|
|
assert(pindexPrev == chainActive.Tip()); |
|
|
|
|
|
|
|
|
|
CCoinsViewCache viewNew(pcoinsTip); |
|
|
|
|
CBlockIndex indexDummy(block); |
|
|
|
|
indexDummy.pprev = pindexPrev; |
|
|
|
|
indexDummy.nHeight = pindexPrev->nHeight + 1; |
|
|
|
|
|
|
|
|
|
// NOTE: CheckBlockHeader is called by CheckBlock
|
|
|
|
|
if (!ContextualCheckBlockHeader(block, state, pindexPrev)) |
|
|
|
|
return false; |
|
|
|
|
if (!CheckBlock(block, state, fCheckPOW, fCheckMerkleRoot)) |
|
|
|
|
return false; |
|
|
|
|
if (!ContextualCheckBlock(block, state, pindexPrev)) |
|
|
|
|
return false; |
|
|
|
|
if (!ConnectBlock(block, state, &indexDummy, viewNew, true)) |
|
|
|
|
return false; |
|
|
|
|
assert(state.IsValid()); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|