Парсинг мемпулу — ключовий компонент сучасної 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 робочих днів. Отримайте консультацію: ми гарантуємо продуктивність та надійність.







