mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-02-26 15:47:21 +00:00
Keeper is a zmvm guest program that runs the block transition. It relies on the zkvm maker implementing `getInput`. For now, we only provide a single implementation for the 'ziren' VM. Why keeper? In the _Mass Effect_ lore, the keepers are animals (?) who maintain the citadel. Nothing is known from them, and attempts at tampering with them have failed, as they self-destruct upon inquiry. They have a secret, nefarious purpose that is only revealed later in the game series, don't want any spoilers so I didn't dig deeper. All in all, a good metaphor for zkvms. --------- Co-authored-by: weilzkm <140377101+weilzkm@users.noreply.github.com> Co-authored-by: Felix Lange <fjl@twurst.com>
69 lines
1.8 KiB
Markdown
69 lines
1.8 KiB
Markdown
# 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:
|
|
|
|
```bash
|
|
# 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:
|
|
|
|
```bash
|
|
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
|
|
//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
|
|
}
|
|
```
|