Carry the builder's block access list on a Gloas submission - #570
Open
0w3n-d wants to merge 1 commit into
Open
Conversation
`to_lighthouse_gloas_payload` left the EIP-7928 list empty, so the envelope the relay broadcasts could never be valid. Only an execution client can produce the list, so it travels on the submission. A separate `SignedBidSubmissionGloas` rather than a fork-gated field: `Encode` is derived on `SignedBidSubmission`, so an extra field would change the bytes for every fork. Refuse Gloas with bid adjustments. Combining every extension with Gloas multiplies the wire shapes, and a testnet does not need adjustments. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Sep 2, 2026
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.
Issue: #561 (step 2 of 6)
What this PR does
Removes the
TODO(gloas)that made a valid envelope impossible.to_lighthouse_gloas_payloadsetblock_access_list: Default::default(), and atest asserted the result was empty — so any envelope the relay broadcast on a
real Gloas network would have carried an empty EIP-7928 list and been rejected.
Only an execution client can produce that list, so it now travels on the
submission and is threaded through to the conversion:
Lighthouse's
BlockAccessListisProgressiveVariableList<u8>— an opaqueencoded blob — so
BlockAccessListBytesmirrors none of its structure and usesthe existing
ssz_bytes_wrapper!macro.Two design decisions
A separate
SignedBidSubmissionGloas, not a fork-gated field.Encodeisderived on
SignedBidSubmission, so adding a field would change the wire bytesfor every fork and break existing builders. A flat extension type with
split()is exactly the existingSignedBidSubmissionWithAdjustmentsidiom.Gloas with bid adjustments is refused, explicitly. Combining each extension
with Gloas multiplies the wire shapes four ways. Adjustments are a BuilderNet
feature that a Gloas testnet does not need, and a clear
UnsupportedCombinationbeats decoding into the wrong shape. Gloas + merging data is deliberately left
to step 5, where the merge builder needs it.
What this PR deliberately does not do
No builder changes — nothing sends a block access list yet; that is step 4. The
merge path returns
Nonefor it.decode's return grew from a 3-tuple to a4-tuple (
DecodedParts), which is mechanical churn at 14 test sites and 3production ones, including a one-word fix in
crates/simulator/src/ssz_server.rsthat the workspace needs to compile — the reth simulator is otherwise untouched,
per #561.
Tests
9 new, written before the implementation and signed off first.
split()yields thebase and the list; the converted Gloas payload carries the submitted
list — this replaces the assertion that it was empty; an empty list still
converts; and the Gloas and Fulu shapes are mutually undecodable, so no
existing path can silently accept the wrong one.
unchanged, which is the compatibility guarantee; Gloas with adjustments is
refused.
payload; a gossiped entry has none, so Gloas cannot be served from one.
Whole workspace green: 25 suites. helix-types 40, helix-common 52,
helix-relay 129, helix-builder 151.
A flaw found on the way, not fixed here
BlobsBundle::random_for_testproduces one proof per blob whileDecoderequires 128, so a randomly generated submission cannot round-trip at all.
These tests use empty bundles and say so. Worth its own fix.
Reviewer checklist
lint,unit-test) is green