В блоге Академии EXMON мы уже публиковали статью о том, как MEV-боты грабят обычных пользователей в «темном лесу» мемпула. Сегодня мы переходим к практике и закладываем фундамент нашего инструмента. Наша цель - научиться отправлять транзакции в обход публичного мемпула напрямую валидаторам.
1. Концепция Bundles: Почему это безопасно?
Обычно ваша транзакция после отправки попадает в mempool — публичный лист ожидания. Там её видят все: от обычных узлов до хищных MEV-ботов. Последние анализируют её и, если она сулит выгоду (например, крупный свап), проводят «сэндвич-атаку».
Flashbots предлагает альтернативный путь — Bundles (Бандлы). Это пакеты из одной или нескольких транзакций, которые передаются напрямую валидаторам через приватный реле-сервер.
Ключевые преимущества бандлов:
- Невидимость: Транзакция не появляется в мемпуле. О ней узнают только тогда, когда она уже включена в блок. У ботов нет времени на реакцию.
- Атомарность: Либо выполняются все транзакции в пакете, либо ни одной. Это исключает риск того, что ваша сделка пройдет частично или в невыгодных условиях.
- Отсутствие платы за неудачу: Если бандл не включен в блок (например, из-за низкой цены газа), вы не платите комиссию за неудачную транзакцию (Revert).
2. Подготовка инфраструктуры
Для работы нам понадобятся две вещи: доступ к Ethereum-ноде и два приватных ключа.
Зачем два ключа?
- SENDER_PRIVATE_KEY: Ваш основной кошелек, на котором лежат средства для обмена и оплаты газа.
- FLASHBOTS_AUTH_KEY: Это «ключ идентификации». Он должен принадлежать новому, абсолютно пустому кошельку. Flashbots использует его для создания вашей «репутации» как отправителя. Если вы будете спамить плохими бандлами, этот ключ попадет в черный список, но ваши деньги на основном кошельке останутся в безопасности.
Настройка окружения
Создайте файл .env в корне проекта:
ETH_RPC_URL=https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY
SENDER_PRIVATE_KEY=ваш_основной_ключ
FLASHBOTS_AUTH_KEY=ваш_пустой_ключ_репутации
3. Инициализация Stealth-провайдера
Мы будем использовать TypeScript, Ethers.js v6 и официальную библиотеку Flashbots SDK.
Установите зависимости: npm install ethers @flashbots/ethers-provider-bundle dotenv
Ниже представлен код инициализации нашего инструмента:
import { ethers } from "ethers";
import { FlashbotsBundleProvider } from "@flashbots/ethers-provider-bundle";
import * as dotenv from "dotenv";
dotenv.config();
async function initStealthProvider() {
// 1. Подключаемся к стандартной ноде (Alchemy/Infura)
const provider = new ethers.JsonRpcProvider(process.env.ETH_RPC_URL);
// 2. Инициализируем кошельки
const wallet = new ethers.Wallet(process.env.SENDER_PRIVATE_KEY!, provider);
const authSigner = new ethers.Wallet(process.env.FLASHBOTS_AUTH_KEY!, provider);
// 3. Создаем Flashbots-провайдер
// Это наш приватный туннель к валидаторам
const flashbotsProvider = await FlashbotsBundleProvider.create(
provider,
authSigner,
"https://relay.flashbots.net", // Адрес реле основной сети
"mainnet"
);
return { wallet, flashbotsProvider, provider };
}
async function main() {
try {
const { wallet, flashbotsProvider } = await initStealthProvider();
console.log("--- Stealth Infrastructure Ready ---");
console.log(`Main Wallet: ${wallet.address}`);
console.log(`Relay: https://relay.flashbots.net`);
} catch (error) {
console.error("Ошибка инициализации:", error);
}
}
main();
Что мы получили?
На данном этапе мы построили «защищенный канал связи». Мы не просто подключаемся к блокчейну, мы авторизуемся в сети Flashbots.
Важный нюанс: Flashbots — это аукцион. Чтобы ваш бандл был выбран валидатором, он должен быть выгоднее других. В следующей части мы научимся правильно рассчитывать комиссии и сформируем саму транзакцию обмена (Swap) через Uniswap V3, которую не увидит ни один бот-сканер.
В следующей статье: Формируем Bundle, симулируем транзакцию и учимся обходить проверку баланса.