Развёртывание ноды Ethereum
Запустить Ethereum ноду сегодня проще, чем два года назад, но есть нюансы, которые превращают "простую задачу" в потерянный день. Главный из них — Ethereum после The Merge требует одновременной работы двух клиентов: Execution Layer (EL) и Consensus Layer (CL). Они взаимодействуют через Engine API (authenticated JWT), и без CL нода просто не синхронизируется.
Выбор клиентов
Execution Layer:
- Geth — reference клиент, Go, наибольшая доля рынка. Проверен временем, большое сообщество. Snap sync работает быстро.
- Nethermind — .NET, хорошая производительность на Windows-сервере, активно разрабатывается
- Besu — Java, enterprise-friendly, поддерживает private networks
- Erigon — Go, наименьший размер базы (~2TB против ~1TB у Geth snap), но snapshot sync значительно медленнее
Consensus Layer:
- Prysm — Go, самый популярный, хорошая документация
- Lighthouse — Rust, отличная производительность и потребление памяти
- Teku — Java, от ConsenSys, хорош в enterprise
Рекомендуемая комбинация для начала: Geth + Lighthouse — оба стабильны, хорошо документированы.
Требования к железу
| Тип ноды | Диск | RAM | CPU |
|---|---|---|---|
| Full node (snap sync) | 1.2 TB NVMe | 16 GB | 4 ядра |
| Archive node | 14+ TB NVMe | 32 GB | 8 ядер |
| Validator | 1.2 TB NVMe | 16 GB | 4 ядра |
Критически важно: только NVMe SSD. HDD и SATA SSD не обеспечат необходимый IOPS — нода будет постоянно отставать от головы цепи.
Развёртывание через Docker Compose
# docker-compose.yml
version: "3.8"
services:
geth:
image: ethereum/client-go:latest
restart: unless-stopped
volumes:
- ./data/geth:/data
- ./jwt.hex:/jwt.hex:ro
ports:
- "30303:30303" # P2P
- "30303:30303/udp"
- "8545:8545" # HTTP RPC (только localhost!)
- "8546:8546" # WebSocket RPC
command:
- --datadir=/data
- --http
- --http.addr=0.0.0.0
- --http.vhosts=*
- --http.api=eth,net,web3,txpool
- --ws
- --ws.addr=0.0.0.0
- --ws.api=eth,net,web3
- --authrpc.addr=0.0.0.0
- --authrpc.vhosts=*
- --authrpc.jwtsecret=/jwt.hex
- --authrpc.port=8551
- --maxpeers=50
- --cache=4096
lighthouse:
image: sigp/lighthouse:latest
restart: unless-stopped
volumes:
- ./data/lighthouse:/data
- ./jwt.hex:/jwt.hex:ro
ports:
- "9000:9000" # P2P
- "9000:9000/udp"
- "5052:5052" # Beacon API
command:
- lighthouse
- bn
- --network=mainnet
- --datadir=/data
- --http
- --http-address=0.0.0.0
- --execution-endpoint=http://geth:8551
- --execution-jwt=/jwt.hex
- --checkpoint-sync-url=https://mainnet.checkpoint.sigp.io
- --disable-deposit-contract-sync
JWT secret: обязательный шаг
# Генерация JWT secret для Engine API
openssl rand -hex 32 > jwt.hex
chmod 600 jwt.hex
Без этого файла (и совпадения его содержимого в обоих клиентах) они не смогут общаться.
Checkpoint sync vs genesis sync
--checkpoint-sync-url в Lighthouse — это разница между 15 минутами и неделями синхронизации CL. Checkpoint sync загружает финализированный beacon state с доверенного источника и синхронизирует от него, а не с genesis. Публичные checkpoint endpoints: https://mainnet.checkpoint.sigp.io, https://beaconstate.ethstaker.cc.
Geth при первом запуске автоматически использует snap sync — скачивает только "снимок" состояния, а не все исторические блоки. Это займёт 4–12 часов в зависимости от скорости интернета и диска.
Мониторинг
# Статус синхронизации Geth
curl -s -X POST http://localhost:8545 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' | jq
# Статус Lighthouse
curl -s http://localhost:5052/eth/v1/node/syncing | jq
Добавить в Prometheus через ethereum_exporter (EL метрики) и lighthouse_beacon (CL метрики). Grafana dashboards для обоих есть в официальных репозиториях.
Безопасность
- HTTP RPC (8545, 8546) не должен быть открыт в интернет без аутентификации — любой может дренировать unlocked аккаунты или нагружать ноду запросами
- Nginx reverse proxy с rate limiting и, если нужен внешний доступ, — Bearer token аутентификацией
- Engine API (8551) — только localhost или внутренняя docker сеть, снаружи не нужен никому
- Firewall: открыты только P2P порты (30303, 9000)







