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







