From f03f2b5aa8bd8763334b11548723f83251317f1c Mon Sep 17 00:00:00 2001 From: muzry Date: Thu, 19 Mar 2026 20:59:42 +0800 Subject: [PATCH 1/4] engine: return -38003 for FCUv2 payloadAttributes mismatch Signed-off-by: muzry --- .../methods/engine/AbstractEngineForkchoiceUpdated.java | 2 +- .../internal/methods/engine/EngineForkchoiceUpdatedV1.java | 5 +++++ .../methods/engine/EngineForkchoiceUpdatedV2Test.java | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdated.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdated.java index 6aa2918d2ee..3f0037ac1ae 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdated.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdated.java @@ -184,7 +184,7 @@ public JsonRpcResponse syncResponse(final JsonRpcRequestContext requestContext) if (!getWithdrawalsValidator( protocolSchedule.get(), newHead, maybePayloadAttributes.get().getTimestamp()) .validateWithdrawals(withdrawals)) { - return new JsonRpcErrorResponse(requestId, RpcErrorType.INVALID_WITHDRAWALS_PARAMS); + return new JsonRpcErrorResponse(requestId, getInvalidPayloadAttributesError()); } } diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV1.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV1.java index 6397afdda3c..bd920e88553 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV1.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV1.java @@ -57,4 +57,9 @@ protected boolean requireTerminalPoWBlockValidation() { protected RpcErrorType getInvalidParametersError() { return RpcErrorType.INVALID_PAYLOAD_ATTRIBUTES; } + + @Override + protected RpcErrorType getInvalidPayloadAttributesError() { + return RpcErrorType.INVALID_WITHDRAWALS_PARAMS; + } } diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV2Test.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV2Test.java index 4e4b3e4c023..a10c0337adf 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV2Test.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/EngineForkchoiceUpdatedV2Test.java @@ -93,6 +93,6 @@ protected String getMethodName() { @Override protected RpcErrorType expectedInvalidPayloadError() { - return RpcErrorType.INVALID_WITHDRAWALS_PARAMS; + return RpcErrorType.INVALID_PAYLOAD_ATTRIBUTES; } } From 811109e4af170d8cca1abc6eadeb55670193baef Mon Sep 17 00:00:00 2001 From: muzry Date: Mon, 30 Mar 2026 14:37:39 +0800 Subject: [PATCH 2/4] fix EngineForkchoiceUpdatedV1Test Signed-off-by: muzry --- .../methods/engine/AbstractEngineForkchoiceUpdatedTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdatedTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdatedTest.java index aff11e33535..83f78cabb00 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdatedTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/internal/methods/engine/AbstractEngineForkchoiceUpdatedTest.java @@ -240,7 +240,7 @@ public void shouldReturnValidWithoutFinalizedWithPayload() { var payloadParams = new EnginePayloadAttributesParameter( - String.valueOf(defaultPayloadTimestamp()), + String.valueOf(mockHeader.getTimestamp() + 1), Bytes32.fromHexStringLenient("0xDEADBEEF").toHexString(), Address.ECREC.toString(), null, @@ -431,7 +431,7 @@ public void shouldIgnoreUpdateToOldHeadAndNotPreparePayload() { var payloadParams = new EnginePayloadAttributesParameter( - String.valueOf(defaultPayloadTimestamp()), + String.valueOf(mockHeader.getTimestamp() + 1), Bytes32.fromHexStringLenient("0xDEADBEEF").toHexString(), Address.ECREC.toString(), null, @@ -483,7 +483,7 @@ public void shouldReturnInvalidIfPayloadTimestampNotGreaterThanHead() { mockHeader.getHash(), Hash.ZERO, mockParent.getHash()), Optional.of(payloadParams)); - assertInvalidForkchoiceState(resp, RpcErrorType.INVALID_PAYLOAD_ATTRIBUTES); + assertInvalidForkchoiceState(resp, expectedInvalidPayloadError()); verify(engineCallListener, times(1)).executionEngineCalled(); } From fe79db2dc5c887747048688f80ccb4f3b96870f1 Mon Sep 17 00:00:00 2001 From: muzry Date: Wed, 1 Apr 2026 15:21:31 +0800 Subject: [PATCH 3/4] fix to match v1 behavior Signed-off-by: muzry --- .../06_update_forkchoice_invalid_payload_attributes.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/acceptance-tests/tests/src/acceptanceTest/resources/jsonrpc/engine/paris/test-cases/06_update_forkchoice_invalid_payload_attributes.json b/acceptance-tests/tests/src/acceptanceTest/resources/jsonrpc/engine/paris/test-cases/06_update_forkchoice_invalid_payload_attributes.json index 4014e14a6ff..0ddf1cf0553 100644 --- a/acceptance-tests/tests/src/acceptanceTest/resources/jsonrpc/engine/paris/test-cases/06_update_forkchoice_invalid_payload_attributes.json +++ b/acceptance-tests/tests/src/acceptanceTest/resources/jsonrpc/engine/paris/test-cases/06_update_forkchoice_invalid_payload_attributes.json @@ -20,9 +20,9 @@ "jsonrpc": "2.0", "id": 67, "error": { - "code": -38003, - "message": "Invalid payload attributes" + "code": -32602, + "message": "Invalid withdrawals" } }, "statusCode": 200 -} \ No newline at end of file +} From 8281b41a02e91f95ee19dcfbc264d9f13ead711f Mon Sep 17 00:00:00 2001 From: muzry Date: Thu, 2 Apr 2026 21:52:58 +0800 Subject: [PATCH 4/4] test: align FCU invalid payload attribute expectations Signed-off-by: muzry --- ...5_shanghai_prepare_payload_invalid_null_withdrawals.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/acceptance-tests/tests/src/acceptanceTest/resources/jsonrpc/engine/shanghai/test-cases/05_shanghai_prepare_payload_invalid_null_withdrawals.json b/acceptance-tests/tests/src/acceptanceTest/resources/jsonrpc/engine/shanghai/test-cases/05_shanghai_prepare_payload_invalid_null_withdrawals.json index ec5e2251791..8af8a4d3911 100644 --- a/acceptance-tests/tests/src/acceptanceTest/resources/jsonrpc/engine/shanghai/test-cases/05_shanghai_prepare_payload_invalid_null_withdrawals.json +++ b/acceptance-tests/tests/src/acceptanceTest/resources/jsonrpc/engine/shanghai/test-cases/05_shanghai_prepare_payload_invalid_null_withdrawals.json @@ -20,9 +20,9 @@ "jsonrpc" : "2.0", "id" : 67, "error" : { - "code" : -32602, - "message" : "Invalid withdrawals" + "code" : -38003, + "message" : "Invalid payload attributes" } }, "statusCode" : 200 -} \ No newline at end of file +}