Развёртывание кастомного блок-эксплорера
Стандартный вопрос: зачем свой эксплорер, если есть Etherscan? Ответы: приватная EVM-сеть (L2, корпоративный сайдчейн), брендированный интерфейс, кастомные данные (decoded events, protocol-specific метрики), контроль над индексацией. Для публичных сетей — в основном брендинг и кастомизация. Для приватных сетей — единственный вариант.
Выбор базового решения
Не нужно писать блок-эксплорер с нуля — есть несколько open source проектов с разными trade-offs:
Blockscout — самый зрелый и функциональный. Используется Gnosis Chain, Polygon, десятками L2. Написан на Elixir/Phoenix, PostgreSQL. Поддерживает EVM, ERC-20/721/1155, токен трекинг, 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
Готово. Но функциональность значительно беднее 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'));
Verified Contracts
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 недели.







