docs / engine-api

Engine API

Podseq acts as the consensus client driving Reth over the Ethereum Engine API: the same JSON-RPC interface an Ethereum consensus client uses to drive an execution client. All calls are JWT-authenticated on port 8551.

Authentication#

Generate a shared 32-byte secret and give both sides the same file:

openssl rand -hex 32 > jwt.hex
  • Reth: --authrpc.jwtsecret jwt.hex
  • Podseq: --reth.jwt jwt.hex

Ports#

Port Purpose
8545 JSON-RPC (public)
8551 Engine API (authenticated)

Block production cycle#

Podseq                                     Reth
   │                                          │
   │  1. engine_forkchoiceUpdatedV3           │
   │     (headBlockHash, payloadAttributes)   │
   │─────────────────────────────────────────►│
   │                                          │
   │  2. {payloadId}                          │
   │◄─────────────────────────────────────────│
   │                                          │
   │  3. engine_getPayloadV4(payloadId)       │
   │─────────────────────────────────────────►│
   │                                          │
   │  4. {executionPayload, blockValue}       │
   │◄─────────────────────────────────────────│
   │                                          │
   │  [Podseq broadcasts to P2P, submits DA]  │
   │                                          │
   │  5. engine_newPayloadV4(executionPayload)│
   │─────────────────────────────────────────►│
   │                                          │
   │  6. {status: VALID}                      │
   │◄─────────────────────────────────────────│
   │                                          │
   │  7. engine_forkchoiceUpdatedV3           │
   │     (newHeadBlockHash)                   │
   │─────────────────────────────────────────►│

Methods#

engine_forkchoiceUpdatedV3#

Updates fork choice and optionally starts building a new block.

{
  "method": "engine_forkchoiceUpdatedV3",
  "params": [
    {
      "headBlockHash": "0x...",
      "safeBlockHash": "0x...",
      "finalizedBlockHash": "0x..."
    },
    {
      "timestamp": "0x...",
      "prevRandao": "0x...",
      "suggestedFeeRecipient": "0x...",
      "withdrawals": [],
      "parentBeaconBlockRoot": "0x..."
    }
  ]
}

Response:

{
  "payloadStatus": { "status": "VALID", "latestValidHash": "0x..." },
  "payloadId": "0x..."
}

engine_getPayloadV4#

Retrieves a built payload by its payloadId.

{
  "method": "engine_getPayloadV4",
  "params": ["0x...payloadId"]
}

engine_newPayloadV4#

Validates and executes a payload.

{
  "method": "engine_newPayloadV4",
  "params": [
    { "executionPayload": "..." },
    ["0x...versionedHashes"],
    "0x...parentBeaconBlockRoot",
    []
  ]
}

Status codes#

Status Meaning
VALID Payload is valid
INVALID Payload is invalid
SYNCING Node is syncing
ACCEPTED Payload accepted, not yet validated