MergeMock
May 11, 2022 ยท View on GitHub
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.