|
|
|
@ -2809,36 +2809,37 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc
@@ -2809,36 +2809,37 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc
|
|
|
|
|
uint256 hash = block.GetHash(); |
|
|
|
|
BlockMap::iterator miSelf = mapBlockIndex.find(hash); |
|
|
|
|
CBlockIndex *pindex = NULL; |
|
|
|
|
if (miSelf != mapBlockIndex.end()) { |
|
|
|
|
// Block header is already known.
|
|
|
|
|
pindex = miSelf->second; |
|
|
|
|
if (ppindex) |
|
|
|
|
*ppindex = pindex; |
|
|
|
|
if (pindex->nStatus & BLOCK_FAILED_MASK) |
|
|
|
|
return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate"); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
if (hash != chainparams.GetConsensus().hashGenesisBlock) { |
|
|
|
|
|
|
|
|
|
if (!CheckBlockHeader(block, state)) |
|
|
|
|
return false; |
|
|
|
|
if (miSelf != mapBlockIndex.end()) { |
|
|
|
|
// Block header is already known.
|
|
|
|
|
pindex = miSelf->second; |
|
|
|
|
if (ppindex) |
|
|
|
|
*ppindex = pindex; |
|
|
|
|
if (pindex->nStatus & BLOCK_FAILED_MASK) |
|
|
|
|
return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate"); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Get prev block index
|
|
|
|
|
CBlockIndex* pindexPrev = NULL; |
|
|
|
|
if (hash != chainparams.GetConsensus().hashGenesisBlock) { |
|
|
|
|
if (!CheckBlockHeader(block, state)) |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
// Get prev block index
|
|
|
|
|
CBlockIndex* pindexPrev = NULL; |
|
|
|
|
BlockMap::iterator mi = mapBlockIndex.find(block.hashPrevBlock); |
|
|
|
|
if (mi == mapBlockIndex.end()) |
|
|
|
|
return state.DoS(10, error("%s: prev block not found", __func__), 0, "bad-prevblk"); |
|
|
|
|
pindexPrev = (*mi).second; |
|
|
|
|
if (pindexPrev->nStatus & BLOCK_FAILED_MASK) |
|
|
|
|
return state.DoS(100, error("%s: prev block invalid", __func__), REJECT_INVALID, "bad-prevblk"); |
|
|
|
|
} |
|
|
|
|
assert(pindexPrev); |
|
|
|
|
if (fCheckpointsEnabled && !CheckIndexAgainstCheckpoint(pindexPrev, state, chainparams, hash)) |
|
|
|
|
return error("%s: CheckIndexAgainstCheckpoint(): %s", __func__, state.GetRejectReason().c_str()); |
|
|
|
|
|
|
|
|
|
if (!ContextualCheckBlockHeader(block, state, pindexPrev)) |
|
|
|
|
return false; |
|
|
|
|
assert(pindexPrev); |
|
|
|
|
if (fCheckpointsEnabled && !CheckIndexAgainstCheckpoint(pindexPrev, state, chainparams, hash)) |
|
|
|
|
return error("%s: CheckIndexAgainstCheckpoint(): %s", __func__, state.GetRejectReason().c_str()); |
|
|
|
|
|
|
|
|
|
if (!ContextualCheckBlockHeader(block, state, pindexPrev)) |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
if (pindex == NULL) |
|
|
|
|
pindex = AddToBlockIndex(block); |
|
|
|
|
|
|
|
|
|