Разработка системы защиты от фронтраннинга
Фронтраннинг в блокчейне — это использование публичности mempool для извлечения прибыли за счёт других транзакций. MEV (Maximal Extractable Value) — более широкое понятие: вся ценность, которую может извлечь включение/исключение/переупорядочивание транзакций в блоке. Sandwich attacks, arbitrage, liquidation MEV — это всё MEV. Пользователи ежедневно теряют миллионы долларов на sandwich атаках только на Ethereum.
Защита строится на нескольких уровнях: transaction privacy, commit-reveal schemes, специализированные RPC, on-chain slippage controls.
Как работает sandwich атака
Атакующий мониторит mempool, видит крупный swap (например, 50 ETH в USDC через Uniswap). До этой транзакции он вставляет свою — купить ETH (поднимая цену). После жертвы — продаёт ETH по поднятой цене. Жертва получает USDC по худшей цене, атакующий извлекает разницу.
Ключевые условия: достаточно высокий slippage tolerance у жертвы (чтобы транзакция не ревертилась), достаточный размер свопа для покрытия газа атакующего.
Блок N:
tx[0]: Attacker buys ETH (frontrun) — газ выше чем у жертвы
tx[1]: Victim swaps 50 ETH → USDC (по завышенной цене)
tx[2]: Attacker sells ETH (backrun) — газ ниже чем у жертвы
Защита 1: Private RPC / MEV-блокировщики
Самый простой и эффективный способ для пользователей: отправлять транзакции через private mempool, минуя публичный mempool Ethereum.
Flashbots Protect RPC (https://rpc.flashbots.net) — бесплатный endpoint. Транзакции идут напрямую в Flashbots bundle builders, минуя публичный mempool. Не подходят для быстрых арбитражных транзакций, но отлично для обычных пользовательских swap-ов.
MEV Blocker (https://rpc.mevblocker.io) — от CoW Protocol и команды Gnosis. Отправляет транзакции нескольким builders одновременно, первый включивший получает эксклюзивный доступ к backrun (без frontrun). Backrun прибыль возвращается пользователю как kickback.
Интеграция в dApp: добавить альтернативный RPC endpoint как опцию в wallet connection:
const mevProtectedProvider = new ethers.JsonRpcProvider(
'https://rpc.mevblocker.io',
{ chainId: 1, name: 'mainnet' }
)
// Или через wagmi config
const config = createConfig({
chains: [mainnet],
transports: {
[mainnet.id]: http('https://rpc.mevblocker.io'),
},
})
Защита 2: Commit-Reveal схема
Для протоколов где важна конфиденциальность параметров до исполнения (аукционы, лотереи, некоторые AMM). Двухфазный процесс:
Commit: пользователь отправляет hash(action + secret) — скрытое намерение.
Reveal: после deadline все участники раскрывают секреты, действия исполняются.
contract CommitRevealAuction {
mapping(address => bytes32) public commitments;
mapping(address => bool) public revealed;
uint256 public commitDeadline;
uint256 public revealDeadline;
// Фаза 1: commit
function commit(bytes32 commitment) external {
require(block.timestamp < commitDeadline, "Commit phase over");
commitments[msg.sender] = commitment;
}
// Фаза 2: reveal
function reveal(uint256 bidAmount, bytes32 secret) external {
require(block.timestamp >= commitDeadline, "Still in commit phase");
require(block.timestamp < revealDeadline, "Reveal phase over");
require(!revealed[msg.sender], "Already revealed");
bytes32 expectedCommitment = keccak256(abi.encodePacked(bidAmount, secret, msg.sender));
require(commitments[msg.sender] == expectedCommitment, "Invalid reveal");
revealed[msg.sender] = true;
_processBid(msg.sender, bidAmount);
}
}
Уязвимость commit-reveal: если reveal транзакции видны в mempool — атакующий может frontrun последний reveal, видя успешные ставки других. Защита: encrypted reveal через threshold encryption (SUAVE, Shutter Network).
Защита 3: Slippage controls on-chain
Жёсткие on-chain ограничения slippage не защищают от sandwich (атака подстраивается под tolerance), но ограничивают потенциальный ущерб.
Uniswap v3 sqrtPriceLimitX96 — hard limit на цену исполнения. Если цена выходит за лимит — swap останавливается (partial fill), не ревертируется полностью. Это лучше чем откат всей транзакции при минимальном slippage.
Для AMM с кастомной ценовой механикой — добавить minAmountOut проверку:
function swap(
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 minAmountOut // slippage protection
) external returns (uint256 amountOut) {
amountOut = _executeSwap(tokenIn, tokenOut, amountIn);
require(amountOut >= minAmountOut, "Slippage exceeded");
return amountOut;
}
minAmountOut должен рассчитываться frontend с учётом реального slippage (обычно 0.1-1%). Рекомендовать пользователям максимальный slippage 0.5% — снижает эффективность sandwich атак.
Защита 4: TWAP для on-chain pricing
Протоколы, использующие AMM spot price для расчётов (liquidation price, collateral valuation) — уязвимы к flash loan манипуляции. TWAP (time-weighted average price) из Uniswap v3 устойчив к одноблочным манипуляциям.
// Получить TWAP за последние 30 минут из Uniswap v3
function getTWAP(address pool, uint32 twapInterval) internal view returns (uint256 price) {
uint32[] memory secondsAgos = new uint32[](2);
secondsAgos[0] = twapInterval; // 1800 секунд = 30 минут
secondsAgos[1] = 0;
(int56[] memory tickCumulatives,) = IUniswapV3Pool(pool).observe(secondsAgos);
int56 tickCumulativesDelta = tickCumulatives[1] - tickCumulatives[0];
int24 timeWeightedAverageTick = int24(tickCumulativesDelta / int32(twapInterval));
price = TickMath.getSqrtRatioAtTick(timeWeightedAverageTick);
// Конвертировать sqrtPriceX96 в обычную цену
}
30-минутный TWAP означает что атакующему нужно поддерживать искажённую цену в течение 30 минут — это дорого и экономически нецелесообразно.
Защита 5: EIP-3074 и EIP-7702 (будущее)
EIP-7702 (активен в Pectra upgrade 2025) позволяет EOA временно делегировать выполнение контракту. Это открывает путь к transaction bundles на уровне кошелька — несколько транзакций атомарно, что делает sandwich невозможным (нельзя вставить транзакцию внутрь атомарного bundle).
Для новых протоколов, ориентированных на Pectra-совместимые кошельки — это перспективная архитектура защиты.
Сравнение подходов
| Метод | Защита от sandwich | Сложность | Влияние на UX |
|---|---|---|---|
| Private RPC | Высокая | Минимальная | Минимальное |
| Commit-Reveal | Высокая | Высокая | Высокое (2 tx) |
| Slippage controls | Частичная | Низкая | Нет |
| TWAP oracle | Flash loan protection | Средняя | Нет |
| MEV Blocker | Высокая + rebate | Минимальная | Минимальное |
Практическая рекомендация: для dApp — интегрировать MEV Blocker или Flashbots Protect RPC как default транспорт + жёсткие рекомендации по slippage (max 0.5% для стейблкоинов, max 1% для волатильных активов). Это закрывает 90% sandwich векторов без архитектурных изменений.
Разработка кастомной системы защиты (commit-reveal для аукциона, TWAP интеграция) — 2-4 недели в зависимости от механики.







