From e0ca7b8d637fb0aa60e789d1cee691b2193b3c7c Mon Sep 17 00:00:00 2001 From: Barnabas Busa Date: Mon, 18 May 2026 15:33:33 +0200 Subject: [PATCH] engine: drop fcU v4 from SSZ_CAPABILITIES until ELs ship target_gas_limit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- consensoor/engine/ssz_types.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/consensoor/engine/ssz_types.py b/consensoor/engine/ssz_types.py index 6671692..cf0603d 100644 --- a/consensoor/engine/ssz_types.py +++ b/consensoor/engine/ssz_types.py @@ -297,7 +297,11 @@ class ExchangeCapabilitiesResponse(Container): "POST /engine/v1/forkchoice", "POST /engine/v2/forkchoice", "POST /engine/v3/forkchoice", - "POST /engine/v4/forkchoice", + # "POST /engine/v4/forkchoice" intentionally omitted: PayloadAttributesV4 + # gained target_gas_limit (execution-apis PR #796) but the SSZ schema + # (PR #764) hadn't caught up, so EL SSZ decoders reject the 8-byte-longer + # body as "Malformed SSZ body". Re-add once nethermind/geth ship SSZ + # support for target_gas_limit. JSON-RPC fcU v4 tolerates the field. "POST /engine/v1/blobs", "POST /engine/v2/blobs", "POST /engine/v3/blobs",