Розгортування кастомного блок-експлорера
Стандартне питання: зачем свій експлорер, якщо є Etherscan? Відповіді: приватна EVM-мережа (L2, корпоративний сайдчейн), брандований інтерфейс, кастомні дані (decoded events, protocol-specific метрики), контроль над індексацією. Для публічних мереж — в основному брендинг та кастомізація. Для приватних мереж — єдиний варіант.
Вибір базового рішення
Не потрібно писати блок-експлорер з нуля — існує кілька open source проектів з різними trade-off:
Blockscout — найзріліший і функціональний. Використовується Gnosis Chain, Polygon, десятками L2. Написаний на Elixir/Phoenix, PostgreSQL. Підтримує EVM, ERC-20/721/1155, token tracking, decoded transactions, API. Складний у настройці, вимагає ресурсів, але production-proven.
Otterscan — легковесний, запускається як frontend-only поверх Archive ноди з Erigon (вимагає otterscan-compatible RPC API). Не потрібна окрема база даних. Добре підходить для development мереж і невеликих production.
Sirato (ex-Web3Labs Explorer) — комерційний з open source Community Edition. Хороша підтримка Hyperledger Besu.
Самописний на основі The Graph — якщо потрібна максимальна кастомізація протокол-специфічних даних.
Для більшості EVM-мереж вибір між Blockscout (повнофункціональний) і Otterscan (простий і швидкий у деплоі).
Розгортування Blockscout
Архітектура
Ethereum/EVM node (Archive) ←→ Blockscout Backend (Elixir)
↕
PostgreSQL + Redis
↕
Blockscout Frontend (Next.js)
Вимоги до ноди
Blockscout вимагає archive ноду з включеним trace API:
- Geth:
--gcmode=archive --http.api=eth,net,web3,debug,trace - Erigon: за замовчуванням архівна,
--private.api.addr=0.0.0.0:9090 - Nethermind:
--JsonRpc.EnabledModules=Eth,Subscribe,Trace,TxPool,Web3,Personal,Proof,Net,Parity,Health
Без trace API не будуть працювати internal transactions і token transfers з internal calls.
Docker Compose деплой
# docker-compose.yml
services:
db:
image: postgres:15
environment:
POSTGRES_DB: blockscout
POSTGRES_USER: blockscout
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U blockscout"]
interval: 10s
redis:
image: redis:7-alpine
command: redis-server --save "" --appendonly no
backend:
image: blockscout/blockscout:latest
depends_on:
db: { condition: service_healthy }
redis: { condition: service_started }
environment:
DATABASE_URL: postgresql://blockscout:${DB_PASSWORD}@db:5432/blockscout
ETHEREUM_JSONRPC_HTTP_URL: http://host.docker.internal:8545
ETHEREUM_JSONRPC_TRACE_URL: http://host.docker.internal:8545
ETHEREUM_JSONRPC_WS_URL: ws://host.docker.internal:8546
CHAIN_ID: "1" # ваш chain ID
COIN: ETH # нативний токен
COIN_NAME: Ether
NETWORK: Ethereum
SUBNETWORK: Mainnet
LOGO: /images/blockscout_logo.svg # кастомний логотип
REDIS_URL: redis://redis:6379
SECRET_KEY_BASE: ${SECRET_KEY_BASE} # 64-char random string
PORT: 4000
ports: ["4000:4000"]
command: sh -c "mix do ecto.create, ecto.migrate && mix phx.server"
frontend:
image: ghcr.io/blockscout/frontend:latest
environment:
NEXT_PUBLIC_API_HOST: http://backend:4000
NEXT_PUBLIC_APP_HOST: http://localhost:3000
NEXT_PUBLIC_NETWORK_NAME: "My Network"
NEXT_PUBLIC_NETWORK_SHORT_NAME: "MyNet"
NEXT_PUBLIC_NETWORK_ID: "1"
NEXT_PUBLIC_NETWORK_CURRENCY_NAME: Ether
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL: ETH
NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS: "18"
ports: ["3000:3000"]
Кастомізація
Blockscout 6.x розділений на backend (Elixir) і frontend (Next.js) — це спрощує кастомізацію UI. Frontend змінні окруження управляють:
# Брендинг
NEXT_PUBLIC_NETWORK_LOGO=/logo.png
NEXT_PUBLIC_NETWORK_ICON=/icon.png
NEXT_PUBLIC_COLOR_THEME_DEFAULT=dark
# Функціональність
NEXT_PUBLIC_IS_TESTNET=false
NEXT_PUBLIC_MARKETPLACE_ENABLED=true # dApp каталог
NEXT_PUBLIC_STATS_ENABLED=true # статистика мережі
Для глибокої кастомізації — fork frontend репозиторія і правка React компонентів.
Розгортування Otterscan (спрощений варіант)
Otterscan не вимагає окремої БД — читає дані напрямки з Erigon через розширений RPC:
# Erigon з otterscan API
erigon --chain=mainnet \
--private.api.addr=0.0.0.0:9090 \
--http \
--http.api=eth,erigon,ots,web3,net,debug,trace
# Otterscan frontend
docker run --rm -p 5100:80 \
-e ERIGON_URL=http://your-erigon-host:8545 \
otterscan/otterscan:latest
Готово. Але функціональність значно беднішa за Blockscout — немає token трекера, немає API, немає verified contracts.
Продуктивність індексації
Blockscout при першому запуску індексує всю історію ланцюга. Для mainnet Ethereum — тижні. Для молодої приватної мережі — години. Параметри для прискорення:
INDEXER_BLOCKS_BATCH_SIZE=100 # блоків за один batch (дефолт 10)
INDEXER_RECEIPTS_BATCH_SIZE=250
INDEXER_CONCURRENCY=5 # паралельних воркерів (залежить від RPC лімітів)
Моніторинг індексації
-- Поточний статус індексації
SELECT number FROM blocks ORDER BY number DESC LIMIT 1;
-- Пропущені блоки (блоки без транзакцій НЕ пропущені, це нормально)
SELECT * FROM missing_block_ranges LIMIT 20;
-- Розмір бази даних
SELECT pg_size_pretty(pg_database_size('blockscout'));
Верифікація контрактів
Blockscout підтримує верифікацію контрактів через кілька методів:
Hardhat/Foundry плагін — автоматична верифікація при деплоі, якщо вказати API ключ Blockscout:
// hardhat.config.ts
etherscan: {
apiKey: { myNetwork: "any-string" }, // Blockscout приймає будь-який ключ
customChains: [{
network: "myNetwork",
chainId: YOUR_CHAIN_ID,
urls: {
apiURL: "http://your-blockscout/api",
browserURL: "http://your-blockscout",
},
}],
}
Sourcify інтеграція: Blockscout може перевіряти через Sourcify — децентралізований реєстр вихідників. Для публічних мереж це бажано — верифікація зберігається не тільки у вас.
Масштабування
При зростанні нагрузки (багато користувачів, велика ланцюг):
- Read replica PostgreSQL для API запитів
- PgBouncer для connection pooling
- CDN для статики frontend
- Кілька backend інстансів за load balancer (stateless частина)
- Redis Cluster для кешей
Орієнтовні терміни: розгортування Blockscout для нової приватної мережі — 3–5 днів. Для існуючої мережи з історичною індексацією і кастомним UI — 1–2 тижні.







