Description
Overview
Hello developers.
I'm running an Ethereum mainnet node using geth-1.15.9 and Prysm-6.0.0, as well as a separate testnet chain for API testing. While testing, I noticed that the JSON-RPC responses of engine_forkchoiceUpdatedV3
from geth, besu, nethermind, and reth diverge.
According to the execution-api, payloadStatus
is expected to return latestValidHash
, status
, and validationError
. However, Geth includes an additional witness
field in its response.
System information
Geth version: geth version 1.15.9-stable-74165a8f
CL client & version: e.g. Prysm/v6.0.0 (linux amd64)
OS & Version: Ubuntu 20.04
Expected behaviour
Return only three attributes as other clients.
Actual behaviour
# geth
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null, "witness": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null, "witness": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null, "witness": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null, "witness": null}}}
# besu
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
# nethermind
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
# reth
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
{"id": 1, "jsonrpc": "2.0", "result": {"payloadId": null, "payloadStatus": {"latestValidHash": null, "status": "SYNCING", "validationError": null}}}
Steps to reproduce the behaviour
Expost engine api and call engine_forkchoiceUpdatedV3
:
curl localhost:port-X POST -H "Content-Type: application/json" -d '{"id":1,"jsonrpc":"2.0","method":"engine_forkchoiceUpdatedV3","params":[{"headBlockHash":"0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858","safeBlockHash":"0x3559e851470f6e7bbed1db474980683e8c315bfce99b2a6ef47c057c04de7858","finalizedBlockHash":"0x3b8fb240d288781d4aac94d3fd16809ee413bc99294a085798a589dae51ddd4a"},{"timestamp":"0x64e7785b","prevRandao":"0xc130d5e63c61c935f6089e61140ca9136172677cf6aa5800dcc1cf0a02152a14","suggestedFeeRecipient":"0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b","withdrawals":[{"index":"0xf0","validatorIndex":"0xf0","address":"0x00000000000000000000000000000000000010f0","amount":"0x1"},{"index":"0xf1","validatorIndex":"0xf1","address":"0x00000000000000000000000000000000000010f1","amount":"0x1"}],"parentBeaconBlockRoot":"0x11f780a954bcba8889998e4e61deaae6388dd2391e9c810bd9c94962cc1eadc1"}]}' | jq
Backtrace
Spec in execution-apis.
RestrictedPayloadStatusV1:
$ref: '#/components/schemas/PayloadStatusV1'
properties:
status:
$ref: '#/components/schemas/PayloadStatusV1/properties/status'
description: Set of possible values is restricted to VALID, INVALID, SYNCING
enum:
- VALID
- INVALID
- SYNCING
latestValidHash:
$ref: '#/components/schemas/PayloadStatusV1/properties/latestValidHash'
validationError:
$ref: '#/components/schemas/PayloadStatusV1/properties/validationError'
Related implementations at:
go-ethereum/beacon/engine/types.go
Lines 132 to 137 in a511553