refactor: remove non-pipelining sequencer code path#23665
Merged
Conversation
293ba4e to
63a747d
Compare
Proposer pipelining (build for slot+1, defer finalization to the next slot, build on the locally-proposed parent checkpoint) is now the only behavior of the production sequencer. Removes the SEQ_ENABLE_PROPOSER_PIPELINING env var / enableProposerPipelining config and every isProposerPipeliningEnabled() and pipeliningOffset() check, collapsing each to the pipelining path. The EpochCache always applies PROPOSER_PIPELINING_SLOT_OFFSET. The checkpoint timing model is consolidated to a single pipelined model (StandardCheckpointTimingModel deleted; the pipelining selector removed from createCheckpointTimingModel / calculateMaxBlocksPerSlot). Gossipsub maxBlocksPerSlot rises accordingly, now consistent with the always-pipelining sequencer. The test-only AutomineSequencer is preserved: it is selected by the separate useAutomineSequencer flag, publishes synchronously in-slot via sendRequests, and keeps passing pipeliningEnabled: false to getPreviousCheckpointOutHashes (the one retained parameter, with dedicated unit coverage). Checks for whether a proposed checkpoint exists (hasProposedCheckpoint, proposedCheckpointData) are kept. BREAKING CHANGE: SEQ_ENABLE_PROPOSER_PIPELINING removed; pipelining is always on. Also includes the benchmark pipelining-setup migration from #23647.
Rebased onto merge-train/spartan. Resolved the proposal_handler conflict (the own-proposal branch no longer re-pushes the proposed checkpoint, since the sequencer's checkpoint proposal job already does) and collapsed the isProposerPipeliningEnabled() guard the base branch newly added to syncProposedCheckpointToArchiver (pipelining is always on now). The refactor dropped the archiver's 'pipeliningOffset() === 0' guard on pruneOrphanProposedBlocks and hardcoded the offset, so the prune now runs unconditionally. The default e2e setup uses the non-pipelined automine sequencer, which publishes each checkpoint in-slot via two awaited archiver calls (addBlock then addProposedCheckpoint); the orphan prune raced between them, deleting the block before its checkpoint attached. Block 1 never landed and the whole e2e suite timed out in setup. Gate the prune behind a new enableOrphanProposedBlockPruning archiver flag, set false for the automine sequencer, restoring the pre-refactor behavior.
Collapse the missed getSlotContextInNextL1Slot branch to always apply PROPOSER_PIPELINING_SLOT_OFFSET (it still called the removed isProposerPipeliningEnabled(), breaking the build and crashing the work loop), and drop the stale enableProposerPipelining flag from epochs_partial_proof_multi_root.test.ts (removed from the config types).
63a747d to
5de117d
Compare
The env var was introduced in v5 (unreleased), so removing it requires no migration from v4 — there is no released version that ever exposed it.
- Build a pipelined job by default (targetSlot = slotNumber + offset) so the suite exercises the production slot shape, and add assertions that the target slot is threaded through the checkpoint constants, attestation signing, and L1 submission. - Mock the parent-checkpoint sync lookups in the top-level beforeEach so the always-pipelined submission path no longer spins in a real-clock retryUntil; this cuts the suite from ~250s to ~3s (the three attestation tests dropped from ~80s each). - Add a build-slot reservation assertion to the validator re-execution budget test so it checks the README guarantee, not just the permissive target-slot spillover deadline. - Rename the overflow test to describe its actual behavior (continues in the next sub-slot rather than skipping one).
The proposer now always builds for targetSlot = buildSlot + PROPOSER_PIPELINING_SLOT_OFFSET (getSlotContextInNextL1Slot no longer branches on a pipelining flag), but the test mocks still modelled targetSlot == buildSlot: the proposed block, canProposeAt, and the slasher/governance vote-slot assertions all used the build slot, so the proposer check bailed with 'Expected slot 2 but got 1' and 13 cases failed. Set newSlotNumber to the target slot (buildSlot + offset) so the block and canProposeAt report the target, and update the vote-slot assertions accordingly. The dead getTargetSlot / getTargetEpochAndSlotInNextL1Slot mocks (the sequencer derives the target from getEpochAndSlotInNextL1Slot) are realigned for clarity.
alexghr
approved these changes
Jun 1, 2026
danielntmd
pushed a commit
to danielntmd/aztec-packages
that referenced
this pull request
Jun 4, 2026
BEGIN_COMMIT_OVERRIDE chore: deploy next-net and reuse contracts (AztecProtocol#23761) chore: turn on autoscaling (AztecProtocol#23706) chore: rename staging-public to staging (AztecProtocol#23767) chore(p2p): use sync hash for tx validation hashing (AztecProtocol#23768) test(e2e): wait warmup slots in slashing tests (AztecProtocol#23719) feat(api)!: make getTxReceipt the single tx-lookup API (AztecProtocol#23660) fix: cap cloned n_tps fees within sponsored FPC balance (AztecProtocol#23770) fix: protect HA validator Postgres from cluster scale-down (AztecProtocol#23772) refactor: remove non-pipelining sequencer code path (AztecProtocol#23665) feat(archiver): add getL2ToL1MembershipWitness node RPC (AztecProtocol#23646) fix(p2p)!: revamp BLOCK_TXS validations (AztecProtocol#23778) chore: name the bots (AztecProtocol#23795) fix(e2e): ensure BBSync init (AztecProtocol#23793) fix(p2p)!: fix BLOCK_TXS response under proposer equivocation (AztecProtocol#23786) fix: reconnect L1 port-forward after epoch-boundary sleep in n_tps_prove (AztecProtocol#23800) chore: add empty vscode settings for yarn-project (AztecProtocol#23808) fix(sequencer): only warn about missing proposed checkpoint once overdue (AztecProtocol#23807) fix: refresh n_tps fee quotes during sustained benchmark (AztecProtocol#23797) fix(sequencer): enforce build-frame deadlines and align attestation/publish windows (AztecProtocol#23776) END_COMMIT_OVERRIDE
spalladino
added a commit
that referenced
this pull request
Jun 4, 2026
## Motivation `v5-next` was cut from `next` at cbc99df (Jun 1), so PRs merged to `merge-train/spartan` after the cut never flowed into it. This backports all of them (authored by @spalladino and @fcarreiro) to keep v5-next current with the spartan train. ## Approach Each PR is cherry-picked from its squashed merge commit on `merge-train/spartan`, in merge order, preserving the original commit message and PR number — one commit per backported PR. All 11 applied cleanly with no conflicts; patches are identical to the originals (verified via `git patch-id`), and `bootstrap.sh build yarn-project` passes on the result. Labeled `ci-no-squash` to preserve the per-PR commits. ## Backported PRs - #23768 — chore(p2p): use sync hash for tx validation hashing - #23719 — test(e2e): wait warmup slots in slashing tests - #23660 — feat(api)!: make getTxReceipt the single tx-lookup API - #23665 — refactor: remove non-pipelining sequencer code path - #23646 — feat(archiver): add getL2ToL1MembershipWitness node RPC - #23778 — fix(p2p)!: revamp BLOCK_TXS validations - #23786 — fix(p2p)!: fix BLOCK_TXS response under proposer equivocation - #23808 — chore: add empty vscode settings for yarn-project - #23807 — fix(sequencer): only warn about missing proposed checkpoint once overdue - #23776 — fix(sequencer): enforce build-frame deadlines and align attestation/publish windows - #23818 — chore(p2p): BlockTxsRequest comment Note #23660, #23778, and #23786 are breaking changes (node RPC + tx-effect db format, and p2p wire format respectively), as they were on `next`.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
Proposer pipelining (the proposer builds for
slot + 1while inslot, defers checkpoint finalization to the next slot, and builds on the locally-gossiped proposed parent checkpoint) was gated behindSEQ_ENABLE_PROPOSER_PIPELINING. Production already runs with it on and every non-trivial e2e suite opts in, so the dual on/off code path was dead weight — a duplicated timing model andif (isPipelining)branches scattered across the sequencer, validator, and p2p stack. This makes pipelining the only behavior of the production sequencer and removes the toggle.Fixes A-912
Fixes A-971
Approach
Removed the
enableProposerPipeliningconfig /SEQ_ENABLE_PROPOSER_PIPELININGenv var everywhere and dropped everyisProposerPipeliningEnabled()/pipeliningOffset()check, collapsing each to the pipelining branch (theEpochCachenow always appliesPROPOSER_PIPELINING_SLOT_OFFSET). The checkpoint timing model was consolidated to a single pipelined model. The test-onlyAutomineSequenceris preserved — it is selected by the separateuseAutomineSequencerflag, publishes synchronously in-slot, and is the one remaining caller of the non-pipelinedgetPreviousCheckpointOutHashesbranch. Checks for whether a proposed checkpoint exists (hasProposedCheckpoint/proposedCheckpointData) are kept.Changes
pipelining-config.ts; consolidatedtimetableto a singleCheckpointTimingModel(removedStandardCheckpointTimingModeland thepipeliningoption fromcreateCheckpointTimingModel/calculateMaxBlocksPerSlot); kept thepipeliningEnabledparam ongetPreviousCheckpointOutHashesfor automine, with new dedicated unit coverage.PipelineConfigmerges.isProposerPipeliningEnabled()/pipeliningOffset();getTargetSlot/getTargetEpochAndSlotInNextL1Slot/getTargetAndNextSlotalways apply the offset.SequencerTimetableno longer takes apipeliningflag;AutomineSequenceruntouched (boundary comment added).waitForBlockSourceSyncand the now-deadblock_source_not_syncedreason.maxBlocksPerSlotnow uses the pipelined timing model (a higher value), consistent with the always-pipelining sequencer.PIPELINING_SETUP_OPTS/AUTOMINE_E2E_OPTSand ~40 test sites;setup.tsallows empty checkpoints unconditionally.Note:
SEQ_ENABLE_PROPOSER_PIPELININGis a breaking change for node operators — see the migration note. Labeledci-no-fail-fastto survey the full suite.