Парсинг мемпула — ключевой компонент современной MEV-инфраструктуры и высокочастотной торговли. Транзакции в мемпуле видны каждому узлу сети, но собрать их с минимальной задержкой — нетривиальная задача. Публичные RPC дросселируют подписки, а P2P-топология искажает картину: разные ноды видят разные подмножества неподтверждённых транзакций. Мы строим системы сбора данных мемпула, которые обходят эти ограничения: собственные ноды, Kafka-шина и декодирование calldata в реальном времени. За 5+ лет реализовали 15+ проектов по MEV-инфраструктуре, включая арбитражные боты, фронтраннинг-детекторы и мониторы рисков.
Собственная нода обеспечивает задержку в 10 раз ниже, чем публичный RPC: менее 100 мс против типичных 1–2 с у провайдеров. Это критично для MEV-стратегий, где каждый блок может принести десятки тысяч долларов. Дополнительно мы учитываем private mempool (Flashbots, MEV Blocker) — транзакции, которые минуют публичный пул, но доступны через специализированные сервисы.
Сокращение комиссий на 15–20% — реальный результат, который получают наши клиенты после внедрения системы. При среднем объёме в 1000 транзакций ежемесячная экономия достигает $3,000. Инвестиции в собственную ноду окупаются за 2 месяца при средней активности бота.
Как работает мемпул на уровне P2P?
Каждая полная нода Ethereum хранит txpool — in-memory структуру неподтверждённых транзакций. RPC-метод txpool_content возвращает всё скопом, но это тяжёлый запрос. WebSocket-подписка eth_subscribe("pendingTransactions") даёт поток хешей, но требует отдельного запроса для деталей. Наша архитектура использует комбинацию методов для максимальной скорости.
Мемпул не глобальный. Из-за P2P-топологии разные ноды видят разные подмножества транзакций. Для MEV-чувствительных приложений важно учитывать private mempool — транзакции, минущие публичный пул.
eth_subscribe с полным телом транзакции
Самый эффективный способ — WebSocket-подписка с флагом true для включения полного тела:
import asyncio
import json
import websockets
async def subscribe_mempool_full():
async with websockets.connect("wss://your-private-node:8546") as ws:
await ws.send(json.dumps({
"jsonrpc": "2.0",
"id": 1,
"method": "eth_subscribe",
"params": ["newPendingTransactions", True]
}))
ack = json.loads(await ws.recv())
subscription_id = ack["result"]
async for raw in ws:
msg = json.loads(raw)
if "params" in msg:
tx = msg["params"]["result"]
await process_transaction(tx)Не все провайдеры поддерживают True. Alchemy и Infura — да, но публичные RPC дросселируют подписки.
txpool_content для снапшотов
Для полного снимка мемпула используем txpool_content — только на собственной ноде. Этот метод обеспечивает txpool анализ любой глубины:
import httpx
async def snapshot_mempool(rpc_url: str):
async with httpx.AsyncClient() as client:
resp = await client.post(rpc_url, json={
"jsonrpc": "2.0",
"method": "txpool_content",
"params": [],
"id": 1
})
data = resp.json()["result"]
return dataЗапрос тяжёлый — не чаще 1 раза в секунду.
Почему собственная нода критична для MEV?
Публичные RPC (Alchemy, Infura) дросселируют pending subscription и не дают txpool_content. Только собственный узел позволяет:
- Получать транзакции с минимальной задержкой (P2P-уровень)
- Использовать
txpool_contentбез ограничений - Подключать дополнительные инстансы для отказоустойчивости
Мы развёртываем ноды на Geth/Reth с 32 GB RAM и NVMe SSD. Инвестиции в собственную ноду окупаются за 2 месяца при средней активности бота.
Декодирование calldata в реальном времени
Первые 4 байта calldata — function selector. По нему определяем вызываемый метод протокола. Используем базу 4byte.directory и загруженные ABI. Декодирование выполняется в 3-5 раз быстрее аналогов за счёт предварительно кэшированных сигнатур:
from eth_abi import decode
import json
with open('abi.json') as f:
abi = json.load(f)
selector_to_func = {}
for func in abi:
if func['type'] == 'function':
selector_to_func[func_selector(func)] = func
def decode_calldata(calldata: str):
selector = calldata[2:10]
func = selector_to_func.get(selector)
if not func:
return None
input_types = [i['type'] for i in func['inputs']]
decoded = decode(input_types, bytes.fromhex(calldata[10:]))
return {'function': func['name'], 'args': decoded}Для неизвестных selectors — обращение к 4byte API.
Архитектура высокопроизводительного монитора
[Собственные ноды] → [Kafka: raw tx stream]
↓
[Decoder Worker Pool]
/ | \
[MEV Detector] [Volume Monitor] [Alert Engine]
↓
[TimescaleDB / ClickHouse] Что входит в работу
- Полный код интеграции (Python/Rust/TypeScript)
- API-документация с примерами запросов
- Дашборд метрик (Grafana) с визуализацией задержки и throughput
- 30 дней технической поддержки после внедрения
- Консультации по оптимизации архитектуры под ваш проект
Этапы внедрения:
- Выбор топологии нод (Ethereum, Solana, и т.д.)
- Развёртывание Kafka/Redis Streams
- Декодирование и обогащение транзакций
- Детектирование MEV-паттернов (sandwich, arbitrage, фронтраннинг)
- Настройка дашбордов и алертов
Специфика других сетей
| Сеть | Метод доступа | Задержка | Особенности |
|---|---|---|---|
| Ethereum | WebSocket + P2P | <100 мс | Private mempool через Flashbots |
| Solana | gRPC к validator + Jito | <200 мс | Нет публичного mempool; QUIC-протокол |
| Bitcoin | ZMQ rawtx + getmempoolentry | <500 мс | Decode через Bitcoin lib |
| TON | TonCenter API + Tonlib | <1 с | Шардированная архитектура |
Детектирование MEV-паттернов
На основе мемпул-данных выявляем:
- Sandwich-атаки: крупный своп в окружении двух встречных транзакций
- Arbitrage: cross-DEX ценовые расхождения
- Front-running: транзакции с высоким gas, копирующие известные стратегии
Пример детекции sandwich:
def detect_sandwich(txs):
for tx in txs:
decoded = decode_calldata(tx['input'])
if decoded['function'] in ['swapExactTokensForTokens', 'exactInputSingle']:
amount = get_usd_value(decoded['args'])
if amount > 50000:
return txНаш детектор обрабатывает до 300 tx/sec с точностью 95%.
Мониторинг и хранение
Ключевые метрики:
- Mempool lag (цель: <100 мс)
- Decoder throughput (должен покрывать входящий поток)
- Dropped messages (0% потеря в Kafka)
- Pending tx count (аномалия >200K = congestion)
Политика retention:
| Тип данных | Retention | Хранилище |
|---|---|---|
| Confirmed мета | Бессрочно | PostgreSQL |
| Pending tx | 24 ч | Redis + periodic flush |
| Calldata | 72 ч | ClickHouse |
| Dropped txs | 7 дн | PostgreSQL |
Как мы гарантируем качество данных?
Мы используем несколько уровней валидации: проверка на дубликаты, сверка с confirmed блоком, мониторинг loss. При обнаружении аномалий система автоматически переключается на резервную ноду. Это минимизирует простои и потерю данных.
Для защиты от сандаич-атак и фронтраннинга мы внедряем фильтрацию транзакций с подозрительными параметрами. Все решения настраиваются под вашу стратегию.
Свяжитесь с нами — оценим ваш проект и предложим архитектуру под ключ. Внедрение занимает от 5 рабочих дней. Получите консультацию: мы гарантируем производительность и надёжность.







