| 2469 | }; |
| 2470 | |
| 2471 | static bool FinalizeBlockInternal(CValidationState &state, const CBlockIndex *pindex) |
| 2472 | // EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
| 2473 | { |
| 2474 | AssertLockHeld(cs_main); |
| 2475 | if (pindex->nStatus & BLOCK_FAILED_MASK) { |
| 2476 | // We try to finalize an invalid block. |
| 2477 | return state.Invalid(error("%s: Trying to finalize invalid block %s", |
| 2478 | __func__, pindex->GetBlockHash().ToString()), |
| 2479 | REJECT_INVALID, "finalize-invalid-block", |
| 2480 | "", ValidationInvalidReason::CACHED_INVALID); |
| 2481 | } |
| 2482 | |
| 2483 | // Check that the request is consistent with current finalization. |
| 2484 | if (pindexFinalized && !AreOnTheSameFork(pindex, pindexFinalized)) { |
| 2485 | return state.Invalid( |
| 2486 | error("%s: Trying to finalize block %s which conflicts " |
| 2487 | "with already finalized block", |
| 2488 | __func__, pindex->GetBlockHash().ToString()), |
| 2489 | REJECT_AGAINST_FINALIZED, "bad-fork-prior-finalized", |
| 2490 | "", ValidationInvalidReason::BLOCK_FINALIZATION); |
| 2491 | } |
| 2492 | |
| 2493 | if (IsBlockFinalized(pindex)) { |
| 2494 | // The block is already finalized. |
| 2495 | return true; |
| 2496 | } |
| 2497 | |
| 2498 | // We have a new block to finalize. |
| 2499 | pindexFinalized = pindex; |
| 2500 | return true; |
| 2501 | } |
| 2502 | |
| 2503 | static const CBlockIndex *FindBlockToFinalize(CBlockIndex *pindexNew) |
| 2504 | // EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
no test coverage detected