How fast erigon executes EVM transactions compared with geth, revm, evmone and Nethermind, on the same state-test fixtures, re-measured on every change to main.
Eight copies of one 150M-gas block per file, run one after another through each client's own blockchain-test tool (geth and erigon evm blocktest, revme blockchaintest, nethtest -b, evmone test), one block per process. Mgas/s = gas / (wall time of the file − wall time of the same file with no blocks), best of 3. Every client parses the fixture, executes the block and checks the state root, so the number is comparable across clients. Grey = the no-block twin is more than 30% of the run or the net time is under 100 ms: setup-dominated or too short for a wall clock. nethtest's dotnet start-up is ~3 s, so nethermind runs the file and the twin second in one process after a pass of the file: start-up and JIT warm-up cancel, nethermind is measured warm, and only the 100 ms floor greys its cells. A client with fewer than half of its blocks valid is left out of the hero. The precompile tests repeat one input, and geth and neth serve repeated precompile calls from a result cache, so that group compares caches, not precompiles; the hero uses instruction and scenario only. Fixtures: EEST benchmark@v0.0.7, 150M variant.
Geometric mean of Mgas/s across the fixtures of each group, execution-only harnesses: erigon in green, revm in grey. Points before the first cross-client run are erigon only.
Mgas/s per client and the ratio erigon / client. The bar extends right when erigon is faster, left when slower, from the 1.0 line. eth_call rps and Mgas/s: the same transaction as an eth_call against erigon on one mainnet node, 16 connections, Mgas/s = rps × gas; e/reth call = erigon rps / reth rps on the same box and datadir window; hover for p50/p99 of both. Click a row for its history. * geth times the pre-state setup with the execution, evmone and neth are process wall time, so their columns are not comparable; erigon and revm are execution only.
Request corpora anyone can replay against their own mainnet node: workloads/, one directory per workload with the JSON-RPC bodies, the pinned block and the rate ladder. Open loop at each rate, 20 s; rps below the rate means the node is at capacity; latency in ms; err = failed requests; a node that answers errors to a workload is skipped. Numbers from different machines compare on latency at equal rate and on the knee, not on peak rps.
Requests per second against one mainnet datadir, 33 recorded requests per method, 16 connections. The chart indexes each scenario to its first measurement.