Разработка MEV-бота
MEV — это не эксплойт и не серая зона. Это конкурентная инфраструктура: searcher замечает возможность в мемпуле раньше других, оформляет bundle и отправляет через Flashbots/MEV-Boost. Рынок MEV на Ethereum — $600M+ извлечённых за 2023 год по данным mevboost.pics. Большая часть — arbitrage и liquidation, не sandwich. Разработка MEV-бота — это разработка высоконагруженной финансовой системы с latency в миллисекундах.
Архитектура MEV-бота: где на самом деле всё сложно
Симуляция транзакций до отправки
Главный инструмент MEV-разработчика — не сам контракт, а движок симуляции. Прежде чем отправить bundle через eth_sendBundle в Flashbots relay, нужно точно знать: принесёт ли транзакция прибыль после газа и bribe.
Стандартный подход: eth_call на архивной ноде с stateOverride — подменяем баланс своего адреса и симулируем исполнение. Но eth_call не учитывает изменения состояния внутри bundle. Для точной симуляции — debug_traceCall или собственный EVM (revm на Rust).
Мы используем revm (Rust EVM implementation) для локальной симуляции с состоянием форкнутого mainnet. Latency симуляции: 1-3ms против 20-50ms через RPC eth_call. При конкуренции за арбитраж разница критическая.
Обнаружение возможностей: три основных вектора
Arbitrage между DEX. Цена токена A/B на Uniswap v3 отличается от Curve. Бот вычисляет оптимальный размер swap через Newton-Raphson на кривой x*y=k (Uniswap v2) или get_dy (Curve StableSwap). Flash loan из Aave v3 покрывает capital requirement — fee 0.05%.
Ключевая сложность: оптимальный размер swap, максимизирующий profit. Для Uniswap v2 это аналитически:
optimal_amount_in = sqrt(reserve0 * reserve1 * 997 / 1000) - reserve0
Для v3 с концентрированной ликвидностью — нужен tick-by-tick расчёт через QuoterV2.
Liquidation. Мониторинг health factor позиций в Aave v2/v3, Compound v3, Euler. Когда health factor падает ниже 1.0 (Aave) или collateral ratio нарушается (Compound) — вызов liquidationCall / liquidate. Прибыль = liquidation bonus (5-15% в зависимости от asset).
Проблема: несколько ботов видят одну позицию одновременно. Побеждает тот, кто предложил больший bribe MEV-Boost builder'у или попал в более ранний приватный mempool.
Sandwich — мы не делаем. Sandwich атаки вредят обычным пользователям. Арбитраж и ликвидации — это полезная рыночная функция.
Инфраструктура: нода, latency, builder connection
MEV без собственной ноды — это handicap. Публичный RPC добавляет 50-200ms. Нужен geth/reth в режиме --txpool.globalslots 10000 с включённым txpool subscription через WebSocket. Для ликвидаций достаточно Alchemy/QuickNode с WebSocket — там latency допустима (позиции не закрываются мгновенно).
Для арбитража — собственная нода или dedicated нода у провайдера (Alchemy Growth план, latency ~15ms). Flashbots eth_sendBundle отправляется напрямую к builder'ам (beaverbuild, rsync, titan), минуя публичный mempool.
Контракт исполнения
Сам on-chain контракт — простой executor: принимает параметры swap, выполняет через Uniswap/Curve router, проверяет profit через require(profit > minProfit), возвращает средства. Никакого хранения средств на контракте — только транзитные флоу через flash loan.
Защита от копирования: функция исполнения проверяет msg.sender == owner и block.coinbase == expectedBuilder (опционально, для защиты от front-run в публичном мемпуле).
Стек разработки
Python (быстрый прототип) → Rust (продакшн). web3.py для прототипирования логики, ethers-rs + revm для продакшн бота. Solidity контракт executor — Foundry. Мониторинг через Prometheus + Grafana: tracks per second, gas потребление, profit/loss по сессиям.
Процесс работы
Анализ стратегии (2-5 дней). Определяем вектор: арбитраж между конкретными парами, ликвидации в конкретных протоколах. Считаем историческую возможность по on-chain данным через Dune Analytics или The Graph.
Прототип на Python (3-5 дней). Логика обнаружения + симуляция через RPC. Тест на исторических данных (backtest через архивную ноду).
Продакшн на Rust (1-2 недели). Переписываем hot path. WebSocket subscriptions, локальная симуляция через revm, async executor через tokio.
Контракт + деплой (3-5 дней). Executor в Solidity, тесты в Foundry, деплой на mainnet.
Настройка инфраструктуры. Нода, Flashbots relay connection, мониторинг. Это часто занимает столько же, сколько сама разработка бота.
Ориентиры по срокам
Простой arbitrage бот (2 DEX, одна пара): 1-2 недели. Multi-DEX arbitrage с оптимизацией маршрута: 3-4 недели. Система с ликвидациями + арбитражем + Rust инфраструктурой: 6-8 недель. Сроки сильно зависят от требований к latency и сложности стратегии.







