Разработка gas tracker: система отслеживания газа для блокчейна
Разработка gas tracker — задача, которая на первый взгляд кажется простой: взять eth_gasPrice и показать. На практике же DeFi-протоколы теряют до 30% на комиссиях из-за неправильного выбора момента или неучёта компонентов EIP-1559. Мы строим не дашборд, а инженерную систему: собираем baseFee и priorityFee по каждому блоку, сохраняем в TimescaleDB, предсказываем на 5–10 блоков и отдаём через API с WebSocket. За 5 лет работы мы сделали gas трекеры для 30+ проектов, включая крупные DEX и исследовательские группы. Ниже — как это устроено изнутри и что вы получите под ключ.
Как устроен gas tracker под капотом?
EIP-1559: основная формула
После EIP-1559 (лондонский хардфорк) цена газа состоит из двух частей:
baseFeePerGas — базовая комиссия, сжигается. Определяется протоколом: если блок > 50% заполненности, base fee растёт на 12.5%, если < 50% — падает. Предсказуема на 1-2 блока вперёд.
maxPriorityFeePerGas (tip) — чаевые майнеру/валидатору. Рыночная часть — конкурируете за включение в блок.
Реальная стоимость транзакции: min(maxFeePerGas, baseFeePerGas + priorityFee) * gasUsed. Для gas tracker важно отслеживать оба компонента отдельно, не только итоговую цену.
Сбор данных: коллектор и хранение
Основной источник — eth_feeHistory. Возвращает baseFee, gasUsedRatio и percentile-статистику priorityFee за диапазон блоков. Используем viem:
import { createPublicClient, http } from 'viem' import { mainnet } from 'viem/chains' const client = createPublicClient({ chain: mainnet, transport: http(RPC_URL) }) const feeHistory = await client.getFeeHistory({ blockCount: 100, rewardPercentiles: [25, 50, 75, 95], }) // feeHistory.baseFeePerGas: BigInt[] // feeHistory.reward: BigInt[][] // feeHistory.gasUsedRatio: number[] (0..1) eth_gasPrice — актуальная цена на момент запроса. Mempool данные (pending транзакции) — для real-time анализа конкуренции.
Храним данные в TimescaleDB — оптимально для time-series:
CREATE TABLE gas_stats ( time TIMESTAMPTZ NOT NULL, block_number BIGINT NOT NULL, base_fee_gwei NUMERIC(20, 9) NOT NULL, tip_slow NUMERIC(20, 9), tip_standard NUMERIC(20, 9), tip_fast NUMERIC(20, 9), tip_instant NUMERIC(20, 9), gas_used_ratio NUMERIC(5, 4), network VARCHAR(50) NOT NULL DEFAULT 'ethereum' ); SELECT create_hypertable('gas_stats', 'time'); Retention policy: детальные данные по блокам — 7 дней, часовые агрегаты — 1 год, дневные — бессрочно.
Что входит в разработку gas tracker под ключ?
| Компонент | Описание |
|---|---|
| Коллектор | TypeScript + viem, подписка на блоки, обработка ошибок |
| База данных | TimescaleDB, индексы, агрегаты |
| API | Fastify, REST + WebSocket |
| Прогнозирование | EMA priorityFee, предсказание baseFee, временные паттерны |
| Фронтенд | React + Recharts, графики и рекомендации |
| Мультичейн | Отдельные коллекторы, L2 data fee |
| Документация | Swagger, README, инструкция по деплою |
| Обучение | Сопровождение команды в течение 2 недель |
Также гарантируем точность данных: пишем тесты для коллектора, мониторинг через Tenderly, используем Slither для проверки смарт-контрактов (если они часть системы).
Какие типы данных собирает gas tracker?
Помимо базовых компонентов, мы собираем метрики для каждого блока: количество транзакций, средняя и медианная priorityFee по процентилям, заполненность блока (gasUsedRatio). Это позволяет строить не только текущие рекомендации, но и исторические распределения — например, шанс попасть в блок с заданным tip. Для мультичейн-систем дополнительно логируется L1 data fee (для L2) и стоимость моста. Все данные попадают в TimescaleDB с автоматической агрегацией.
Как мы прогнозируем газ?
Простой вывод текущего baseFee недостаточен. Нужна оценка: "сколько поставить, чтобы попасть в следующий блок с вероятностью X%?".
Следующий baseFee предсказуем точно:
function predictNextBaseFee(currentBaseFee: bigint, gasUsedRatio: number): bigint { const targetRatio = 0.5 const maxChangeDenominator = 8n const delta = gasUsedRatio - targetRatio const change = (currentBaseFee * BigInt(Math.round(delta * 1000))) / (maxChangeDenominator * 1000n) return currentBaseFee + change } Priority fee — рыночная, предсказать сложнее. Используем EMA последних N блоков:
def calculate_priority_fee_estimate( recent_tips: list[float], alpha: float = 0.3, ) -> float: ema = recent_tips[0] for tip in recent_tips[1:]: ema = alpha * tip + (1 - alpha) * ema return ema Также учитываем временные паттерны: газ дешевле в UTC 02:00-08:00. Показываем "оптимальное окно" для несрочных транзакций.
Почему стоит выбрать TimescaleDB для хранения?
TimescaleDB — PostgreSQL extension для time-series. Позволяет автоматически партиционировать по времени, создавать непрерывные агрегаты и быстро выполнять оконные запросы. Альтернативы (InfluxDB, ClickHouse) требуют отдельного стека, а TimescaleDB встраивается в привычную реляционную БД — меньше overhead.
Сравнение вариантов хранения
| База | Тип | Нагрузка на чтение | Нагрузка на запись | Примечание |
|---|---|---|---|---|
| TimescaleDB | Реляционная + time-series | Высокая (агрегаты) | Низкая (авто-гипертаблица) | Единый стек с PostgreSQL |
| InfluxDB | NoSQL time-series | Средняя (плоская модель) | Высокая (денормализован) | Отдельный BI-стек |
| ClickHouse | Column-store | Высокая (аналитика) | Средняя (пакетная) | Оптимален для OLAP, но избыточен для трекера |
API и интеграция
REST endpoints:
-
GET /api/gas/current— текущие рекомендации {slow, standard, fast, instant} -
GET /api/gas/history?period=24h— история с агрегацией -
GET /api/gas/predict?blocks=5— прогноз на N блоков -
GET /api/gas/networks— данные по сетям
WebSocket — клиент получает обновления на каждый новый блок без polling. Мультичейн поддержка: отдельный коллектор на каждую сеть, для L2 (Arbitrum, Optimism, Base) учитываем двухкомпонентный газ.
Процесс интеграции:
- Аудит — анализируем нагрузку и требуемые сети.
- Архитектура — подбираем RPC-провайдеров, схему базы.
- Коллектор — разворачиваем в Docker, настраиваем мониторинг.
- API — генерируем OpenAPI-документацию.
- Тестирование — сверяем данные с Etherscan за неделю.
- Деплой — на ваш кластер Kubernetes или bare-metal.
Сроки и стоимость
Разработка базовой версии (Ethereum mainnet, история + текущие рекомендации) — 5-8 дней. Мультичейн с предсказаниями и детальной аналитикой — 2-3 недели. Стоимость рассчитывается индивидуально под задачи — свяжитесь с нами, оценим ваш проект. Обратившись сейчас, вы получите консультацию инженера по архитектуре gas tracker. Закажите разработку — начнём с анализа ваших данных.







