feat: per-block L1-to-L2 message bundles, move parity to checkpoint root (A-1374)#24603
Open
spalladino wants to merge 6 commits into
Open
feat: per-block L1-to-L2 message bundles, move parity to checkpoint root (A-1374)#24603spalladino wants to merge 6 commits into
spalladino wants to merge 6 commits into
Conversation
…oot (A-1374) Implements AZIP-22 Fast Inbox FI-04. Parity verification moves from the block-root variants to the checkpoint root. Every block-root variant now takes a per-block message bundle (l1_to_l2_messages, num_msgs, frontier hint) that appends to the L1-to-L2 tree via append_leaves_to_snapshot and absorbs the same leaves into an L1ToL2MessageSponge threaded across the checkpoint's blocks. BlockRollupPublicInputs replaces in_hash and the FI-03 inbox_rolling_hash pair with an explicit is_first_block flag and start/end message sponges. The checkpoint root gains the parity-root proof, asserts sponge continuity and that the merged block sponge equals the parity sponge, and sources the header's legacy in_hash and inbox_rolling_hash from parity. Transitionally the first block carries the whole checkpoint's messages padded to 1024 with num_msgs=1024; non-first blocks carry empty bundles. Behavior stays bit-identical to the current state (same tree roots, same header bytes).
…undle change (A-1374)
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.
Stacked on #24600 (A-1373). AZIP-22 Fast Inbox, FI-04.
What
Moves parity verification from the block-root circuits to the checkpoint root, and gives every block-root variant a per-block L1→L2 message bundle. This gets the circuit structure right for per-block messages while keeping behavior bit-identical to today — the flip to compact per-block distribution (FI-14) becomes a constant change plus padding removal, not a circuit restructure.
Circuits (noir)
l1_to_l2_messages,num_msgs, frontier hint) and append it to the L1→L2 tree viaappend_leaves_to_snapshot(the A-1372 gadget), absorbing the same leaves into anL1ToL2MessageSponge(Poseidon2) threaded across the checkpoint's blocks. First-block variants lose the parity-root proof.BlockRollupPublicInputsdropsin_hashand the FI-03inbox_rolling_hashpair; gainsis_first_block: boolandstart_msg_sponge/end_msg_sponge.is_first_blocktakes overin_hash's former structural role (leftmost asserted true at the checkpoint root, every right rollup asserted false at merge) and drives the block-end blob-absorb flag.is_first_blockandstart_msg_spongefrom the left,end_msg_spongefrom the right;validate_consecutive_block_rollupsasserts!right.is_first_blockandright.start_msg_sponge == left.end_msg_sponge.parity.start_sponge == emptyandmerged.end_msg_sponge == parity.end_sponge(the "blocks inserted exactly the parity-committed list, in order" check — no leaf arrays cross a circuit boundary), and sources the header'sin_hash = parity.sha_rootandinbox_rolling_hash = parity.end_rolling_hash.TypeScript
stdlib/src/messaging/l1_to_l2_message_sponge.tsmirrors the noir sponge (iv-0, absorb-only). Parity/block/checkpoint-root inputs andconversion/server.tsmirror the field changes.block-proving-state.tstocheckpoint-proving-state.ts; the sub-tree enqueues parity once per checkpoint and surfaces it inSubTreeResult; block roots no longer gate on parity. Transitional wiring: first block carries the checkpoint's messages padded to 1024 (num_msgs=1024), non-first blocks carry empty bundles inheriting the checkpoint sponge.Constants
L1_TO_L2_MESSAGE_SPONGE_LENGTH = 10;BLOCK_ROLLUP_PUBLIC_INPUTS_LENGTH58 → 76. Circuit ABIs changed, sopinned-build.tar.gzis regenerated and committed.Testing
rollup_lib386 passed (adds sponge-threading,is_first_blockstructural, and checkpoint-root parity/sponge-mismatch failure cases); transitional equivalence held (append_matches_subtree_insert_1024, unchanged checkpoint-header fixtures).yarn build,yarn lint/format, forge, orchestrator suites (15), and touched stdlib suites (22) all green.l1_to_l2e2e: the real send+consume path (the new per-block bundle circuit path) works; the suite's only two cases are the duplicate re-consumption ones, which hit a pre-existing PXE nullifier-sync issue registered flaky in.test_patterns.yml, unrelated to this change.is_first_blocksoundness, header sourcing/continuity, the blob-flag derivation, and TS↔noir serde order.