Настройка MEV-защиты транзакций

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1306 услуг
Настройка MEV-защиты транзакций
Средний
от 1 дня до 3 дней
Часто задаваемые вопросы

Направления блокчейн-разработки

Этапы блокчейн-разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1306
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1218
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    920
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1147
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    610
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    885

Разработка системы защиты от фронтраннинга

Фронтраннинг в блокчейне — это использование публичности 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 недели в зависимости от механики.