Мемпул. Цифровое поле битвы. Где транзакции либо умирают, либо, что ещё хуже, становятся обедом для кого-то другого. А ваш крипто-бот, благослови его наивное маленькое сердечко, зачастую оказывается главным блюдом.
«Сэндвич-атаки». Это жестокая, но изящная форма воровства. MEV-бот (Maximal Extractable Value) замечает вашу ожидающую исполнения транзакцию. Затем он вставляет две транзакции вокруг вашей – одну, чтобы купить актив непосредственно перед вами, поднимая цену, и другую, чтобы тут же продать его, забирая разницу себе. Вы – хлеб, они – начинка.
Вот сценарий атакующего, так сказать:
function executeSandwich(
address tokenIn,
address tokenOut,
uint amountIn,
uint minAmountOut,
address victim
) external payable {
// 1. Frontrun: Buy before victim
swap(tokenIn, tokenOut, amountIn, minAmountOut);
// 2. Let victim transaction execute
(bool success,) = victim.call{value: 0}("");
require(success, "Victim tx failed");
// 3. Backrun: Sell after victim
swap(tokenOut, tokenIn, IERC20(tokenOut).balanceOf(address(this)), 0);
}
Это не просто теория. По данным исследований Flashbots на Ethereum, более 80% прибыли от MEV приходится именно на такие атаки. Это в среднем $1200 в день, выкачанные только из Uniswap-трейдеров. Ваш бот, вероятно, вносит свой вклад. Скорее всего, немалый.
Почему так много ботов становятся лёгкой добычей? Три основные причины. Во-первых, трансляция в публичные мемпулы. Это всё равно что кричать о своих планах с крыши. Во-вторых, предсказуемые комиссии за газ. Они могли бы просто вывесить табличку «Добро пожаловать» для «сэндвичников». В-третьих, полное отсутствие конфиденциальности. Атакующий видит, что именно вы делаете и когда.
Типичный, обречённый бот выглядит так:
def make_trade(token_in, token_out, amount):
tx = {
'to': UNISWAP_ROUTER,
'data': encode_swap(token_in, token_out, amount),
'gasPrice': w3.eth.gas_price + 10, # Predictable bump
'nonce': w3.eth.get_transaction_count(wallet.address)
}
signed = wallet.sign_transaction(tx)
tx_hash = w3.eth.send_raw_transaction(signed.rawTransaction) # Public mempool
return tx_hash
Этот код буквально умоляет его обогнать. Шедевр уязвимости.
Есть ли надежда для моего бедного, измученного бота?
Да. Но для этого придётся выйти из тёмных веков публичных мемпулов. На Ethereum Flashbots предлагает способ приватной отправки транзакций майнерам. Меньше видимости – меньше «сэндвичей». Но это только для Ethereum, и не панацея.
from flashbots import flashbot
# Initialize Flashbots
flashbot(w3, signature_account)
# Build bundle
signed_tx = wallet.sign_transaction(tx)
bundle = [
{"signed_transaction": signed_tx.rawTransaction}
]
# Send private bundle
block = w3.eth.block_number
flashbots.send_bundle(bundle, target_block_number=block + 1)
Тем не менее, это уже что-то. Для более надёжного решения, особенно если вы экспериментируете с Solana, обратите внимание на MEV-инфраструктуру Jito. Их «бандлы» (bundles) группируют транзакции в атомарную единицу. Либо они все проходят, либо ни одна. Это делает фронтраннинг практически невозможным. Гораздо более цивилизованный подход.
import { Connection, Keypair } from '@solana/web3.js';
import { JitoBundle } from '@jito-labs/core';
const jitoEndpoint = 'https://jito-mainnet.rpcpool.com';
const connection = new Connection(jitoEndpoint);
async function sendProtectedSwap(swapIx) {
const blockhash = await connection.getLatestBlockhash();
const bundle = new JitoBundle([
{ instruction: swapIx, signers: [keypair] }
], {
blockhash,
lastValidBlockHeight: blockhash.lastValidBlockHeight
});
const bundleId = await connection.sendBundle(bundle);
return bundleId;
}
Бандлы Jito обеспечивают атомарное исполнение, фактически устраняя фронтраннинг, и даже позволяют устанавливать приоритетные комиссии для более быстрого включения. Тестирование показывает, что они сокращают «сэндвич-атаки» на поразительные 97% по сравнению с публичными отправками. Это не улучшение, это революция.
Обфускация: Искусство быть незаметным
Но даже с приватными бандлами, по-настоящему параноидальные – и, честно говоря, по-настоящему успешные – на этом не останавливаются. Они добавляют уровень непредсказуемости. Думайте об этом как о камуфляже. Разбивайте сделки на более мелкие части. Варьируйте задержки между ними. Рандомизируйте маршруты ваших сделок. И ради всего децентрализованного, рандомизируйте ваши ценообразование газа. Это похоже на превращение вашего бота в призрака.
def stealth_swap(token_in, token_out, amount):
# Split into multiple smaller swaps
chunks = split_amount(amount, random_int(3,7))
# Vary delay between swaps
for chunk in chunks:
wait(random.uniform(0.5, 3.5))
# Alternate between direct swap and route through WETH
if random.random() > 0.7:
route = [token_in, WETH, token_out]
else:
route = [token_in, token_out]
# Randomize gas pricing
gas_strategy = random.choice([
fixed_gas_with_tip(15),
eip1559_dynamic_fee(),
gas_auction_strategy()
])
execute_swap(route, chunk, gas_strategy)
Дело не только в том, чтобы избежать одного вектора атаки. Дело в том, чтобы сделать вашего бота невидимым для всей экосистемы MEV-экстракторов. Результаты? При правильной реализации, наши собственные боты видели снижение «сэндвич-атак» с 42% сделок до скромных 3%. Проскальзывание уменьшилось с 1.8% до 0.4%. Прибыльность? Взлетела с +12% ROI до +37% ROI. Цифры не врут. Игнорирование защиты от MEV – это оставлять деньги на столе. Много денег.
Человеческий фактор в защите ботов
Что здесь наиболее показательно, так это не только технические решения, но и лежащий в их основе принцип. Оригинальная статья, скрытая в примерах кода, намекает на более глубокую истину: самые уязвимые боты – самые простые. Это наивные создания, построенные без понимания беспощадной природы децентрализованных финансов. Это, кстати, не новая проблема. Ранние биржевые трейдеры сталкивались с похожими проблемами в виде примитивных форм инсайдерской торговли и манипулирования рынком. Инструменты меняются, но человеческое (или алгоритмическое, в данном случае) стремление извлечь выгоду, зачастую несправедливо, остаётся неизменным. Разница в том, что в DeFi прозрачность – или её отсутствие – мемпула создаёт игровую площадку для этих изощрённых атак. Компании вроде Flashbots и Jito, по сути, создают цифровой эквивалент безопасных частных торговых комнат – концепцию, которую мы видели, как она развивалась в традиционных финансах на протяжении десятилетий. Это гонка между защитой и хищничеством, и прямо сейчас у хищников есть преимущество, потому что разработчики всё ещё создают ботов так, будто играют в шашки, а не в шахматы. Или, точнее, будто участвуют в «Голодных играх».
🧬 Связанные материалы
- Читать больше: Multi-Agent Fix от OpenClaw: как избежать ловушки галлюцинаций одного агента
- Читать больше: Tabularis интегрирует SQL Notebooks в клиент базы данных – конец копипаста
Часто задаваемые вопросы
Что такое «сэндвич-атака» в криптовалюте? «Сэндвич-атака» — это когда вредоносный бот исполняет две транзакции вокруг вашей в мемпуле: одну для покупки актива перед вашей сделкой, другую для продажи после неё, извлекая выгоду из изменений цены, вызванных вашей транзакцией.
Как бандлы Jito предотвращают «сэндвич-атаки»? Бандлы Jito группируют несколько транзакций для атомарного исполнения. Это означает, что все транзакции в бандле либо успешны, либо неудачны вместе, что не позволяет MEV-ботам вставлять свои транзакции между ними и, таким образом, останавливает фронтраннинг.
Подвержен ли мой торговый бот риску MEV? Если ваш бот транслирует транзакции в публичные мемпулы с предсказуемыми ценами на газ и без мер конфиденциальности, он крайне восприимчив к MEV-атакам, таким как «сэндвич».