Настройка приватного мемпула
Публичный mempool Ethereum — это broadcasting система, в которой ваша неподтверждённая транзакция видна любому узлу в сети за секунды после отправки. MEV-ботам, front-runner'ам и sandwich-атакующим не нужно ничего взламывать — они просто подписаны на pending транзакции и автоматически реагируют. Если ваш протокол выполняет крупные своп-операции, liquidations, или арбитраж — публичный mempool это прямая потеря денег.
Приватный mempool решает эту проблему: транзакция идёт напрямую к block builder'у, минуя публичное broadcasting, и попадает в блок без предварительной огласки.
MEV и почему это реальные деньги
Перед тем как говорить о решении — нужно понять масштаб проблемы. MEV (Maximal Extractable Value) на Ethereum с перехода на PoS составляет сотни миллионов долларов в год. Механики:
Sandwich attack — классика против DEX-трейдеров. Бот видит вашу pending транзакцию на Uniswap, вставляет buy до неё (front-run) и sell после (back-run). Ваш своп выполняется по худшей цене, разница идёт боту. При slippage tolerance 1% на $100k свопе — потенциальный убыток $1000 в пользу атакующего.
Liquidation front-running — в lending протоколах (Aave, Compound) liquidation позиций выгодна: ликвидатор получает discount. Если вы пытаетесь ликвидировать позицию публично — конкурирующий бот может перехватить транзакцию с более высоким gas price.
Arbitrage — менее вредоносный для вас, но показывает насколько мемпул прозрачен. Арбитражники реагируют на ваши транзакции в течение одного блока.
Архитектура приватной доставки транзакций
Flashbots: базовая инфраструктура
Flashbots — исследовательская организация, которая создала MEV-Boost и Flashbots Protect. С переходом на PoS большинство Ethereum блоков строятся через PBS (Proposer-Builder Separation): validator предлагает блок, но сам его не строит — он выбирает лучший из бидов от block builder'ов.
Flashbots Protect RPC — самый простой вариант. Меняете RPC endpoint в кошельке или коде на https://rpc.flashbots.net. Транзакции идут в Flashbots bundle pool, не в публичный mempool. Protect работает через eth_sendPrivateTransaction под капотом.
const provider = new ethers.JsonRpcProvider("https://rpc.flashbots.net");
// Транзакции теперь идут через Flashbots, не в публичный mempool
const tx = await signer.sendTransaction({ to, value, data });
Ограничение: нет гарантии включения в конкретный блок, нет возможности bundle несколько транзакций атомарно.
Flashbots Bundles: атомарное выполнение
Для сложных операций — bundles. Bundle = набор транзакций, которые должны выполниться атомарно в одном блоке в заданном порядке. Если хотя бы одна транзакция ревертит — весь bundle не включается.
import { FlashbotsBundleProvider } from "@flashbots/ethers-provider-bundle";
const flashbotsProvider = await FlashbotsBundleProvider.create(
provider,
authSigner, // ключ для подписи запросов к Flashbots relay
"https://relay.flashbots.net"
);
const bundle = [
{ signer: wallet, transaction: approveTx },
{ signer: wallet, transaction: swapTx },
];
const targetBlock = (await provider.getBlockNumber()) + 2;
const simulation = await flashbotsProvider.simulate(bundle, targetBlock);
if ("error" in simulation) throw new Error(simulation.error.message);
// Отправляем bundle на несколько блоков вперёд для надёжности
for (const blockNumber of [targetBlock, targetBlock + 1, targetBlock + 2]) {
await flashbotsProvider.sendBundle(bundle, blockNumber);
}
Bid механизм: bundle должен быть привлекателен для builder'а. Builder выбирает bundle'ы, которые максимизируют их прибыль. Нужно включить coinbase payment — ETH transfer напрямую block builder'у:
// В последней транзакции bundle
block.coinbase.transfer(minerTip);
Размер tipа определяет приоритет вашего bundle. Для арбитражных стратегий это обычно процент от прибыли арбитража.
MEV Blocker и альтернативные relay
Flashbots — не единственный вариант. Экосистема MEV relay:
MEV Blocker (https://rpc.mevblocker.io) — агрегирует приватные транзакции через сеть searcher'ов, которые подписались на non-front-running правила. Searcher'ы могут back-run ваши транзакции (арбитраж после вас), но не front-run или sandwich. Часть прибыли от back-running возвращается отправителю транзакции.
Beaver Build — block builder с приватным RPC, предлагает bundle API совместимый с Flashbots.
bloXroute — enterprise решение, быстрая доставка bundle через собственную сеть p2p нод.
Для максимальной надёжности включения — отправляйте bundle параллельно в несколько relay:
const RELAYS = [
"https://relay.flashbots.net",
"https://relay.ultrasound.money",
"https://agnostic-relay.net",
];
await Promise.all(
RELAYS.map(relayUrl =>
sendBundle(bundle, targetBlock, relayUrl)
)
);
Настройка собственного private relay
Для протоколов с постоянным потоком транзакций (протоколы ликвидаций, treasury management) имеет смысл развернуть собственный MEV relay.
Компоненты
MEV-Boost — middleware между Ethereum validator'ом и block builder'ами. Validator устанавливает MEV-Boost как sidecar процесс, он принимает бид от builder'ов и выбирает лучший.
mev-relay (Flashbots open source) — relay сервер, принимает bundles от searcher'ов и отдаёт их builder'ам. Требует whitelisted builder партнёры для включения bundle в блоки.
Требования к инфраструктуре:
- Ethereum archive node (Erigon или Geth с
--gcmode=archive) — минимум 3 TB NVMe, 64GB RAM - Низкая latency до основных block builder'ов: вероятность включения bundle критически зависит от скорости доставки. Используйте серверы в дата-центрах рядом с крупными builder'ами (Equinix NY4, Interxion AMS)
- Мониторинг inclusion rate: какой процент bundle'ов реально попал в блок, в каком блоке, какой был actual gas price
Операционные нюансы
Simulation перед отправкой обязательна. Отправить bundle с ревертящей транзакцией — потеря gas и времени. Tenderly или собственный fork (Anvil / Hardhat) для симуляции:
anvil --fork-url $ETH_RPC --fork-block-number latest
# Симулируем bundle локально перед отправкой
Nonce management — критическая точка. Если вы отправляете несколько bundle в параллельных блоках, все они используют одинаковые nonce. При включении одного bundle остальные автоматически становятся невалидными — это ожидаемое поведение, не ошибка. Но при повторной отправке нужно инкрементировать nonce.
Cancellation: eth_cancelPrivateTransaction в Flashbots позволяет отозвать неподтверждённую транзакцию. Работает только если транзакция ещё не включена в блок. Для bundle — нет прямой отмены, только истечение блока назначения.
L2 и альтернативные сети
На L2 (Arbitrum, Optimism, Base) ситуация другая: централизованный sequencer сам определяет порядок транзакций, публичный mempool практически отсутствует. Это защищает от front-running со стороны внешних MEV-ботов, но не от самого sequencer'а.
Arbitrum имеет fair ordering: транзакции упорядочиваются по времени получения sequencer'ом. Sandwich атаки через газовые аукционы технически невозможны. Однако sequencer централизован — Offchain Labs оперирует им.
Для Solana MEV-защита строится иначе: Jito Labs предоставляет аналог Flashbots для Solana — jito-solana клиент и bundle API для атомарных транзакций.
Метрики успеха
После настройки приватного mempool нужно измерять:
- Inclusion rate: % bundle'ов, попавших в блок в target block ± 2
- MEV savings: сравнение фактических цен исполнения со spot price в момент отправки
- Gas efficiency: при bundles часто удаётся снизить effective gas через оптимизацию порядка
- P&L impact: для арбитражных стратегий — прямой comparison до/после







