Розгортування ноди 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, підтримує приватні мережі
- 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 — нода буде постійно відставати від head ланцюга.
Розгортування через 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)







