Skip to content

Extra witness field in engine_forkchoiceUpdatedV3 response #31737

Closed
@Alleysira

Description

@Alleysira

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:

type PayloadStatusV1 struct {
Status string `json:"status"`
Witness *hexutil.Bytes `json:"witness"`
LatestValidHash *common.Hash `json:"latestValidHash"`
ValidationError *string `json:"validationError"`
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions