Разработка системы прогнозирования газа
Реальная задача звучит так: пользователь хочет выполнить транзакцию, ему нужно знать, сколько это будет стоить через 30 минут, через 2 часа и через 12 часов. Простой ответ "смотри на текущий baseFee" не работает — он меняется каждые 12 секунд и на длинных горизонтах бесполезен. Нужна система, которая предсказывает будущие gas prices с разумной точностью для практических решений.
Как устроен gas pricing на Ethereum (EIP-1559)
После EIP-1559 в August 2021 механизм gas стал двухкомпонентным:
-
baseFee — алгоритмически определяемая базовая комиссия, сжигаемая навсегда. Изменяется на максимум ±12.5% от блока к блоку в зависимости от того, был ли предыдущий блок заполнен более или менее чем на 50% (
target_gas_used = block_gas_limit / 2). - maxPriorityFee (tip) — чаевые майнеру/валидатору. Пользователь выставляет сам, рынок определяет минимальный приемлемый уровень.
-
maxFeePerGas — максимум, который пользователь готов заплатить. Фактически уплачивается
baseFee + min(tip, maxFeePerGas - baseFee).
Формула изменения baseFee:
baseFee_new = baseFee_old * (1 + 0.125 * (gas_used - target_gas) / target_gas)
Это ключевое: baseFee детерминированно вычисляется из on-chain данных. Если знаешь gas utilization каждого блока, можно точно реконструировать историческую baseFee и строить модель.
Сбор данных
Минимальный набор данных для каждого блока:
interface BlockGasData {
blockNumber: bigint;
timestamp: number;
baseFeePerGas: bigint;
gasUsed: bigint;
gasLimit: bigint;
utilizationRate: number; // gasUsed / gasLimit
// из транзакций в блоке:
medianPriorityFee: bigint;
p25PriorityFee: bigint;
p75PriorityFee: bigint;
p95PriorityFee: bigint;
txCount: number;
mempoolSizeAtBlock?: number; // если есть доступ к mempool данным
}
Исторические данные: для обучения модели нужны данные как минимум за 3–6 месяцев (разные рыночные условия, bull/bear периоды, события типа NFT mints и token launches которые создавали gas spikes). Быстрее получить через Alchemy/QuickNode Archive API или через публичные датасеты (Dune Analytics, BigQuery Ethereum dataset от Google).
Real-time данные: WebSocket подписка на newHeads, для каждого блока дополнительно запрашиваем eth_getBlockByNumber с true для получения транзакций (нужны priority fees). На загруженных сетях — это существенный объём данных, нужен rate-limit-aware polling.
Mempool данные — опциональный, но ценный сигнал. Pending транзакции показывают "давление спроса" до конфирмации. Доступен через eth_getFilterChanges или Mempool.space API, Blocknative streaming.
Временные паттерны
Gas prices имеют выраженную сезонность:
Внутрисуточная: активность в UTC 13:00–21:00 (пересечение EU + US business hours) стабильно выше чем UTC 02:00–10:00 (Asia ночь + US ночь). Разница может быть 3–5x на baseFee.
День недели: пятница и выходные — пики NFT и gaming активности. Понедельник–среда — DeFi и institutional операции.
Событийные пики: major NFT mint, token airdrop claim, protocol launch — газ может вырасти в 10–50x за несколько минут. Предсказать конкретный spike невозможно, но можно детектировать его начало и быстро обновлять прогноз.
Модели прогнозирования
Краткосрочный прогноз (1–10 блоков, ~12–120 секунд)
Детерминированная модель: следующая baseFee вычисляется точно из текущей + текущего utilization. На 5–10 блоков можно применять марковскую цепь на основе исторических паттернов utilization.
def predict_next_basefee(current_basefee: int, utilization: float) -> int:
change = 0.125 * (utilization - 0.5) # -0.0625 to +0.0625
return int(current_basefee * (1 + change))
Это детерминировано для следующего блока. Для горизонта 5–10 блоков используем Monte Carlo симуляцию с распределением utilization из исторических данных.
Среднесрочный прогноз (10 мин – 2 часа)
Здесь детерминизм заканчивается, начинается ML.
XGBoost / LightGBM с временными признаками хорошо работают для tabular данных:
- Фичи: текущая baseFee, rolling average за 10/30/60 блоков, time of day (sin/cos encoding), day of week, pending tx count в mempool, recent utilization trend
- Target: baseFee через N блоков
LSTM / Transformer — лучше улавливают долгосрочные паттерны, но сложнее в обслуживании. Для практической системы часто хватает gradient boosting.
Метрика качества: не RMSE, а практическая — какой % времени пользователь, поставивший recommended gas, попал в следующий блок vs. переплатил vs. застрял.
Долгосрочный прогноз (2–48 часов)
На таких горизонтах доминирует временная сезонность. Prophet (Facebook) хорошо справляется с суточными и недельными паттернами:
from prophet import Prophet
model = Prophet(
daily_seasonality=True,
weekly_seasonality=True,
changepoint_prior_scale=0.05
)
model.fit(df[["ds", "y"]]) # ds=timestamp, y=basefee_gwei
forecast = model.predict(future_df)
Практическая точность на 24h горизонте: ±30–50% от медианного значения. Достаточно чтобы дать совет "завтра утром UTC газ будет значительно ниже чем сейчас".
Рекомендации для конкретных сценариев
Система должна конвертировать прогноз в actionable рекомендации:
interface GasRecommendation {
scenario: "fast" | "standard" | "economy";
maxFeePerGas: bigint; // в wei
maxPriorityFee: bigint; // в wei
estimatedInclusionTime: number; // секунды
confidence: number; // 0–1
usdCostFor21000Gas: number; // для простого transfer
}
"Economy" сценарий: "если не торопитесь — подождите до UTC 04:00, gasWei будет ~40% от текущего". Используем исторические перцентили для часовых сегментов.
API и интеграция
Результаты прогнозирования отдаём через REST API:
GET /v1/gas/current — текущие цены + краткосрочный прогноз
GET /v1/gas/forecast?hours=24 — прогноз на период
GET /v1/gas/recommend?speed=economy — рекомендация для сценария
WS /v1/gas/stream — обновления каждый блок
Кешируем результаты: текущие данные — TTL 12 сек (один блок), краткосрочный прогноз — TTL 1 мин, долгосрочный — TTL 15 мин. Redis.
Реалистичный срок разработки системы с ML прогнозированием и API: 8–12 недель.







