Разработка системы индексации блокчейн-событий под ключ

Разработка системы индексации блокчейн-событий При типичных запросах — «покажи все транзакции пользователя за 30 дней», «объём торгов DEX» — eth_getLogs медленный. На архивной ноде с блока 0 запрос займёт минуты; на публичном RPC — упадёт с timeout или `block range too large`. Мы проектируем отка

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1452
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1310
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1005
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1270
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1012

Разработка системы индексации блокчейн-событий

При типичных запросах — «покажи все транзакции пользователя за 30 дней», «объём торгов DEX» — eth_getLogs медленный. На архивной ноде с блока 0 запрос займёт минуты; на публичном RPC — упадёт с timeout или block range too large. Мы проектируем отказоустойчивый pipeline индексации событий с exactly-once семантикой и мониторингом в реальном времени. Экономия ресурсов: до 80% времени на поисковых запросах, снижение затрат на RPC в 10 раз. Реальный кейс — клиент сэкономил десятки тысяч долларов в год на инфраструктуре. Наша команда имеет 8+ лет опыта в блокчейн-разработке и более 50 реализованных проектов по индексации. Закажите консультацию — оценим ваш проект за 1 день.

Какой подход к получению событий выбрать?

Есть три способа получать события из ноды, каждый со своими компромиссами:

Подход Latency Сложность Надёжность Примерная пропускная способность
Polling (eth_getLogs) Средняя (1-5 сек) Низкая Высокая (exactly-once) До 1000 блоков за запрос
WebSocket subscriptions Низкая (< 1 сек) Средняя Средняя (зависит от сети) Мгновенная доставка
Firehose / StreamingFast Низкая Высокая Очень высокая Поток блоков без ограничений

Polling — самый распространённый выбор: воркер периодически опрашивает ноду за диапазон блоков, сохраняя lastIndexedBlock. При перезапуске продолжает с последнего обработанного блока. WebSocket даёт низкую задержку, но требует автоматического переподключения и синхронизации пропущенных блоков. Firehose — enterprise-решение для high-throughput систем.

Как обрабатывать реорганизации цепочки?

Реорги — главный источник багов. На Ethereum PoS финальность наступает через две эпохи (~12 минут). На BSC или Polygon реорги глубиной 3-5 блоков — обычное дело.

Стратегия: индексируем с задержкой на N подтверждённых блоков (13 для Ethereum), сохраняем хеш каждого проиндексированного блока. При расхождении хеша — откат до последнего совпадающего состояния и переиндексация.

-- Таблица состояния индексера CREATE TABLE indexer_blocks ( block_number BIGINT PRIMARY KEY, block_hash VARCHAR(66) NOT NULL, indexed_at TIMESTAMPTZ DEFAULT NOW() ); -- Событие с привязкой к блоку для rollback CREATE TABLE indexed_events ( id BIGSERIAL PRIMARY KEY, block_number BIGINT NOT NULL REFERENCES indexer_blocks(block_number), log_index INT NOT NULL, tx_hash VARCHAR(66) NOT NULL, contract_addr VARCHAR(42) NOT NULL, event_name VARCHAR(100) NOT NULL, decoded_data JSONB NOT NULL, UNIQUE(tx_hash, log_index) ); 

При детекции реорга удаляем записи с block_number >= reorg_depth и переиндексируем с этой точки.

Техническая деталь: глубины подтверждения для разных сетей

Ethereum: 13 блоков (рекомендация). Polygon: 25 блоков. BSC: 15 блоков. Solana: 1 слот (≈400 мс). Значение можно менять через переменную окружения CONFIRMATIONS.

Декодирование событий: нюансы

ABI-декодирование тривиально с viem или ethers.js, но есть подводные камни. Согласно документации Solidity по событиям, сложности возникают с:

  • Indexed vs non-indexed: indexed параметры попадают в topics, non-indexed — в data. Событие с 3 indexed параметрами занимает 4 topics. Декодирование topics для structs невозможно — данные хешируются.
  • Анонимные события: без темы event — редки, требуют нестандартного подхода.
  • Proxy-контракты (EIP-1967): события эмитятся с адреса proxy, но ABI у реализации. Нужно резолвить implementation через storage slot 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc. Подробнее в EIP-1967.

Пример декодирования на TypeScript:

import { decodeEventLog } from 'viem' function parseSwapEvent(log: Log, abi: Abi): SwapEvent { const decoded = decodeEventLog({ abi, eventName: 'Swap', data: log.data, topics: log.topics, }) return { blockNumber: log.blockNumber, txHash: log.transactionHash, sender: decoded.args.sender, recipient: decoded.args.recipient, amount0: decoded.args.amount0, amount1: decoded.args.amount1, sqrtPriceX96: decoded.args.sqrtPriceX96, liquidity: decoded.args.liquidity, tick: decoded.args.tick, } } 

Какую базу данных выбрать для хранения событий?

Критерий PostgreSQL (партиционирование) TimescaleDB
Настройка Ручное создание партиций Автоматические hypertables
Сжатие Нет встроенного Да, для старых данных (уменьшение в 10 раз)
Агрегации Материализованные представления Continuous aggregates (автообновление)
Производительность Отличная при хорошем партиционировании В 5 раз быстрее для time-series запросов

Для хранения событий используем PostgreSQL с партиционированием по block_number или TimescaleDB для high-frequency контрактов. Пример партиционирования:

CREATE TABLE swap_events ( block_number BIGINT NOT NULL, event_timestamp TIMESTAMPTZ NOT NULL, event_data JSONB ) PARTITION BY RANGE (block_number); CREATE TABLE swap_events_0_5m PARTITION OF swap_events FOR VALUES FROM (0) TO (5000000); -- аналогично для следующих диапазонов 

TimescaleDB даёт continuous aggregates для метрик: объём торгов в час, количество транзакций — без фоновых задач.

Мониторинг и алерты

Включаем метрики: indexer_lag_blocks, events_per_second, reorg_count. Алерт при отставании более 50 блоков. Здоровье проверяется через health endpoint (503 при превышении порога). Стек: Go/Rust для воркера, PostgreSQL/TimescaleDB, Redis для state, Grafana + Prometheus.

Как мы это делаем: процесс работы

  1. Аналитика: изучаем смарт-контракты, выявляем все события, определяем частоту эмиссии. Среднее время — 1-2 дня.
  2. Проектирование: выбираем подход (polling для простоты, firehose для high-load), проектируем схему БД, API. Создаём диаграмму потока данных.
  3. Реализация: пишем воркер на Go/Rust, настраиваем декодирование, обработку реоргов, партиционирование. Типовой срок — от 5 до 15 дней.
  4. Тестирование: симулируем отставание, реорги, высокую нагрузку. Используем testnet (Sepolia, Holesky).
  5. Деплой: Docker-контейнеры с оркестрацией (Kubernetes или Docker Compose). Первичная индексация последних 1000 блоков.
  6. Мониторинг и поддержка: дашборды Grafana, алерты, ежемесячные отчёты. В течение первого месяца — быстрые исправления.

Ориентировочные сроки: базовая индексация одного контракта — от 5 дней; сложный pipeline с партиционированием и мониторингом — от 2 недель. Стоимость рассчитывается индивидуально — свяжитесь для оценки.

Что входит в работу

  • Архитектурное проектирование: выбор подхода, схема БД, спецификация API.
  • Реализация pipeline: воркер, декодирование, обработка реоргов, партиционирование.
  • GraphQL API на основе подписок (Hasura или собственный resolver).
  • Мониторинг и алерты: дашборды, метрики lag.
  • Документация: диаграмма данных, точки масштабирования, runbook.
  • Обучение команды клиента.
  • Поддержка 1 месяц после ввода.

Закажите разработку системы индексации под ключ. Получите консультацию — мы оценим проект за 1 день и предложим оптимальное решение. Свяжитесь с нами.