| 3483 | } |
| 3484 | |
| 3485 | bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex** ppindex) |
| 3486 | { |
| 3487 | const CChainParams& chainparams = Params(); |
| 3488 | AssertLockHeld(cs_main); |
| 3489 | // Check for duplicate |
| 3490 | uint256 hash = block.GetHash(); |
| 3491 | BlockMap::iterator miSelf = mapBlockIndex.find(hash); |
| 3492 | CBlockIndex *pindex = NULL; |
| 3493 | if (miSelf != mapBlockIndex.end()) { |
| 3494 | // Block header is already known. |
| 3495 | pindex = miSelf->second; |
| 3496 | if (ppindex) |
| 3497 | *ppindex = pindex; |
| 3498 | if (pindex->nStatus & BLOCK_FAILED_MASK) |
| 3499 | return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate"); |
| 3500 | return true; |
| 3501 | } |
| 3502 | |
| 3503 | if (!CheckBlockHeader(block, state)) |
| 3504 | return false; |
| 3505 | |
| 3506 | // Get prev block index |
| 3507 | CBlockIndex* pindexPrev = NULL; |
| 3508 | if (hash != chainparams.GetConsensus().hashGenesisBlock) { |
| 3509 | BlockMap::iterator mi = mapBlockIndex.find(block.hashPrevBlock); |
| 3510 | if (mi == mapBlockIndex.end()) |
| 3511 | return state.DoS(10, error("%s: prev block not found", __func__), 0, "bad-prevblk"); |
| 3512 | pindexPrev = (*mi).second; |
| 3513 | if (pindexPrev->nStatus & BLOCK_FAILED_MASK) |
| 3514 | return state.DoS(100, error("%s: prev block invalid", __func__), REJECT_INVALID, "bad-prevblk"); |
| 3515 | } |
| 3516 | |
| 3517 | if (!ContextualCheckBlockHeader(block, state, pindexPrev)) |
| 3518 | return false; |
| 3519 | |
| 3520 | if (pindex == NULL) |
| 3521 | pindex = AddToBlockIndex(block); |
| 3522 | |
| 3523 | if (ppindex) |
| 3524 | *ppindex = pindex; |
| 3525 | |
| 3526 | return true; |
| 3527 | } |
| 3528 | |
| 3529 | bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex, bool fRequested, const CDiskBlockPos* dbp) |
| 3530 | { |
no test coverage detected