Разработка системы защиты от сэндвич-атак
Средний убыток пользователя от сэндвич-атаки составляет $100–200, а для крупных свопов может достигать $10 000. Внедрение защиты позволяет экономить до $20 000 в месяц на потерях от MEV. Мы — команда с 5-летним опытом в блокчейн-разработке, реализовали более 50 проектов по защите DeFi-протоколов. Свяжитесь с нами для бесплатной оценки вашего проекта.
Сэндвич-атака — форма MEV, при которой атакующий встраивается перед и после транзакции пользователя в публичном mempool. На Uniswap-подобных AMM это приводит к потере до 5% суммы свопа для обычного пользователя. Мы помогаем проектам устранить эту уязвимость на уровне смарт-контрактов и инфраструктуры. Если ваш проект страдает от MEV, получите консультацию эксперта уже сегодня.
Как работает сэндвич-атака и почему это проблема?
Для понимания защиты разберём механизм атаки. Публичный mempool позволяет MEV-ботам видеть все pending транзакции. Бот анализирует параметры свопа (адрес токена, сумму, slippage tolerance) и вычисляет, сколько нужно купить перед жертвой и продать после, чтобы получить прибыль. Чем выше допустимый slippage у пользователя, тем шире окно для атаки. По данным EigenPhi, крупные sandwich-боты на Ethereum зарабатывали сотни тысяч долларов в неделю за счёт обычных пользователей. Источник: EigenPhi. По данным Wikipedia, сэндвич-атаки составляют до 30% всех MEV-транзакций.
Уязвимость лежит в детерминированности price impact: для AMM с формулой x*y=k атакующий точно рассчитывает, какой объём фронтран-свапа даст максимальную прибыль. Слабые места — high slippage и публичность mempool.
Какие методы защиты мы применяем?
Мы используем три уровня защиты: на уровне транзакций, смарт-контрактов и архитектуры протокола. Ниже сравниваем основные подходы:
| Метод | Эффективность | Сложность внедрения | UX |
|---|---|---|---|
| Приватный RPC (Flashbots Protect) | Снижает риск на 95% | Низкая (1–2 нед.) | Без изменений |
| Commit-reveal контракт | Блокирует 99% атак | Средняя (2–3 нед.) | Два шага (тяжёлый UX) |
| Batch auction (CoW Protocol) | Полностью устраняет | Высокая (2–4 мес.) | Без изменений |
| Динамический slippage | Снижает на 50–70% | Средняя (2–3 нед.) | Автоматический |
Commit-reveal схема в 2 раза эффективнее динамического slippage при защите от целенаправленных атак с высоким slippage.
Приватные RPC и MEV-protection провайдеры
Самая быстрая защита — отправлять транзакции не в публичный mempool, а напрямую блок-строителям. Flashbots Protect направляет транзакции в Flashbots bundle — атакующий их не видит. MEV Blocker от CoW Protocol конкурентно исполняет своп через нескольких searcher'ов и возвращает часть MEV пользователю. Bloxroute предлагает защищённые каналы за плату. Ниже сравнение провайдеров:
| Провайдер | Тип | Стоимость | Дополнительные функции |
|---|---|---|---|
| Flashbots Protect | Приватный relay | Бесплатно (газ) | Поддержка bundle, совместимость с ethers.js |
| MEV Blocker (CoW) | Аукцион searcher'ов | 0% комиссии | Возврат MEV пользователю |
| Bloxroute | Защищённый канал | Платный | Низкая задержка, приватный поток |
// Использование Flashbots Protect через ethers.js
const { FlashbotsBundleProvider } = require('@flashbots/ethers-provider-bundle');
const { ethers } = require('ethers');
async function protectedSwap(swapParams, wallet, provider) {
// Подключаемся к Flashbots relay
const flashbotsProvider = await FlashbotsBundleProvider.create(
provider,
wallet,
'https://relay.flashbots.net'
);
// Собираем swap транзакцию как обычно
const swapTx = await buildSwapTransaction(swapParams);
// Отправляем через Flashbots
const bundleSubmission = await flashbotsProvider.sendPrivateTransaction(
{
signer: wallet,
transaction: swapTx
},
{ maxBlockNumber: (await provider.getBlockNumber()) + 10 }
);
const receipt = await bundleSubmission.wait();
return receipt;
}
Пример реализации commit-reveal контракта
contract CommitRevealSwap {
mapping(bytes32 => Commitment) public commitments;
struct Commitment {
address user;
uint256 blockNumber;
bool revealed;
}
uint256 public constant MIN_BLOCKS_BEFORE_REVEAL = 1;
uint256 public constant MAX_BLOCKS_BEFORE_REVEAL = 10;
function commit(bytes32 commitHash) external {
commitments[commitHash] = Commitment({
user: msg.sender,
blockNumber: block.number,
revealed: false
});
}
function reveal(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
bytes32 salt
) external {
bytes32 commitHash = keccak256(abi.encodePacked(
msg.sender, amountIn, amountOutMin,
keccak256(abi.encode(path)), salt
));
Commitment storage commitment = commitments[commitHash];
require(commitment.user == msg.sender, "Not your commit");
require(!commitment.revealed, "Already revealed");
require(
block.number >= commitment.blockNumber + MIN_BLOCKS_BEFORE_REVEAL,
"Too early"
);
require(
block.number <= commitment.blockNumber + MAX_BLOCKS_BEFORE_REVEAL,
"Expired"
);
commitment.revealed = true;
_executeSwap(amountIn, amountOutMin, path, msg.sender);
}
}
Batch Auctions: архитектурное решение CoW Protocol
CoW Protocol решает проблему на уровне архитектуры. Заявки собираются за период (несколько блоков), off-chain solver находит оптимальное исполнение для всего батча, публикуется единая settlement-транзакция с uniform price. В batch auction нет места для сэндвича: атакующий не может встроиться между заявкой и исполнением, так как они разнесены во времени.
Обычный AMM:
Block N: frontrun_buy → user_swap → backrun_sell
CoW Batch Auction:
Block N: submit_order(user1), submit_order(user2), ...
Block N+3: solver publishes settlement_tx с uniform price
Как мы проектируем систему защиты?
Процесс состоит из пяти этапов:
- Аналитика — изучаем ваш протокол, смарт-контракты, типичные транзакции пользователей, текущий уровень MEV-активности.
- Проектирование — выбираем комбинацию методов защиты под ваши требования (безопасность, UX, бюджет).
- Реализация — пишем смарт-контракты (Solidity), интегрируем приватные RPC, настраиваем динамический slippage.
- Тестирование — покрываем unit-тестами и fuzzing (Echidna), прогоняем на тестнете, симулируем сэндвич-атаки.
- Деплой и мониторинг — разворачиваем на mainnet, подключаем мониторинг MEV-активности (Tenderly, собственные дашборды).
Мы гарантируем прозрачность: каждый этап сопровождается документацией, предоставляем доступ к репозиторию и обучение вашей команды.
Что входит в работу
- Аудит текущей архитектуры и выявление уязвимостей к сэндвич-атакам.
- Разработка и внедрение выбранных методов защиты.
- Исходный код смарт-контрактов (Solidity) с покрытием тестами.
- Настройка приватных RPC (Flashbots, MEV Blocker) — конфигурация и интеграция.
- Документация по эксплуатации и инструкция для пользователей.
- Мониторинговая система с алертами при всплеске MEV-активности.
- Техническая поддержка в течение 3 месяцев после деплоя.
Сроки и стоимость
Сроки зависят от сложности: интеграция приватного RPC — от 1 недели, commit-reveal контракт — от 2 недель, полная система с мониторингом — от 4 недель. Batch auction протокол — от 2 месяцев. Стоимость рассчитывается индивидуально под ваш проект — пишите, мы оценим задачу в течение 2 рабочих дней.
Мониторинг и детекция атак
Для постоянной защиты мы внедряем компонент мониторинга, который отслеживает активность MEV-ботов, анализирует потери пользователей и отправляет алерты при аномальном всплеске сэндвичей. Экономия от внедрения такой системы может достигать $15 000 в месяц.
async function detectSandwichInBlock(blockNumber, provider, uniswapAddress) {
const block = await provider.getBlock(blockNumber, true);
const uniswapTxs = block.transactions.filter(
tx => tx.to?.toLowerCase() === uniswapAddress.toLowerCase()
);
const sandwiches = [];
for (let i = 1; i < uniswapTxs.length - 1; i++) {
const prev = uniswapTxs[i - 1];
const current = uniswapTxs[i];
const next = uniswapTxs[i + 1];
if (prev.from === next.from && prev.from !== current.from) {
const prevDecoded = decodeSwap(prev.data);
const nextDecoded = decodeSwap(next.data);
if (prevDecoded && nextDecoded &&
prevDecoded.tokenIn === nextDecoded.tokenOut) {
sandwiches.push({
attacker: prev.from,
victim: current.from,
frontrunTx: prev.hash,
victimTx: current.hash,
backrunTx: next.hash,
estimatedProfit: calculateSandwichProfit(prevDecoded, nextDecoded)
});
}
}
}
return sandwiches;
}
Получите консультацию эксперта по защите DeFi уже сегодня. Свяжитесь с нами для бесплатной оценки вашего проекта.







