go-ethereum/cmd/keeper
Jonny Rhea c709c19b40
eth/catalyst: add initial OpenTelemetry tracing for newPayload (#33521)
This PR adds initial OpenTelemetry tracing to the Engine API, focusing
on engine_newPayload*.

```
jsonrpc.engine/newPayloadV4 
|  |- engine.newPayload  [block.number, block.hash, tx.count]
|     |- core.blockchain.InsertBlockWithoutSetHead
|        |- bc.processor.Process
|        |  |- core.ApplyTransactionWithEVM  [tx.hash, tx.index]
|        |  |- core.ApplyTransactionWithEVM  [tx.hash, tx.index]
|        |  |- ...  (one per transaction)
|        |  |- core.postExecution
|        |- bc.validator.ValidateState
```

---------

Co-authored-by: Felix Lange <fjl@twurst.com>
2026-02-17 17:08:57 +01:00
..
1192c3_block.rlp cmd/keeper: add the keeper zkvm guest program (#32543) 2025-09-15 19:47:41 +02:00
1192c3_witness.rlp cmd/keeper: add the keeper zkvm guest program (#32543) 2025-09-15 19:47:41 +02:00
chainconfig.go cmd/keeper: add the keeper zkvm guest program (#32543) 2025-09-15 19:47:41 +02:00
getpayload_example.go cmd/keeper: add the keeper zkvm guest program (#32543) 2025-09-15 19:47:41 +02:00
getpayload_wasm.go cmd/keeper: export getInput in wasm builds (#33686) 2026-01-28 09:50:15 +08:00
getpayload_ziren.go cmd/keeper: use the ziren keccak precompile (#32816) 2025-10-20 11:52:02 +02:00
go.mod eth/catalyst: add initial OpenTelemetry tracing for newPayload (#33521) 2026-02-17 17:08:57 +01:00
go.sum eth/catalyst: add initial OpenTelemetry tracing for newPayload (#33521) 2026-02-17 17:08:57 +01:00
main.go eth/catalyst: add initial OpenTelemetry tracing for newPayload (#33521) 2026-02-17 17:08:57 +01:00
README.md cmd/keeper: add the keeper zkvm guest program (#32543) 2025-09-15 19:47:41 +02:00
stubs.go cmd/keeper: export getInput in wasm builds (#33686) 2026-01-28 09:50:15 +08:00

Keeper - geth as a zkvm guest

Keeper command is a specialized tool for validating stateless execution of Ethereum blocks. It's designed to run as a zkvm guest.

Overview

The keeper reads an RLP-encoded payload containing:

  • A block to execute
  • A witness with the necessary state data
  • A chainID

It then executes the block statelessly and validates that the computed state root and receipt root match the values in the block header.

Building Keeper

The keeper uses build tags to compile platform-specific input methods and chain configurations:

Example Implementation

See getpayload_example.go for a complete example with embedded Hoodi block data:

# Build example with different chain configurations
go build -tags "example" ./cmd/keeper

Ziren zkVM Implementation

Build for the Ziren zkVM platform, which is a MIPS ISA-based zkvm:

GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build -tags "ziren" ./cmd/keeper

As an example runner, refer to https://gist.github.com/gballet/7b669a99eb3ab2b593324e3a76abd23d

Creating a Custom Platform Implementation

To add support for a new platform (e.g., "myplatform"), create a new file with the appropriate build tag:

1. Create getinput_myplatform.go

//go:build myplatform

package main

import (
    "github.com/ethereum/go-ethereum/params"
    // ... other imports as needed
)

// getInput returns the RLP-encoded payload
func getInput() []byte {
    // Your platform-specific code to retrieve the RLP-encoded payload
    // This might read from:
    // - Memory-mapped I/O
    // - Hardware registers
    // - Serial port
    // - Network interface
    // - File system

    // The payload must be RLP-encoded and contain:
    // - Block with transactions
    // - Witness with parent headers and state data

    return encodedPayload
}