Sandwich-атака возникает, когда бот замечает будущий обмен в публичной очереди транзакций и размещает свои операции до и после него. Первая операция сдвигает цену в пуле против пользователя, пользовательский обмен проходит по менее выгодному курсу, а вторая операция фиксирует результат бота. Возможность такой последовательности создают публичность заявки, ликвидность пула и слишком широкие условия исполнения.
Как выглядит sandwich в блокчейне
Пусть пользователь хочет купить токен через автоматический маркет-мейкер. Подписанная транзакция попадает в публичный мемпул. Бот видит сумму, выбранный пул и минимально допустимый результат. Он покупает тот же токен раньше, из-за чего его цена в пуле растёт. Затем выполняется заявка пользователя. Сразу после неё бот продаёт ранее купленные токены по уже сдвинутой цене.
Пользователь не получает меньше установленного им минимума, иначе контракт отменил бы обмен. Проблема в том, что минимум был выбран слишком низко и оставил боту пространство для манёвра. Комиссии сети, комиссии пула и риск неудачи ограничивают прибыль атакующего, поэтому мелкая операция в глубоком пуле обычно менее привлекательна, чем крупный обмен в тонкой ликвидности.
Не каждое плохое исполнение является атакой. Цена могла измениться из-за обычной торговли, маршрут мог пройти через несколько пулов, а собственный ордер пользователя мог заметно сдвинуть курс. Различие между проскальзыванием и price impact важно проверить до вывода о действиях бота.
Настройте ограничение результата, а не максимальный допуск
Главная защита на уровне заявки – разумный минимум получаемых токенов. Интерфейс часто показывает его через процент допустимого проскальзывания. Чем шире допуск, тем дальше цена может уйти и всё равно пройти проверку контракта. Не увеличивайте процент автоматически после ошибки. Сначала выясните её причину: курс действительно изменился, токен удерживает комиссию при переводе или для сделки недостаточно газа.
Слишком узкий допуск тоже не бесплатен. В активном рынке транзакция может отмениться, а комиссия сети будет потрачена. Поэтому нет одного безопасного процента для всех токенов. Смотрите на глубину конкретного пула, размер операции, ожидаемый price impact и текущую волатильность. Минимальный результат должен защищать от неприемлемого курса, но оставаться реалистичным для исполнения.
Уменьшите привлекательность заявки для бота
Проверьте альтернативные пулы и маршруты с большей ликвидностью. Один и тот же токен может торговаться в нескольких парах, но длинный маршрут добавляет комиссии и новые точки проскальзывания. Сравнивайте не рекламный курс, а итоговую сумму после всех переходов. Также обращайте внимание на ценовое влияние именно вашей сделки.
Крупный обмен иногда разумно разделить, но механическое дробление не гарантирует экономию. Несколько транзакций увеличивают расходы на газ и дольше раскрывают намерение рынку. Сравните один ордер, несколько частей и лимитное исполнение, если выбранный протокол действительно поддерживает его. Для малоликвидного токена безопаснее сократить размер позиции, чем пытаться протолкнуть весь объём широким допуском.
Некоторые кошельки и DEX предлагают защищённую или приватную отправку, при которой заявка не появляется в обычном публичном мемпуле до включения в блок. Такая функция может уменьшить видимость для публичных ботов, но создаёт доверие к посреднику или строителю блока и не гарантирует лучший курс. Проверьте, кто принимает заявку, что происходит при задержке и можно ли вернуть обычный способ отправки.
Пошаговая проверка перед подтверждением обмена
- Сверьте сеть, адрес контракта токена и адрес DEX. Название и значок токена не являются идентификатором.
- Посмотрите ожидаемый результат, минимально получаемую сумму, price impact и комиссии маршрута.
- Сравните ликвидность доступных пулов и убедитесь, что маршрут не использует неизвестный промежуточный актив.
- Установите предел, при котором вы действительно готовы совершить обмен, а не максимально разрешённое интерфейсом значение.
- Для значимой суммы проведите небольшой тест, затем заново оцените курс основной операции.
- Подтвердите в кошельке именно обмен и нужную сумму, не выдавая лишнее разрешение контракту.
Адрес токена можно проверить по инструкции о проверке контракта, а ненужные лимиты списания – по руководству об отзыве разрешений. Эти меры не останавливают sandwich напрямую, но защищают от подмены актива и избыточных полномочий, которые часто сопровождают рискованный обмен.
Как проверить уже выполненную операцию
Откройте транзакцию и найдите обмены в том же блоке непосредственно перед и после неё. Для классической схемы характерны операции с тем же пулом и противоположным направлением: адрес покупает перед пользователем и продаёт после него. Нужно учитывать маршрутизаторы и внутренние вызовы, поэтому простого совпадения токена недостаточно. Сравните события пула, фактические входящие суммы и порядок транзакций.
Зафиксируйте хеш своей транзакции, адрес пула, номер блока, ожидаемый и фактический результат. Это публичные данные, их можно передать поддержке DEX или кошелька. Seed-фраза, приватный ключ, пароль и коды 2FA для анализа не нужны. Никто не может отменить подтверждённый обмен или вернуть «потерянное проскальзывание» с помощью секретов кошелька.
Полностью исключить изменение цены в публичном рынке нельзя. Практичная цель – задать приемлемый минимум, выбрать глубокую ликвидность, не раскрывать крупный предсказуемый ордер без необходимости и проверить фактическое исполнение. Для понимания автоматического поиска таких последовательностей пригодится материал о MEV и фронтраннинге.



