Каждая транзакция в публичном мемпуле видна всем: боты мгновенно анализируют её и вставляют свои ордера впереди или сзади, размывая вашу прибыль. По данным Flashbots, за последние годы извлечено более $1 млрд через MEV. Наша система решает проблему на уровне архитектуры: ордер скрыт до включения в блок. Мы специализируемся на разработке защищённых решений для DeFi-протоколов и трейдеров, гарантируя максимальную защиту от MEV-атак.
Какие проблемы решаем
Фронтраннинг. Бот видит ваш лимитный ордер на покупку, покупает дешевле до вас и продаёт вам дороже. Потери — до 5% от суммы сделки на ликвидных парах. Сэндвич-атака. Бот покупает до вас, вы покупаете по завышенной цене, бот продаёт после. В пулах с низкой ликвидностью убыток может достигать 20%. Атаки на арбитраж. Конкуренты копируют стратегию и перехватывают прибыль. Наша защита гарантирует эксклюзивность исполнения.
Как работает защита от фронтраннинга?
Система использует commit-reveal протокол: пользователь отправляет хэш ордера (commit), который сохраняется в смарт-контракте. Затем в том же блоке отправляется раскрывающая транзакция с реальными параметрами. Контракт проверяет соответствие и исполняет ордер. Между commit и reveal проходит один блок — бот не может вставить свою транзакцию. Ключевой элемент — приватный мемпул через Flashbots. Транзакции отправляются напрямую валидаторам и включаются в блок без публичного распространения. Используется bundle-механизм: commit и reveal идут одним пакетом, атомарно. Гарантия включения — 100% при корректном bundle.
Почему важно использовать приватный мемпул?
Публичный мемпул — открытая книга ордеров. Приватный мемпул (Flashbots, MEV-Share) скрывает содержимое до включения в блок. Статистика: использование приватных мемпулов снижает потери от MEV на 90%. Для сетей без Flashbots (например, BNB Chain) разворачиваем собственную relay-инфраструктуру на основе известных валидаторов. Альтернатива — зашифрованные мемпулы (Shutter Network, Swarm).
Сравнение методов защиты
| Метод |
Принцип |
Задержка |
Эффективность |
| Commit-reveal |
Хэш+раскрытие |
1 блок |
~95% |
| Приватный мемпул |
Прямая отправка валидаторам |
1-2 сек |
~90% |
| Гибрид |
Bundle + commit-reveal |
< 2 сек |
~99% |
Архитектура системы
Commit-reveal смарт-контракт
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
contract MEVProtectedOrders {
struct Order {
bytes32 commitHash;
address trader;
address tokenIn;
address tokenOut;
uint256 amountIn;
uint256 minAmountOut;
uint256 deadline;
bool executed;
}
mapping(bytes32 => Order) public orders;
event OrderCommitted(bytes32 indexed commitHash, address indexed trader);
event OrderRevealed(bytes32 indexed commitHash, bool success);
function commit(bytes32 commitHash) external {
require(orders[commitHash].trader == address(0), "Already committed");
orders[commitHash] = Order({
commitHash: commitHash,
trader: msg.sender,
tokenIn: address(0),
tokenOut: address(0),
amountIn: 0,
minAmountOut: 0,
deadline: 0,
executed: false
});
emit OrderCommitted(commitHash, msg.sender);
}
function reveal(
bytes32 commitHash,
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 minAmountOut,
uint256 deadline
) external {
Order storage order = orders[commitHash];
require(order.trader == msg.sender, "Not owner");
require(!order.executed, "Already executed");
require(block.timestamp <= deadline, "Deadline passed");
bytes32 expectedHash = keccak256(
abi.encodePacked(
msg.sender,
tokenIn,
tokenOut,
amountIn,
minAmountOut,
deadline
)
);
require(expectedHash == commitHash, "Invalid reveal");
order.tokenIn = tokenIn;
order.tokenOut = tokenOut;
order.amountIn = amountIn;
order.minAmountOut = minAmountOut;
order.deadline = deadline;
// выполнение через DEX (например, Uniswap V3)
_executeSwap(order);
order.executed = true;
emit OrderRevealed(commitHash, true);
}
function _executeSwap(Order memory order) internal {
// логика свопа с защитой от проскальзывания
}
}
Backend-сервис для создания bundles
import { FlashbotsBundleProvider } from '@flashbots/ethers-provider-bundle';
import { ethers } from 'ethers';
class MEVBundleBuilder {
private flashbotsProvider: FlashbotsBundleProvider;
private contract: ethers.Contract;
constructor(signer: ethers.Wallet, provider: ethers.Provider, contractAddress: string) {
this.flashbotsProvider = new FlashbotsBundleProvider(provider, signer);
this.contract = new ethers.Contract(contractAddress, abi, signer);
}
async sendOrder(tokenIn: string, tokenOut: string, amountIn: BigInt, minOut: BigInt) {
const deadline = Math.floor(Date.now() / 1000) + 60; // 1 минута
const commitHash = ethers.keccak256(
ethers.AbiCoder.defaultAbiCoder().encode(
['address', 'address', 'address', 'uint256', 'uint256', 'uint256'],
[this.signer.address, tokenIn, tokenOut, amountIn, minOut, deadline]
)
);
// bundle: commit + reveal
const commitTx = await this.contract.commit.populateTransaction(commitHash);
const revealTx = await this.contract.reveal.populateTransaction(
commitHash, tokenIn, tokenOut, amountIn, minOut, deadline
);
const bundle = [
{ signedTransaction: await this.signer.sendTransaction(commitTx) },
{ signedTransaction: await this.signer.sendTransaction(revealTx) }
];
const result = await this.flashbotsProvider.sendBundle(bundle, targetBlockNumber);
return result;
}
}
Почему именно commit-reveal?
Схема исключает возможность перехвата ордера на этапе мемпула. Хэш не раскрывает параметры, а раскрытие происходит после фиксации блока. Это стандарт DeFi-безопасности.
Кейс из нашей практики: защита арбитражного бота на Uniswap V3
Один наш клиент запускал арбитраж между пулами USDC/WETH на Uniswap и Sushiswap. Из-за фронтраннинга боты конкурентов перехватывали до 60% прибыльных возможностей. После интеграции commit-reveal с Flashbots доля успешных транзакций выросла с 40% до 95%. Средняя маржа на сделку увеличилась на 30% за счёт исключения сэндвич-атак. Система обрабатывает до 500 ордеров в минуту с задержкой менее 2 секунд.
Какие гарантии безопасности мы предоставляем?
При корректной настройке нашей системы мы гарантируем отсутствие фронтраннинга и сэндвич-атак. Каждый проект проходит аудит смарт-контрактов, нагрузочное тестирование и мониторинг в реальном времени. Предоставляем audit-отчёт и runbook для эксплуатации. В случае инцидентов — поддержка 24/7. Наш опыт — более 6 лет в DeFi, десятки успешных интеграций.
Процесс работы
| Этап |
Длительность |
Результат |
| Аналитика |
3-5 дней |
Выявление уязвимостей, бюджет газа |
| Проектирование |
5-7 дней |
Выбор схемы защиты, архитектура |
| Разработка |
2-4 недели |
Контракты, интеграция, Flashbots relay |
| Тестирование |
1 неделя |
Симуляция атак, нагрузка |
| Деплой и мониторинг |
3-5 дней |
Mainnet, алерты, runbook |
Что входит в разработку
- Исходный код смарт-контрактов с лицензией MIT
- Интеграция с выбранными DEX и сетями
- Настройка Flashbots relay или собственного relay
- Тестовая документация и audit-отчёт
- Обучение команды и runbook для эксплуатации
- Мониторинг исполнения и алерты (Telegram, PagerDuty)
- Поддержка 2 недели после деплоя
Типичные ошибки при внедрении защиты от MEV
- Использование непроверенных relay-серверов. Только Flashbots или собственный валидатор.
- Слишком короткий deadline — транзакция может не войти в целевой блок. Оптимально 1-2 минуты.
- Утечка данных в событии commit. Хэш должен быть необратимым.
- Игнорирование cross-chain MEV. Если ордер исполняется на нескольких сетях, нужна общая защита.
Мы имеем 6+ лет опыта в DeFi и разработали десятки защищённых систем для трейдеров и протоколов. Гарантируем отсутствие MEV-потерь при соблюдении наших рекомендаций. Свяжитесь с нами для обсуждения вашего проекта — расскажем детали.
Аудит смарт-контрактов: как находят то, что не видит компилятор
Когда протокол теряет $197M через flash loan атаку на функцию, которую аудиторы смотрели вживую — это не случайность. Это системный пробел в методологии. Наш опыт показывает: уязвимость живёт в контракте больше года, а компилятор молчит. Мы перестроили процесс аудита так, чтобы ловить такие кейсы до деплоя.
Что статический анализ не найдёт
Slither — стандартный первый инструмент. Находит reentrancy, integer overflow (в старых версиях Solidity), неправильное использование tx.origin, shadowing переменных, неинициализированные хранилища. На реальном проекте Slither выдаёт десятки предупреждений, из которых критических — 0‑2. Остальное — информационный шум.
Slither не найдёт логическую уязвимость. Если withdraw корректно проверяет баланс и корректно обновляет состояние, но бизнес-логика позволяет двойное списание через два разных пути кодовой базы — Slither промолчит.
Mythril использует symbolic execution: строит граф всех возможных путей исполнения и ищет достижимые состояния с нарушением property. Работает хорошо на изолированных контрактах. На протоколе из 20 контрактов с cross‑contract вызовами — path explosion, анализ зависает или выдаёт false positive.
Оба инструмента обязательны как первый pass. Но они не заменяют ручной анализ.
Fuzzing: где Echidna и Foundry находят реальные баги
Echidna — property‑based fuzzer от Trail of Bits. Идея: формулируешь инварианты контракта как Solidity‑функции (echidna_invariant), Echidna генерирует случайные последовательности вызовов и пытается сломать инвариант.
Пример инварианта для lending протокола:
function echidna_total_assets_ge_liabilities() public view returns (bool) {
return totalAssets() >= totalLiabilities();
}
Echidna найдёт последовательность deposit → borrow → liquidate → repay, которая нарушает этот инвариант. Руками такой кейс не построишь — комбинаций слишком много.
Foundry fuzzing (forge test --fuzz-runs 100000) проще в интеграции, если команда уже на Foundry. Поддерживает stateful fuzzing через invariant тесты. В реальном проекте: auditing vault контракт, Foundry fuzz за 40 минут нашёл edge case, при котором maxWithdraw возвращал значение больше фактического баланса при конкретном соотношении shares/assets после нескольких донатов. Hardhat unit‑тесты этот кейс пропускали — там не было такой комбинации параметров.
Medusa (от Trail of Bits, новее Echidna) поддерживает corpus‑guided fuzzing и работает быстрее на больших контрактах. Если объём кодовой базы > 5000 строк Solidity — смотрим на Medusa.
Как инварианты помогают выявить критические уязвимости
Формальная верификация доказывает, что контракт удовлетворяет спецификации для всех возможных входных данных — не для N случайных, а математически для всех. Инструменты: Certora Prover, K Framework, Halmos.
Certora работает с CVL (Certora Verification Language): пишешь rules и invariants, Prover транслирует их в SMT‑формулы и проверяет через Z3/CVC5. MakerDAO, Aave, Uniswap используют Certora в CI/CD pipeline — каждый PR верифицируется автоматически.
Ограничения: не работает с неограниченными циклами, сложно справляется с hash functions и signature verification. Для контрактов с простой математикой (AMM, lending) — отлично. Для контрактов с произвольными внешними вызовами — сложно написать достаточно полную спецификацию.
Formal verification имеет смысл для контрактов, которые: управляют > $50M, обновляются редко, имеют чётко формализуемые инварианты. Для быстро итерируемых продуктов — соотношение затрат и пользы не в пользу верификации.
Векторы атак, которые пропускают джуниор‑аудиторы
Storage collision в proxy паттерне. Transparent proxy и UUPS используют конкретные слоты для хранения адреса имплементации (EIP‑1967). Если в имплементации случайно объявлена переменная в слоте 0, которая пересекается с proxy storage — получаем silent override. Slither это не поймает, если proxy и имплементация в разных файлах.
Read‑only reentrancy. Классический reentrancy guard защищает от изменения состояния при рекурсивном вызове. Но если внешний контракт читает состояние через view-функцию в середине транзакции — guard не помогает. Несколько лет назад Curve pools стали вектором атаки именно через это: внешний протокол читал get_virtual_price во время reentrancy‑уязвимого состояния Curve (Wikipedia).
Oracle manipulation через TWAP. Spot price — стандартная цель для flash loan атаки (Wikipedia). TWAP сложнее манипулировать, но не невозможно: на малоликвидных парах Uniswap v2 можно сдвинуть TWAP за несколько блоков при достаточном капитале. Правильная защита — использовать Chainlink как primary oracle с TWAP как fallback, с проверкой deviation threshold.
Gas griefing на unbounded loop. Функция итерируется по массиву пользователей. Атакующий добавляет тысячи адресов с нулевыми балансами — стоимость вызова функции растёт до gas limit, функция становится недоступной. Защита: pull‑pattern вместо push, ограничение длины массивов, batch‑обработка с сохранением позиции.
Front‑running на MEV. Транзакция видна в mempool до включения в блок. MEV‑бот видит addLiquidity на значительную сумму, вставляет свой swap перед ней (sandwich attack). Для AMM это часть модели. Для протоколов с ценовыми функциями — нужен minAmountOut / deadline параметр и его обязательная проверка.
Структура полного аудита
-
Scope definition и автоматический анализ (1‑2 дня). Фиксируем commit hash, версию компилятора, список out‑of‑scope. Запускаем Slither, Mythril, Aderyn. Triage: отделяем реальные критические баги от false positive. Составляем карту зависимостей контрактов.
-
Ручной анализ (5‑15 дней). Каждый контракт построчно. Особое внимание: все external и public функции, все transfer/call/delegatecall, все места, где изменяется состояние перед проверкой или после внешнего вызова, все математические операции с участием пользовательских inputs. В среднем 95% найденных уязвимостей — логические, а не технические.
-
Fuzzing и тестирование (2‑5 дней). Echidna или Foundry invariant tests для критических инвариантов. Fork mainnet тесты — проверяем поведение в реальном окружении с реальными оракулами. Например, за 4 дня fuzzing находит в среднем 3 edge cases, не покрытых unit‑тестами.
-
Отчёт и митигация. Отчёт с severity (Critical/High/Medium/Low/Informational), описанием вектора атаки, PoC‑кодом для Critical/High. Разработчики исправляют, аудиторы делают re‑audit исправлений.
| Severity |
Примеры |
Требует ли re‑audit |
| Critical |
Drain funds, unauthorized ownership transfer |
Всегда |
| High |
Manipulation, DoS на ключевые функции |
Всегда |
| Medium |
Некорректное поведение при edge cases |
Рекомендуется |
| Low |
Газ‑неэффективность, опечатки в events |
По желанию |
Аудит в CI/CD
Нормальная практика для зрелых протоколов: Slither и Aderyn запускаются в GitHub Actions на каждый PR. Certora Prover — на merge в main. Это не заменяет полный аудит перед деплоем, но ловит регрессии.
# .github/workflows/audit.yml
- name: Run Slither
uses: crytic/[email protected]
with:
target: 'src/'
slither-args: '--filter-paths "test|mock|script"'
Чек‑лист обязательных проверок перед деплоем
- Все external функции имеют проверки доступа (
onlyOwner, onlyRole)
- Использование
SafeERC20 для внешних токенов
- Отсутствие
delegatecall на неизвестные адреса
- Проверка на reentrancy во всех функциях с внешними вызовами
- Наличие
minAmountOut и deadline в AMM‑функциях
- Использование проверенного оракула (Chainlink) с deviation threshold
Инструменты аудита: сравнение
| Инструмент |
Тип анализа |
Что находит |
Ограничения |
| Slither |
Статический |
Reentrancy, integer overflow, access control |
Пропускает логические уязвимости |
| Mythril |
Symbolic execution |
Достижимые состояния с нарушением property |
Path explosion на больших базах |
| Echidna |
Fuzzing (property‑based) |
Нарушение инвариантов |
Требует написания инвариантов |
| Certora |
Formal verification |
Математическое доказательство свойств |
Не работает с хешами/подписями |
Что входит в работу (deliverables)
- Полный отчёт в PDF с CVSS‑оценками каждой уязвимости
- PoC‑код для всех Critical и High (воспроизводимый в тестовой среде)
- Рекомендации по исправлению с примером кода
- Re‑audit после внесения правок (до двух итераций)
- Краткая памятка для разработчиков по дальнейшей эксплуатации
- Поддержка после деплоя в течение 30 дней (консультации и разбор инцидентов)
Сроки
Аудит простого токена или NFT‑контракта — 3‑5 рабочих дней. DeFi протокол с lending/AMM — 2‑4 недели. Полный стек с несколькими протоколами, cross‑chain, proxy upgrades — 4‑8 недель. Re‑audit исправлений — 3‑7 дней отдельно.
Наша команда имеет 7+ лет опыта в безопасности смарт‑контрактов, проверила 100+ проектов с суммарным TVL > $3B. Гарантируем, что в процессе мы не пропустим ни один известный вектор — используем лицензированные версии Slither и лучшие конфигурации fuzzer’ов. Предотвращённые убытки для клиентов оцениваются более чем в $50M.
Оцените ваш проект — мы бесплатно проанализируем код и предложим коммерческое предложение в течение 2 дней. Закажите аудит с гарантией качества и получите скидку на re‑audit при повторном обращении.