Cancun engine_newPayloadV3 §1, inherited by V4/V5/V6: "MUST check that provided set of parameters and their fields strictly matches the expected one and return -32602 … Any field having null value MUST be considered as not provided." #13714 covers withdrawals/blobGasUsed/excessBlobGas. The rule is still unenforced for the rest of the payload surface:
transactions is not null-checked anywhere on the V3+ path (ExecutionPayloadParams.ValidateEngineApiVersionParams checks withdrawals, blockAccessList, slotNumber and blobVersionedHashes presence only). A null/missing transactions falls through to TryGetTransactions/TryGetBlock and surfaces as INVALID or an internal error instead of -32602.
- Base
ExecutionPayload scalar fields (parentHash, feeRecipient, stateRoot, receiptsRoot, logsBloom, prevRandao, blockNumber, gasLimit, gasUsed, timestamp, extraData, baseFeePerGas, blockHash) carry no [JsonRequired] and non-nullable defaults (= Keccak.Zero, = [], …), so a missing key deserializes to the default and fails later as INVALID (hash mismatch) instead of -32602.
[JsonRequired] present-but-null semantics (V3 blobGasUsed/excessBlobGas, V4 blockAccessList/slotNumber): verify System.Text.Json rejects explicit JSON null the same as a missing key for each — the STJ required-check is the only gate for those fields and its null treatment must match "counts as not provided".
Suggest one pass over every field of ExecutionPayload V1–V4 shapes (plus the sidecar params) against the rule, with per-field error-code tests. Related: #13714 (the three named fields), #13712 (fork windows).
Spec: cancun.md – engine_newPayloadV3 §1.
Found in the Glamsterdam EIP-7732 ePBS EL-surface audit (sec4 scan).
Cancun
engine_newPayloadV3§1, inherited by V4/V5/V6: "MUST check that provided set of parameters and their fields strictly matches the expected one and return-32602… Any field havingnullvalue MUST be considered as not provided." #13714 coverswithdrawals/blobGasUsed/excessBlobGas. The rule is still unenforced for the rest of the payload surface:transactionsis not null-checked anywhere on the V3+ path (ExecutionPayloadParams.ValidateEngineApiVersionParamschecks withdrawals, blockAccessList, slotNumber and blobVersionedHashes presence only). Anull/missingtransactionsfalls through toTryGetTransactions/TryGetBlockand surfaces asINVALIDor an internal error instead of-32602.ExecutionPayloadscalar fields (parentHash,feeRecipient,stateRoot,receiptsRoot,logsBloom,prevRandao,blockNumber,gasLimit,gasUsed,timestamp,extraData,baseFeePerGas,blockHash) carry no[JsonRequired]and non-nullable defaults (= Keccak.Zero,= [], …), so a missing key deserializes to the default and fails later asINVALID(hash mismatch) instead of-32602.[JsonRequired]present-but-null semantics (V3blobGasUsed/excessBlobGas, V4blockAccessList/slotNumber): verify System.Text.Json rejects explicit JSONnullthe same as a missing key for each — the STJ required-check is the only gate for those fields and its null treatment must match "counts as not provided".Suggest one pass over every field of
ExecutionPayloadV1–V4 shapes (plus the sidecar params) against the rule, with per-field error-code tests. Related: #13714 (the three named fields), #13712 (fork windows).Spec: cancun.md – engine_newPayloadV3 §1.
Found in the Glamsterdam EIP-7732 ePBS EL-surface audit (sec4 scan).