Context
Summit checkpoint startup lets a node resume from checkpoint artifacts instead of replaying all prior history. The syncer needs the checkpoint block artifacts to continue block synchronization, and the finalizer needs the checkpoint epoch's finalized header as the predecessor for future epoch-boundary headers.
Claim
Checkpoint startup passes the checkpoint finalized_header only to the syncer and never seeds it into finalizer storage. The broken invariant is that a checkpoint-joined finalizer can have no persisted predecessor finalized header, causing boundary aux-data generation to fall back to genesis instead of the checkpoint header.
A node operator starts from checkpoint artifacts that include a finalized_header, then the checkpoint-joined proposer reaches an epoch boundary before that header is seeded into finalizer storage; aux-data generation reads an empty finalized-header DB, falls back to genesis, and emits boundary blocks linked to the wrong prior header.
Flow
The path requires startup from checkpoint artifacts that include finalized_header, followed by proposing or building an epoch-boundary block before the finalizer DB has the checkpoint header seeded through another path.
Impact
A checkpoint-joined node can build future epoch-boundary headers whose prev_epoch_header_hash points to genesis rather than the checkpoint epoch header. Because boundary header-link verification is also weak, such headers can be accepted and make post-checkpoint finalized-header chains diverge from continuously running nodes.
Root Cause
Checkpoint import hands the finalized-header artifact to the syncer but not to finalizer storage, and boundary aux-data generation treats a missing finalized header as a genesis fallback.
Code
Related Issues/PRs
Related issues cover adjacent checkpoint startup, import, restart, finalized-header export, and response sizing consistency gaps.
Fix
- Seed the supplied checkpoint finalized header into the finalizer DB during checkpoint startup.
- Require consistency between checkpoint state, last block, and finalized header before seeding.
- Add an integration test that imports a checkpoint and verifies the next boundary header links to the checkpoint header.
Context
Summit checkpoint startup lets a node resume from checkpoint artifacts instead of replaying all prior history. The syncer needs the checkpoint block artifacts to continue block synchronization, and the finalizer needs the checkpoint epoch's finalized header as the predecessor for future epoch-boundary headers.
Claim
Checkpoint startup passes the checkpoint
finalized_headeronly to the syncer and never seeds it into finalizer storage. The broken invariant is that a checkpoint-joined finalizer can have no persisted predecessor finalized header, causing boundary aux-data generation to fall back to genesis instead of the checkpoint header.A node operator starts from checkpoint artifacts that include a
finalized_header, then the checkpoint-joined proposer reaches an epoch boundary before that header is seeded into finalizer storage; aux-data generation reads an empty finalized-header DB, falls back to genesis, and emits boundary blocks linked to the wrong prior header.Flow
The path requires startup from checkpoint artifacts that include
finalized_header, followed by proposing or building an epoch-boundary block before the finalizer DB has the checkpoint header seeded through another path.Impact
A checkpoint-joined node can build future epoch-boundary headers whose
prev_epoch_header_hashpoints to genesis rather than the checkpoint epoch header. Because boundary header-link verification is also weak, such headers can be accepted and make post-checkpoint finalized-header chains diverge from continuously running nodes.Root Cause
Checkpoint import hands the finalized-header artifact to the syncer but not to finalizer storage, and boundary aux-data generation treats a missing finalized header as a genesis fallback.
Code
SyncCheckpointfromcheckpoint_last_blockandcheckpoint_finalized_headerfor the syncer: https://github.com/SeismicSystems/summit/blob/ed2c5c8/node/src/engine.rs#L341.prev_header_hashfromget_most_recent_finalized_header, falling back to genesis when the DB is empty: https://github.com/SeismicSystems/summit/blob/ed2c5c8/finalizer/src/actor.rs#L944.finalized_headeras the finalized header for the checkpoint epoch: https://github.com/SeismicSystems/summit/blob/ed2c5c8/docs/checkpointing.md#L180.Related Issues/PRs
Related issues cover adjacent checkpoint startup, import, restart, finalized-header export, and response sizing consistency gaps.
Fix