Node Setup Guide

Complete guide to running Ethereum nodes. Choose your execution and consensus clients, configure your hardware, and get synced with the network.

Post-Merge Architecture

Since The Merge (September 2022), Ethereum requires two clients running together:

Execution Client

Handles transactions, smart contracts, and state. Connects to other execution clients via the devp2p network. Examples: Geth, Erigon, Reth.

Consensus Client

Implements Proof of Stake, handles block proposals and attestations. Connects to beacon chain network. Examples: Prysm, Lighthouse, Teku.

Both clients communicate via the Engine API using JWT authentication. You must run BOTH clients for a functioning node.

Hardware Requirements

SpecMinimumRecommendedNotes
CPU4 cores8+ coresHigher clock speed helps sync
RAM16 GB32 GB64 GB for archive nodes
Storage1 TB SSD2 TB NVMeNVMe strongly recommended
Network25 Mbps100+ MbpsLow latency important

Execution Clients

Geth

Go
Docs

The original and most widely used Ethereum execution client. Written in Go.

Storage: ~900 GB (full) / ~14 TB (archive)
Sync: ~1 week
Most battle-testedExtensive documentationLarge communitySnap sync

Install

sudo add-apt-repository -y ppa:ethereum/ethereum && sudo apt-get update && sudo apt-get install geth

Run

geth --http --http.addr 0.0.0.0 --http.api eth,net,web3 \
  --authrpc.addr localhost --authrpc.port 8551 \
  --authrpc.jwtsecret /path/to/jwt.hex

Erigon

Go
Docs

Efficiency-focused implementation with archive node capabilities. Optimized for disk I/O.

Storage: ~2 TB (archive)
Sync: ~3-5 days
Archive node optimizedLower disk I/OModular architectureFaster sync

Install

git clone https://github.com/ledgerwatch/erigon && cd erigon && make erigon

Run

erigon --chain mainnet --datadir /data/erigon \
  --http --http.addr 0.0.0.0 --http.api eth,erigon,web3 \
  --authrpc.jwtsecret /path/to/jwt.hex

Reth

Rust
Docs

High-performance Rust implementation focused on speed and efficiency. Rising star in the ecosystem.

Storage: ~900 GB
Sync: ~2-3 days
Blazingly fastModern codebaseLow resource usageActive development

Install

cargo install reth

Run

reth node --datadir /data/reth \
  --http --http.addr 0.0.0.0 --http.api eth,net,web3 \
  --authrpc.jwtsecret /path/to/jwt.hex

Nethermind

C#
Docs

Enterprise-grade .NET implementation with advanced features and monitoring.

Storage: ~900 GB
Sync: ~1 week
Enterprise readyBuilt-in monitoringPlugin systemMulti-chain support

Install

sudo apt-get install nethermind

Run

nethermind --config mainnet \
  --JsonRpc.Enabled true --JsonRpc.Host 0.0.0.0 \
  --JsonRpc.JwtSecretFile /path/to/jwt.hex

Consensus Clients

Prysm

Go

Most popular consensus client. Go implementation by Prysmatic Labs.

Most widely usedExcellent documentationWeb UI includedValidator support

Lighthouse

Rust

Rust-based consensus client known for reliability and performance.

High performanceSecurity focusedActive developmentSlashing protection

Teku

Java

Enterprise-grade Java implementation by ConsenSys.

Enterprise readyREST APIMetrics built-inMulti-client support

Lodestar

TypeScript

TypeScript implementation for JavaScript developers.

JS/TS nativeLight client supportEducationalBrowser compatible

JWT Authentication Setup

Execution and consensus clients communicate using the Engine API, which requires JWT authentication. Create a shared secret:

openssl rand -hex 32 | sudo tee /var/lib/ethereum/jwt.hex

Pass this file path to both clients using the --authrpc.jwtsecret(or equivalent) flag.

Docker Compose Setup

docker-compose.yml
version: "3.8"

services:
  geth:
    image: ethereum/client-go:stable
    container_name: geth
    restart: unless-stopped
    ports:
      - "8545:8545"  # HTTP RPC
      - "8546:8546"  # WebSocket
      - "30303:30303"  # P2P
    volumes:
      - geth-data:/root/.ethereum
      - ./jwt.hex:/jwt.hex:ro
    command:
      - --http
      - --http.addr=0.0.0.0
      - --http.api=eth,net,web3,txpool
      - --http.vhosts=*
      - --http.corsdomain=*
      - --ws
      - --ws.addr=0.0.0.0
      - --ws.api=eth,net,web3
      - --authrpc.addr=0.0.0.0
      - --authrpc.vhosts=*
      - --authrpc.jwtsecret=/jwt.hex

  prysm:
    image: gcr.io/prysmaticlabs/prysm/beacon-chain:stable
    container_name: prysm
    restart: unless-stopped
    depends_on:
      - geth
    ports:
      - "4000:4000"  # gRPC
      - "3500:3500"  # HTTP
    volumes:
      - prysm-data:/data
      - ./jwt.hex:/jwt.hex:ro
    command:
      - --accept-terms-of-use
      - --execution-endpoint=http://geth:8551
      - --jwt-secret=/jwt.hex
      - --checkpoint-sync-url=https://beaconstate.ethstaker.cc
      - --genesis-beacon-api-url=https://beaconstate.ethstaker.cc

volumes:
  geth-data:
  prysm-data:

Checkpoint Sync

Syncs beacon chain in minutes instead of days

Auto Restart

unless-stopped policy keeps nodes running

Persistent Data

Named volumes preserve blockchain data

Common Issues

Node not syncing?

  • Check that ports 30303 (TCP/UDP) are open for P2P
  • Verify JWT secret is identical for both clients
  • Ensure execution client is fully synced before starting consensus client

Slow sync speed?

  • Use NVMe SSD instead of SATA SSD or HDD
  • Increase system RAM to 32GB or more
  • Use checkpoint sync for consensus client