Description
Overview
Hello developers.
I'm running a separate Pectra PoS testnet chain for API testing. During testing, I observed discrepancies in the JSON-RPC responses from execution clients—geth, besu, nethermind, reth and erigon. Specifically, when calling engine_newPayloadV4
with invalid request, Besu returns an validationError
error inside result
, while the other four clients respond with error code -32602
as defined in the spec.
"errors": [
{
"code": -32602,
"message": "Invalid params"
},
{
"code": -38005,
"message": "Unsupported fork"
}
],
Thanks for your time!
Steps to Reproduce
Call the engine_newPayloadV4
with:
curl POST -v http://127.0.0.1:8551 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_encoded_jwt_token" \
-d '{
"id": 1,
"jsonrpc": "2.0",
"method": "engine_newPayloadV4",
"params": [
{
"parentHash": "0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a",
"feeRecipient": "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
"stateRoot": "0xf59a05703abea35401387392e6c17290fb0384efa9edd72529513d30e58f5666",
"receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"prevRandao": "0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14",
"blockNumber": "0x112720f",
"gasLimit": "0x1c9c380",
"gasUsed": "0xbad2e8",
"timestamp": "0x681c9d13",
"extraData": "0x",
"baseFeePerGas": "0x7",
"blockHash": "0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858",
"transactions": [
"0x03f88f0780843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a0010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401401a0840650aa8f74d2b07f40067dc33b715078d73422f01da17abdbd11e02bbdfda9a04b2260f6022bf53eadb337b3e59514936f7317d872defb891a708ee279bdca90",
"0x03f88f0701843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001521d528ad0c760354a4f0496776cf14a92fe1fb5d50e959dcea1a489c7c83101a0a86c1fd8c2e74820686937f5c1bfe836e2fb622ac9fcbebdc4ab4357f2dbbc61a05c3b2b44ff8252f78d70aeb33f8ba09beaeadad1b376a57d34fa720bbc4a18ee",
"0x03f88f0702843b9aca008506fc23ac00830186a09400000000000000000000000000000000000001008080c001e1a001453362c360fdd8832e3539d463e6d64b2ee320ac6a08885df6083644a063e701a037a728aec08aefffa702a2ca620db89caf3e46ab7f25f7646fc951510991badca065d846f046357af39bb739b161233fce73ddfe0bb87f2d28ef60dfe6dbb0128d"
],
"withdrawals": [
{
"index": "0xf0",
"validatorIndex": "0xf0",
"address": "0x00000000000000000000000000000000000010f0",
"amount": "0x1"
},
{
"index": "0xf1",
"validatorIndex": "0xf1",
"address": "0x00000000000000000000000000000000000010f1",
"amount": "0x1"
}
],
"blobGasUsed": "0x0",
"excessBlobGas": "0x0"
},
[
"0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014"
],
"0x169630f535b4a41330164c6e5c92b1224c0c407f582d407d0ac3d206cd32fd52",
[
"0x96a96086cff07df17668f35f7418ef8798079167e3f4f9b72ecde17b28226137cf454ab1dd20ef5d924786ab3483c2f9003f5102dabe0a27b1746098d1dc17a5d3fbd478759fea9287e4e419b3c3cef20100000000000000b1acdb2c4d3df3f1b8d3bfd33421660df358d84d78d16c4603551935f4b67643373e7eb63dcb16ec359be0ec41fee33b03a16e80745f2374ff1d3c352508ac5d857c6476d3c3bcf7e6ca37427c9209f17be3af5264c0e2132b3dd1156c28b4e9f000000000000000a5c85a60ba2905c215f6a12872e62b1ee037051364244043a5f639aa81b04a204c55e7cc851f29c7c183be253ea1510b001db70c485b6264692f26b8aeaab5b0c384180df8e2184a21a808a3ec8e86ca01000000000000009561731785b48cf1886412234531e4940064584463e96ac63a1a154320227e333fb51addc4a89b7e0d3f862d7c1fd4ea03bd8eb3d8806f1e7daf591cbbbb92b0beb74d13c01617f22c5026b4f9f9f294a8a7c32db895de3b01bee0132c9209e1f100000000000000",
"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b85103a5617937691dfeeb89b86a80d5dc9e3c9d3a1a0e7ce311e26e0bb732eabaa47ffa288f0d54de28209a62a7d29d0000000000000000000000000000000000000000000000000000010f698daeed734da114470da559bd4b4c7259e1f7952555241dcbc90cf194a2ef676fc6005f3672fada2a3645edb297a75530100000000000000",
"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b85103a5617937691dfeeb89b86a80d5dc9e3c9d3a1a0e7ce311e26e0bb732eabaa47ffa288f0d54de28209a62a7d29d098daeed734da114470da559bd4b4c7259e1f7952555241dcbc90cf194a2ef676fc6005f3672fada2a3645edb297a7553"
]
]
}'
Expected behavior: [What you expect to happen]
Return -32602
for invalid params as defined in the spec.
This is the response of geth for reference.
{"error": {"code": -32602, "data": {"err": "invalid request order: [169 79 83 116 252 229 237 188 142 42 134 151 193 83 49 103 126 110 191 11 133 16 58 86 23 147 118 145 223 238 184 155 134 168 13 93 201 227 201 211 161 160 231 206 49 30 38 224 187 115 46 171 170 71 255 162 136 240 213 77 226 130 9 166 42 125 41 208 152 218 238 215 52 218 17 68 112 218 85 155 212 180 199 37 158 31 121 82 85 82 65 220 188 144 207 25 74 46 246 118 252 96 5 243 103 47 173 162 163 100 94 219 41 122 117 83]"}, "message": "Invalid parameters"}, "id": 1, "jsonrpc": "2.0"}
Actual behavior: [What actually happens]
{"id": 1, "jsonrpc": "2.0", "result": {"latestValidHash": null, "status": "INVALID", "validationError": "Invalid execution requests"}}
Frequency: [What percentage of the time does it occur?]
Always.
Logs
Results from 5 EL clients.
{"id": 1, "jsonrpc": "2.0", "result": {"latestValidHash": null, "status": "INVALID", "validationError": "Invalid execution requests"}} # besu
{"error": {"code": -32602, "data": {"err": "invalid request order: [169 79 83 116 252 229 237 188 142 42 134 151 193 83 49 103 126 110 191 11 133 16 58 86 23 147 118 145 223 238 184 155 134 168 13 93 201 227 201 211 161 160 231 206 49 30 38 224 187 115 46 171 170 71 255 162 136 240 213 77 226 130 9 166 42 125 41 208 152 218 238 215 52 218 17 68 112 218 85 155 212 180 199 37 158 31 121 82 85 82 65 220 188 144 207 25 74 46 246 118 252 96 5 243 103 47 173 162 163 100 94 219 41 122 117 83]"}, "message": "Invalid parameters"}, "id": 1, "jsonrpc": "2.0"} # geth
{"error": {"code": -32602, "message": "Execution requests must not contain duplicates and be ordered by request_type in ascending order"}, "id": 1, "jsonrpc": "2.0"} # nethermind
{"error": {"code": -32602, "data": {"err": "Invalid params: DuplicatedExecutionRequestType"}, "message": "Invalid params"}, "id": 1, "jsonrpc": "2.0"} # reth
{"error": {"code": -32602, "message": "Invalid Request at index 2"}, "id": 1, "jsonrpc": "2.0"} # erigon
Versions
- OS Name & Version: Ubuntu-20.04
Client versions
- Besu/v25.4.1/linux-x86_64/openjdk-java-21
- Geth/v1.15.12-unstable-3e356d69-20250507/linux-amd64/go1.24.3
- Nethermind/v1.32.0-unstable+ff9befb5/linux-x64/dotnet9.0.4
- Reth/v1.3.12-6f8e725/x86_64-unknown-linux-gnu
- Erigon/3.1.0/linux-amd64/go1.24.1
with
- Prysm/v6.0.0 (linux amd64)