Skip to content

fix(sequencer): set own proposed checkpoint locally instead of via p2p loopback#23659

Merged
spalladino merged 1 commit into
merge-train/spartanfrom
spl/remove-notify-own-checkpoint
May 29, 2026
Merged

fix(sequencer): set own proposed checkpoint locally instead of via p2p loopback#23659
spalladino merged 1 commit into
merge-train/spartanfrom
spl/remove-notify-own-checkpoint

Conversation

@spalladino

@spalladino spalladino commented May 29, 2026

Copy link
Copy Markdown
Contributor

Motivation

The proposer relied on looping its own checkpoint proposal back through the p2p receive path to advance its local proposed-checkpoint tip before propagating. Under broadcastInvalidBlockProposal the broadcast checkpoint archive is deliberately corrupted, so the loopback handler's archive-based block lookup (getBlockData({ archive })) found nothing and retried until the next slot. By the time the proposer returned from broadcast, propagation had slipped past the p2p validator's stale window — producing intermittent failures (e.g. peers rejecting a late slot proposal).

Approach

The proposer's optimistic proposed-checkpoint tip is the proposer's own local state, so it is now set directly in the sequencer's checkpoint proposal job rather than via a p2p loopback. The job adds the proposed checkpoint to the archiver from local checkpoint data (block numbers and counts, never the possibly-corrupted broadcast archive) immediately before gossiping, failing closed if the local insert fails. Because every block is already added to the archiver's FIFO queue (and awaited) during block building, the checkpoint insert needs no retry. The notifyOwnCheckpointProposal loopback is removed entirely, so the path is identical whether p2p is enabled or not.

Changes

  • stdlib: New ProposedCheckpointSink interface alongside L2BlockSink.
  • sequencer-client: CheckpointProposalJob now pushes the proposed checkpoint to the archiver from local data before broadcast, gated on proposer pipelining and skipped when block-push is disabled (skipPushProposedBlocksToArchiver, fisherman mode); widened the sequencer/client l2BlockSource types to ProposedCheckpointSink.
  • p2p: Removed notifyOwnCheckpointProposal from the P2PService interface, the libp2p and dummy services, and the P2PClient.broadcastCheckpointProposal call site (own proposals are still stored in the attestation pool before propagation).
  • validator-client: The all-nodes own-proposal branch now skips validation and returns; removed the now-dead setProposedCheckpointFromBlocks and narrowed the archiver Pick.
  • tests: Added job tests (push-from-local-data and order-before-gossip, abort-on-push-failure, no-push-when-pipelining-disabled, fisherman) and a proposal_handler own-proposal test; removed the obsolete libp2p loopback test and the e2e slash-test stub; widened affected mock types.

…p loopback

The proposer looped its own checkpoint proposal back through the p2p receive
path before propagating it. Under broadcastInvalidBlockProposal the broadcast
archive is deliberately corrupted, so the loopback's archive-based block lookup
retried until the next slot, delaying propagation past the validator's stale
window and causing flakes.

The sequencer's checkpoint proposal job now advances its own proposed-checkpoint
tip directly from local checkpoint data (block numbers, not the broadcast
archive) before gossiping, and the own-proposal p2p loopback is removed.
@spalladino spalladino added the ci-no-fail-fast Sets NO_FAIL_FAST in the CI so the run is not aborted on the first failure label May 29, 2026
@spalladino spalladino enabled auto-merge (squash) May 29, 2026 15:55
@spalladino spalladino merged commit 69d7b58 into merge-train/spartan May 29, 2026
26 of 32 checks passed
@spalladino spalladino deleted the spl/remove-notify-own-checkpoint branch May 29, 2026 17:20
danielntmd pushed a commit to danielntmd/aztec-packages that referenced this pull request Jun 4, 2026
BEGIN_COMMIT_OVERRIDE
test(e2e): unskip pipelining related e2e tests (AztecProtocol#23642)
fix(archiver): prune blocks without proposed checkpoint by end of build
slot (AztecProtocol#23606)
test: migrate benchmarks to pipelining setup (AztecProtocol#23647)
fix(p2p): fall back to archiver in BLOCK_TXS response validation
(AztecProtocol#23624)
docs(slashing): align operator and slasher docs with AZIP-7 (AztecProtocol#23494)
fix(p2p): do not penalize peers that signal a missing block with Fr.ZERO
(AztecProtocol#23672)
chore: adjust metrics deployment (AztecProtocol#23676)
fix(cheat-codes): warpL2TimeAtLeastBy advances relative to leading clock
(AztecProtocol#23675)
chore: tighten node pool sizes (AztecProtocol#23678)
chore: remove archival nodes (AztecProtocol#23630)
chore: merge blob sink duties into RPC node (AztecProtocol#23631)
fix: sync avm-transpiler Cargo.lock with noir submodule (AztecProtocol#23683)
fix(spartan): set validator lag env vars in tps-scenario (AztecProtocol#23684)
fix: make world-state hash queries reorg-aware to close getWorldState
race (AztecProtocol#23677)
fix: pin noir submodule to next's version on merge-train/spartan
(AztecProtocol#23690)
fix: ensure image ref is used by bench runner (AztecProtocol#23682)
fix(ci): retry aztec-nr nargo dependency clone on transient network
flake (AztecProtocol#23653)
chore: run one-off jobs on network nodes (AztecProtocol#23701)
fix: simulate proposals inside target slot (AztecProtocol#23692)
chore: smaller eth-devnet (AztecProtocol#23704)
chore: enable testnet autoscaling (AztecProtocol#23705)
feat(api)!: redesign node log retrieval API around tag-based queries
(AztecProtocol#23625)
fix(sequencer): set own proposed checkpoint locally instead of via p2p
loopback (AztecProtocol#23659)
END_COMMIT_OVERRIDE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci-no-fail-fast Sets NO_FAIL_FAST in the CI so the run is not aborted on the first failure

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants