Files
simplexmq/scripts/resolver

Ethereum stack for SMP names role

Reth (execution) + Nimbus (consensus) on Holesky testnet by default.

Quickstart

cd scripts/docker/reth-nimbus
docker compose up -d
docker compose logs -f reth nimbus

Sync takes a few hours on Holesky, ~1 day on mainnet. When synced:

curl -s -X POST http://127.0.0.1:8545 \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'

Point smp-server: [NAMES] ethereum_endpoint: http://127.0.0.1:8545.

How the trust bootstrap works

  • Reth holds Ethereum state and runs the EVM. It does not decide which fork is canonical.
  • Nimbus follows the beacon chain and tells Reth which payloads to execute.
  • Nimbus needs one trusted starting point to break the chicken-and-egg of peer-claims. --trusted-node-url fetches that checkpoint once from a public beacon API; from that point on every block is verified locally against the validator set.
  • The default TRUSTED_NODE_URL is publicnode.com (no API key, no rate limits). Replace with any beacon API you trust — only consulted once on first sync.

Switching to mainnet

Edit .env:

NETWORK=mainnet
TRUSTED_NODE_URL=https://ethereum-beacon-api.publicnode.com

Then docker compose down -v && docker compose up -d (the -v wipes state so Nimbus re-bootstraps against the new network). Reth on mainnet needs ~260 GB pruned NVMe.

Notes

  • Reth's RPC is bound to 127.0.0.1:8545 only. For remote access (multiple smp-server hosts → one Reth), put Caddy + Let's Encrypt + Basic auth in front — see plans/20260522_01_smp_public_namespaces.md §"Operator deployment".
  • Ports 30303/9000 are p2p — open on your firewall for sync.
  • jwt.hex is generated on first run by the jwt-init service and shared between Reth and Nimbus via the jwt volume.
  • To wipe state and re-sync: docker compose down -v.