Настройка приватного мемпула
Публічний mempool Ethereum — це broadcasting система, у якій ваша неопалювана транзакція видна будь-якому вузлу в мережі за секунди після відправки. MEV-ботам, front-runner'ам та sandwich-атакуючим не потрібно нічого взламувати — вони просто підписані на pending транзакції та автоматично реагують. Якщо ваш протокол виконує великі своп-операції, ліквідації або арбітраж — публічний 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) ліквідація позицій вигідна: ліквідатор отримує discount. Якщо ви намагаєтесь ліквідувати позицію публічно — конкуруючий бот може перехопити транзакцію з більш високим gas price.
Arbitrage — менш вредоносний для вас, але показує наскільки мемпул прозорий. Арбітражники реагують на ваші транзакції в межах одного блока.
Архітектура приватної доставки транзакцій
Flashbots: базова інфраструктура
Flashbots — це дослідницька організація, яка створила MEV-Boost та Flashbots Protect. З переходу на PoS більшість Ethereum блоків будуються через PBS (Proposer-Builder Separation): validator пропонує блок, але сам його не будує — вибирає найкращий bid від 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 процес, він приймає bid від 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 до/після







