Разработка DeFi-протокола
Команда запускает лендинг-протокол, вдохновлённый Aave v3. На этапе тестирования всё работает. После деплоя на mainnet через 48 часов оракул Chainlink возвращает устаревшую цену — liquidation threshold пробивает безопасные позиции. Ликвидаторы дренируют залоговый пул на $400K, пока команда разбирается в чём дело. Проблема не в самом Chainlink — в отсутствии staleness check: контракт не проверял updatedAt из latestRoundData().
Разработка DeFi-протокола — это не просто Solidity-код. Это система инвариантов, которые должны держаться при любых рыночных условиях, MEV-атаках и форс-мажорах на уровне инфраструктуры.
Где ломаются DeFi-протоколы на этапе дизайна
Oracle manipulation через flash loan
Типичная схема: атакующий берёт flash loan на 50M USDC в Aave, манипулирует ценой в Uniswap v2 пулу с низкой ликвидностью, использует этот пул как ценовой оракул, занимает под завышенный залог, не возвращает займ. Протоколы, которые используют token.balanceOf(pool) или spot price из AMM как оракул — уязвимы по определению.
Защита работает на нескольких уровнях:
TWAP вместо spot price. Uniswap v3 предоставляет OracleLibrary.consult() для расчёта time-weighted average price. Окно в 30 минут делает flash loan манипуляцию экономически невыгодной — нужно удерживать позицию несколько блоков, каждый с риском арбитража.
Chainlink с fallback. Primary source — Chainlink, fallback — Uniswap v3 TWAP. Если Chainlink возвращает цену с updatedAt старше 3600 секунд или answer < 0 — переключение на TWAP с emit события для мониторинга.
Circuit breaker на отклонение. Если цена за один блок изменилась более чем на 15% — транзакция реверсируется. Параметр настраивается через governance с timelock.
Reentrancy в cross-protocol взаимодействиях
AMM-протокол вызывает токен при swap. Если токен реализует ERC-777 с tokensReceived хуком — атакующий контракт получает управление в середине swap, до обновления внутренних балансов пула. Это не теория: атака на Uniswap v1 через ERC-777 была одной из первых публичных эксплойтов на DEX.
В современных протоколах проблема усложняется: callback-паттерны (uniswapV3SwapCallback, flashLoanReceiver) намеренно передают управление внешнему коду. Защита строится через invariant check: перед callback фиксируется состояние, после — проверяется что инварианты соблюдены.
Liquidation mechanics и bad debt
При резком падении рынка на 40%+ за один блок (Ethereum в марте 2020 упал на 50% за несколько часов) liquidation может не успеть. Залог стоит меньше долга — протокол получает bad debt. Compound v2 столкнулся с этим, MakerDAO ввёл механизм Emergency Shutdown именно как последний рубеж.
Параметры ликвидации требуют математического моделирования: loan-to-value ratio, liquidation threshold, liquidation bonus, close factor — все эти параметры должны быть откалиброваны под волатильность конкретного актива. WBTC и мем-токен не могут иметь одинаковый LTV.
Архитектура протокола
Модульная структура контрактов
Монолитный контракт на 3000 строк — первая ошибка в DeFi-протоколе. Не из-за эстетики, а потому что:
- Превышает лимит байткода EVM (24 KB)
- Невозможно заменить отдельный модуль без полного редеплоя
- Аудит занимает в 3x дольше и стоит соответственно
Используем Diamond Pattern (EIP-2535) для протоколов с богатой функциональностью: отдельные facets для lending, liquidation, oracle, governance. Хранилище — общий Diamond Storage через keccak256-слоты (ERC-7201).
Для более простых случаев — разделение на Core (неизменяемая логика), Periphery (вспомогательные контракты, можно обновлять) и Governance. Этот паттерн использует Uniswap, начиная с v2.
Upgradability: когда нужна и когда вредит
UUPS (EIP-1822) vs Transparent Proxy (EIP-1967): выбор зависит от того, кто платит за апгрейд. В UUPS логика апгрейда в имплементации — дешевле для пользователей, но если в новой имплементации убрать функцию upgradeTo — протокол теряет возможность апгрейда навсегда. В Transparent Proxy логика в proxy — чуть дороже каждый вызов, но надёжнее.
Для protocolов с TVL >$10M апгрейдаемость через multisig без timelock — это централизованный вектор атаки. Gnosis Safe 4-of-7 + 48-часовой timelock через OpenZeppelin TimelockController — минимальный стандарт доверия.
Tokenomics на уровне контракта
Ve-модель (vote-escrowed, как в Curve) требует careful balance: контракт блокирует токены на срок до 4 лет, начисляет voting power через balanceOfAtTime() на конкретный блок. Если voting power рассчитывается неверно — governance атака стоит дешевле, чем должна.
Emission schedule должен быть immutable или управляться через governance с супер-мажоритетным голосованием. Изменение эмиссии retroactively — это именно то, что убивает доверие к протоколу.
Стек разработки
| Компонент | Инструменты | Назначение |
|---|---|---|
| Разработка | Foundry, Hardhat | Основная среда, тесты, деплой |
| Базовые контракты | OpenZeppelin 5.x | Access control, proxy, tokens |
| Oracle | Chainlink, Uniswap v3 TWAP | Ценовые данные |
| Тестирование | Foundry fuzz, Echidna | Property-based тесты |
| Статический анализ | Slither, Mythril | Автоматический поиск уязвимостей |
| Мониторинг | Tenderly, OpenZeppelin Defender | Алерты, автоматизация |
| Индексирование | The Graph | Субграф для frontend |
Fork-тесты на Foundry позволяют запустить весь протокол против реального состояния mainnet: vm.createFork("mainnet"), vm.rollFork(blockNumber). Это единственный способ проверить взаимодействие с реальными пулами Uniswap, реальными Chainlink feeds и реальными позициями Aave.
Процесс разработки
Спецификация (1 неделя). Формальное описание инвариантов: «суммарный долг всегда меньше суммарного залога с учётом LTV», «только ликвидатор может закрыть unhealthy позицию», «emission rate не может вырасти больше чем на X% за один governance цикл». Инварианты становятся основой для Echidna property-тестов.
Архитектурный дизайн (3-5 дней). Storage layout, интерфейсы, диаграмма взаимодействия контрактов. Решение по апгрейдаемости и governance. Этот этап дешевле изменить на бумаге, чем после 2 недель разработки.
Разработка (3-8 недель). Зависит от сложности протокола. Параллельно: контракты + тесты в Foundry (покрытие >90%), субграф на The Graph, скрипты деплоя.
Внутренний аудит + подготовка к внешнему. Slither CI на каждый PR. Перед внешним аудитом — полная Mythril-проверка, ручной review по SWC-checklist. Цель — закрыть low/medium до внешнего аудитора, чтобы он сфокусировался на высокоуровневых векторах.
Деплой. Testnet (Sepolia/Arbitrum Goerli) → staged mainnet через multisig с timelock → post-launch мониторинг через Tenderly.
Ориентиры по срокам
Минимальный AMM-протокол (xy=k, без концентрированной ликвидности) — 4-6 недель. Лендинг по модели Compound v2 — 8-12 недель. Полноценный протокол с ve-токеномикой, governance и cross-chain поддержкой — от 3 до 6 месяцев. Внешний аудит занимает 2-4 недели дополнительно и планируется заранее у топовых фирм (Trail of Bits, Spearbit, Code4rena).
Стоимость рассчитывается после технической спецификации.







