Skip to content

engine: drop fcU v4 from SSZ_CAPABILITIES until ELs ship target_gas_limit#6

Closed
barnabasbusa wants to merge 1 commit into
mainfrom
bbusa/drop-fcu-v4-ssz-until-el-support
Closed

engine: drop fcU v4 from SSZ_CAPABILITIES until ELs ship target_gas_limit#6
barnabasbusa wants to merge 1 commit into
mainfrom
bbusa/drop-fcu-v4-ssz-until-el-support

Conversation

@barnabasbusa

Copy link
Copy Markdown
Collaborator

Summary

  • Stop advertising POST /engine/v4/forkchoice in SSZ_CAPABILITIES so engine_forkchoiceUpdatedV4 falls back to JSON-RPC for Gloas/Amsterdam.
  • Fixes Engine API error 400: Malformed SSZ body on every fcU at slot transition once Gloas is active.
  • All other SSZ endpoints (newPayload, getPayload, fcU v1/v2/v3, blobs, etc.) stay advertised — only the broken v4 fcU endpoint is removed.

Why

We added target_gas_limit: uint64 to PayloadAttributesV4 SSZ container in 0a1418b ("plumb target_gas_limit through PayloadAttributesV4 (alpha 8)") to match execution-apis PR #796 (JSON spec landed as a22fbd4).

But the SSZ-encoding spec on execution-apis PR #764 only just got the matching container change (commit 949d6a8 on bbusa/ssz). EL implementations (nethermind glamsterdam-devnet-4, geth) still decode PayloadAttributesV4 with the old 6-field layout — our 8 extra trailing bytes shift the inner withdrawals offset and the EL replies 400 Malformed SSZ body.

JSON-RPC tolerates unknown fields, so the alpha-8 targetGasLimit still reaches the EL on the JSON path — it's just ignored for now until ELs ship support.

How to undo

Re-add \"POST /engine/v4/forkchoice\" to SSZ_CAPABILITIES once:

Test plan

  • Run kurtosis enclave with consensoor + nethermind/geth on Gloas — fcU v4 over JSON-RPC succeeds, no more Malformed SSZ body
  • Confirm targetGasLimit still appears in the JSON-RPC fcU body (already gated on the gloas fork epoch in node.py:1371)
  • All other SSZ endpoints still negotiate (check the Engine SSZ transport negotiated: N endpoints log line)

…imit

PayloadAttributesV4 gained `target_gas_limit: uint64` in
execution-apis PR #796 (commit a22fbd4, JSON spec) and we plumbed
the field through in 0a1418b ("plumb target_gas_limit through
PayloadAttributesV4 (alpha 8)").

The SSZ-encoding spec on PR #764 only just gained the matching
container update on the `bbusa/ssz` branch, and EL implementations
(nethermind glamsterdam-devnet-4 SSZ wire, geth) still decode
PayloadAttributesV4 with the old 6-field layout. Our 8 extra trailing
bytes shift the inner withdrawals offset and the EL replies
`400 Malformed SSZ body` for every fcU at slot transition once Gloas
is active.

Workaround: stop advertising `POST /engine/v4/forkchoice` so fcU v4
falls back to JSON-RPC. JSON tolerates the unknown `targetGasLimit`
field today, so the alpha-8 value still reaches the EL — it's just
ignored for now. All other SSZ endpoints (newPayload, getPayload,
fcU v1/v2/v3, blobs, etc.) stay advertised.

Re-add the line once nethermind PR #11646 lands and a matching
geth change ships.
@qu0b-reviewer

qu0b-reviewer Bot commented May 18, 2026

Copy link
Copy Markdown

🤖 qu0b-reviewer

Clean diff, well-scoped. No issues found.

The PR drops "POST /engine/v4/forkchoice" from SSZ_CAPABILITIES so the fork -> forkchoice_updated_v4 dispatch falls through to the JSON-RPC path (engine_forkchoiceUpdatedV4) — which is correct: the EL accepts JSON with the unknown targetGasLimit field, so the target_gas_limit config value still reaches the EL via JSON. All other v4 SSZ endpoints (/engine/v4/payloads, /engine/v5/payloads/{id})… are unaffected and stay advertised. Tracing the call chain confirms no silent breakage. 🦋


Reviewed @ e0ca7b8d
"Every system eventually becomes legacy."

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant