Awesome
MergeMock
Experimental debug tooling, mocking the execution engine and consensus node for testing.
Quick Start
To get started, build mergemock
and download the genesis.json
.
$ wget https://gist.githubusercontent.com/lightclient/799c727e826483a2804fc5013d0d3e3d/raw/2e8824fa8d9d9b040f351b86b75c66868fb9b115/genesis.json
$ openssl rand -hex 32 | tr -d "\n" > jwt.hex
# Build
$ go build . mergemock
# Run mergemock with engine and consensus
$ ./mergemock engine
$ ./mergemock consensus --slot-time=4s
# Run mergemock with builder relay (which also starts the engine)
$ ./mergemock relay
$ ./mergemock consensus --slot-time=4s --builder=http://localhost:28545
Usage
engine
$ mergemock engine --help
Run a mock Execution Engine.
--slots-per-epoch Slots per epoch (default: 0) (type: uint64)
--datadir Directory to store execution chain data (empty for in-memory data) (type: string)
--genesis Genesis execution-config file (default: genesis.json) (type: string)
--listen-addr Address to bind RPC HTTP server to (default: 127.0.0.1:8551) (type: string)
--ws-addr Address to serve /ws endpoint on for websocket JSON-RPC (default: 127.0.0.1:8552) (type: string)
--cors List of allowable origins (CORS http header) (default: *) (type: stringSlice)
# log
Change logger configuration
--log.level Log level: trace, debug, info, warn/warning, error, fatal, panic. Capitals are accepted too. (default: info) (type: string)
--log.color Color the log output. Defaults to true if terminal is detected. (default: true) (type: bool)
--log.format Format the log output. Supported formats: 'text', 'json' (default: text) (type: string)
--log.timestamps Timestamp format in logging. Empty disables timestamps. (default: 2006-01-02T15:04:05Z07:00) (type: string)
# trace
Tracing options
--trace.enable enable tracing (default: false) (type: bool)
--trace.enable-memory enable memory capture (default: false) (type: bool)
--trace.disable-stack disable stack capture (default: false) (type: bool)
--trace.disable-storage disable storage capture (default: false) (type: bool)
--trace.enable-return-data enable return data capture (default: false) (type: bool)
--trace.debug print output during capture end (default: false) (type: bool)
--trace.limit maximum length of output, but zero means unlimited (default: 0) (type: int)
# timeout
Configure timeouts of the HTTP servers
--timeout.read Timeout for body reads. None if 0. (default: 30s) (type: duration)
--timeout.read-header Timeout for header reads. None if 0. (default: 10s) (type: duration)
--timeout.write Timeout for writes. None if 0. (default: 30s) (type: duration)
--timeout.idle Timeout to disconnect idle client connections. None if 0. (default: 5m0s) (type: duration)
consensus
$ mergemock consensus --help
Run a mock Consensus client.
--beacon-genesis-time Beacon genesis time (default: 1636595652) (type: uint64)
--slot-time Time per slot (default: 12s) (type: duration)
--slots-per-epoch Slots per epoch (default: 32) (type: uint64)
--engine Address of Engine JSON-RPC endpoint to use (default: http://127.0.0.1:8550) (type: string)
--datadir Directory to store execution chain data (empty for in-memory data) (type: string)
--ethashdir Directory to store ethash data (type: string)
--genesis Genesis execution-config file (default: genesis.json) (type: string)
--node Enode of execution client, required to insert pre-merge blocks. (type: string)
--ttd The terminal total difficulty for the merge (default: 0) (type: uint64)
--rng seed the RNG with an integer number (default: 1234) (type: RNG)
--reorg-max-depth Max depth of a chain reorg (default: 64) (type: uint64)
# freq
Modify frequencies of certain behavior
--freq.gap How often an execution block is missing (default: 0.05) (type: float64)
--freq.proposal How often the engine gets to propose a block (default: 0.5) (type: float64)
--freq.ignore How often the payload produced by the engine does not become canonical (default: 0.1) (type: float64)
--freq.finality How often an epoch succeeds to finalize (default: 0.1) (type: float64)
--freq.reorg Frequency of chain reorgs (default: 0.05) (type: float64)
# log
Change logger configuration
--log.level Log level: trace, debug, info, warn/warning, error, fatal, panic. Capitals are accepted too. (default: info) (type: string)
--log.color Color the log output. Defaults to true if terminal is detected. (default: true) (type: bool)
--log.format Format the log output. Supported formats: 'text', 'json' (default: text) (type: string)
--log.timestamps Timestamp format in logging. Empty disables timestamps. (default: 2006-01-02T15:04:05Z07:00) (type: string)
# trace
Tracing options
--trace.enable enable tracing (default: false) (type: bool)
--trace.enable-memory enable memory capture (default: false) (type: bool)
--trace.disable-stack disable stack capture (default: false) (type: bool)
--trace.disable-storage disable storage capture (default: false) (type: bool)
--trace.enable-return-data enable return data capture (default: false) (type: bool)
--trace.debug print output during capture end (default: false) (type: bool)
--trace.limit maximum length of output, but zero means unlimited (default: 0) (type: int)
relay
$ mergemock relay --help
Run a mock builder relay.
--listen-addr Address to bind relay HTTP server to (default: 127.0.0.1:28545) (type: string)
--engine-listen-addr Address to bind engine JSON-RPC server to (default: 127.0.0.1:8551) (type: string)
--engine-listen-addr-ws Address to bind engine JSON-RPC WebSocket server to (default: 127.0.0.1:8552) (type: string)
# timeout
Configure timeouts of the HTTP servers
--timeout.read Timeout for body reads. None if 0. (default: 30s) (type: duration)
--timeout.read-header Timeout for header reads. None if 0. (default: 10s) (type: duration)
--timeout.write Timeout for writes. None if 0. (default: 30s) (type: duration)
--timeout.idle Timeout to disconnect idle client connections. None if 0. (default: 5m0s) (type: duration)
# log
Change logger configuration
--log.level Log level: trace, debug, info, warn/warning, error, fatal, panic. Capitals are accepted too. (default: info) (type: string)
--log.color Color the log output. Defaults to true if terminal is detected. (default: true) (type: bool)
--log.format Format the log output. Supported formats: 'text', 'json' (default: text) (type: string)
--log.timestamps Timestamp format in logging. Empty disables timestamps. (default: 2006-01-02T15:04:05Z07:00) (type: string)
Development
For development, install the following tools:
go install honnef.co/go/tools/cmd/staticcheck@v0.3.1
go install github.com/ferranbt/fastssz/sszgen@latest
License
MIT, see LICENSE
file.