ETH2QS · sync-lab

Field report · 23 days · mainnet

The fastest Ethereum client is one almost nobody runs.

A head-to-head bake-off of seven execution clients and five consensus clients — the same mainnet sync, on the same host, one client at a time — run end-to-end by a fleet of AI agents.

eth2quickstart.com  ·  2026-06-22 → 2026-07-14

The rig

One host. One client at a time. Two numbers each.

Every client got a fair shot: its most disk-efficient mode, a fixed consensus partner, and a hard 72-hour cap. We recorded the final synced disk footprint and the sync duration — then watched what happened on restart.

7
Execution clients
5
Consensus clients
72h
Cap per candidate
1
Shared host, no MEV, no keys

Result 01 · disk footprint

Nethermind wins disk — by a lot.

Nimbus-eth1
~40 GB · only ~21% synced
Nethermind
~251 GiB · smallest
Ethrex
~467 GiB · growing
Reth
~0.98 TiB · capped
Besu
~1.08 TiB · un-pruned
Geth
~1.13 TiB · baseline
Erigon
~1.21 TiB · no-sync
0 ————————————————— 1.3 TiB

Nethermind wins among clients that finished a pruned, comparable sync — ~4.6× leaner than geth. The hatched bars never finished: Nimbus-eth1's ~40 GB is only ~21% of a sync, not a win.

Result 02 · cold-sync speed

ethrex wins speed — by a lot.

ethrex
2h 16m · fastest
geth
8h 28m
nethermind
~14h 30m
besu
19h 18m
0 ————————————————— 20 h

Completed syncs only. ethrex finished nearly 4× faster than the next client. So why does almost nobody run it?

The paradox

ethrex hits a hard restart cliff.

Gaps through 23 minutes resumed; a 26-minute gap stalled. In measured 1.5–2-hour gaps, ethrex discarded its synced state and re-synced from scratch (~2h) — an operability tax that helps explain why the fastest-syncing client has close to zero real-world mainnet adoption.

~128
blocks — the cliff edge
~25 min
downtime before stall onset
~2 h
to re-sync from scratch

Bisected with controlled stop → wait → start cycles: clean resume at 12 / 20 / 23 min gaps; stuck at 26 min.

The under-reported axis

Restart resilience is a third axis nobody benchmarks.

Sync speed and disk footprint are easy to measure and easy to publish. How a client behaves after downtime is neither — and it's the axis that most cleanly explains which clients people actually keep running.

Clean resume

geth, nethermind

Pick up where they left off. Boring, in the best way.

Re-snap cliff

ethrex

Stops resuming beyond ~25 minutes; longer measured gaps triggered a full re-snap.

Mid-sync deadlock

besu

A prolonged stale-CL outage aged out the pivot; the downloader died while RPC stayed up.

Execution-client scorecard

The full field.

ClientResultSyncFootprintMainnet
Nethermindsynced~14.5h~251 GiB36.0%
Gethsynced8h28m~1.13 TiB44.9%
Ethrexsynced2h16m~467 GiB, growing~0%
Besuun-pruned19h18m~1.08 TiB17.4%
Reth72h cap~0.98 TiB*1.5%
Nimbus-eth172h cap~40 GB*~0%
Erigonno-syncdeadlock~0%

Only nethermind & geth are pruned-comparable on disk. Besu (un-pruned) and ethrex (still growing) synced fine but their footprints aren't; reth & nimbus-eth1 are full-sync-only, capped here. * partial

Consensus layer

The CL layer is effectively solved.

All five checkpoint-synced to a validating head in minutes — ~6–9 min on the geth anchor, ~22–23 min on ethrex — with zero client-fault failures. Sync time is a tie, so footprint is the differentiator.

lodestar
~177 MiB · smallest
lighthouse
~518 MiB · lean default
grandine
~725 MiB
teku
~936 MiB
nimbus
~1.2 GiB · largest

The same heavyweight/lightweight tiers held across two EL anchors — EL/CL decoupling, supported empirically (lodestar and lighthouse swapped within the smallest tier).

Methodology

Run by agents — governed by humans.

A three-tier hierarchy kept the token cost sane and the judgment where it belonged:

OrchestratorClaude Opus — plans, reviews every diff, writes the durable state. Doesn't hand-write client code.
↓ dispatch  ·  ↑ summary only, not full context
BuildersFresh Sonnet subagents — one task each, report a short summary back.
DelegatesCheaper / sandboxed models — read-only research, routed through wrapper binaries.

Governance, non-negotiable: one candidate at a time · destructive actions human-gated · conventional commits · an agent cannot merge its own PR.

The machine that kept us honest

Two clocks, and a gate.

Decouple the clocks

Node vs agent time

Nodes sync for 72h in detached systemd; the agent sleeps and wakes on decision-worthy events, not polling logs.

Durable state

Small files, not context

Conclusions pushed down to markdown + CSV so a fresh session recovers the run — no context-window bottleneck.

Config-optimality gate

Fair by construction

Before a result counts, the harness verifies the client ran its most disk-efficient mode — else it rejects the run, not the client.

A real benchmark, not a lab result: shared semi-production host, footprint from the final near-cap sample — never a mid-sync peak.

Four incidents, all caught & documented

What actually breaks in three weeks.

nethermind

13.3h silent stall

Head frozen at block 4,651, 0 peers — everything else looked healthy. Root cause: P2P pinned to loopback. Fixed by advertising a routable external IP.

besu

Mid-sync deadlock

Downloader thread died, process stayed alive and kept answering RPC. Stale pinned CL stalled the beacon past the servable window.

ethrex

Restart-resync cliff

Stalled just beyond ~25 min; longer measured gaps discarded state and re-snapped. Inherent to the current design.

erigon

Gap-close deadlock

OtterSync + a checkpoint-synced CL never issue the forkchoice update that would close the gap. Raising CPU caps didn't help.

If you run one node for the long haul

What to actually run.

  • Disk-constrained → Nethermind. ~251 GiB, ~4.6× leaner than geth, clean restart behaviour, and a minority client — a client-diversity bonus on top of the disk win. Costs you sync time (~14.5h).
  • The boring default → Geth. Largest ecosystem, most docs, cleanest ~8h28m snap sync — you just pay ~1.13 TiB for it.
  • Consensus → Lighthouse. The lean, safe default: ~518 MiB, checkpoint-syncs in minutes, blob pruning on by default.

The real lesson: operational risk in an Ethereum node lives in the execution layer, not the consensus layer.

Read the whole thing

The numbers, the harness, and every gotcha — on-site.

eth2quickstart.com/blog

One-line install → hardened Ethereum node, 12 clients, MEV integration. github.com/chimera-defi/eth2-quickstart

← → navigate  ·  N notes  ·  P print / PDF
SLIDE 01 / 13

Speaker notes