Чек-лист перед аудитом смарт-контракта: что подготовить команде
Перед аудитом смарт-контракта нужно заморозить код на конкретном коммите, описать назначение каждого контракта и все роли, записать инварианты, довести тесты и статический анализ до чистого состояния, подготовить скрипты деплоя и список внешних зависимостей. Аудитор оплачивается за время. Каждый час, который он тратит на выяснение «что здесь должно происходить», вы оплачиваете вместо поиска уязвимостей. Ниже — чек-лист из 30 пунктов, разбитый на шесть блоков.
Что аудит даёт, а что нет
Хорошая подготовка нужна не ради формальности. Когда код, документация и тесты в порядке, аудитор сразу переходит к сути: ищет сценарии, которые команда не предусмотрела. Когда документации нет, первые дни уходят на расспросы и чтение кода «с нуля», а часть рисков может остаться незамеченной просто потому, что не хватило времени.
Аудит — это независимая проверка кода командой, которая специализируется на уязвимостях. Он находит ошибки, которые пропустили разработчики, и оценивает их критичность. Но аудит ограничен по времени и охватывает только переданный код на конкретном коммите. Он снижает риск, но не гарантирует безопасность. Изменения после аудита, конфигурация при деплое и хранение ключей остаются на вашей стороне.
| Аудит проверяет | Аудит обычно не проверяет |
|---|---|
| Логику контрактов из согласованного списка | Код, изменённый после фиксации коммита |
| Известные классы уязвимостей | Экономическую модель токена, если это не оговорено отдельно |
| Соответствие кода документации | Хранение ключей и процессы команды |
| Взаимодействие с указанными внешними контрактами | Фронтенд и бэкенд, если они не в объёме |
| Права и роли в коде | Параметры, которые выставят при деплое |
Блок 1. Объём и заморозка кода
- Зафиксируйте коммит или тег, который идёт в аудит, и не меняйте код в этой ветке до отчёта.
- Составьте список файлов в объёме аудита и отдельно — вне объёма (моки, тесты, скрипты).
- Посчитайте строки кода без комментариев по каждому файлу: аудиторы оценивают работу по этому показателю.
- Укажите точные версии компилятора,
evmVersion, настройки оптимизатора и via-IR. - Зафиксируйте версии зависимостей, например OpenZeppelin 5.7.0, и способ их установки.
Блок 2. Документация
- Короткое описание продукта: что делает система и кто её пользователи.
- Назначение каждого контракта и схема взаимодействия между ними.
- Все роли: кто их получает при деплое, кто может выдавать и отзывать, что каждая роль может сделать.
- Описание движения денег: откуда приходят средства, где лежат, при каких условиях уходят.
- Формулы расчётов (награды, комиссии, графики) с примерами чисел и правилами округления.
- Известные ограничения и осознанные компромиссы, чтобы аудитор не тратил время на то, что вы и так знаете.
- NatSpec-комментарии (
@notice,@dev,@param) у всех внешних функций.
Блок 3. Инварианты и угрозы
- Список инвариантов на человеческом языке: «сумма балансов равна общей эмиссии», «контракт не выдаёт больше, чем получил».
- Тот же список в виде инвариантных тестов. Как их писать — в статье о тестировании в Foundry и Hardhat.
- Модель угроз: что самое ценное в системе и как его можно украсть, заблокировать или обесценить.
- Перечень внешних зависимостей с адресами: оракулы, токены, DEX, мосты. Что будет, если каждая из них поведёт себя неправильно.
- Предположения о токенах: работаете ли вы с токенами с комиссией за перевод, с ребейзом, с нестандартным возвратом
transfer.
Блок 4. Тесты и анализ
- Все тесты проходят одной командой из инструкции в README.
- Отчёт о покрытии строк и веток с объяснением непокрытых участков.
- Фаззинг и инварианты с увеличенным числом прогонов в CI.
- Чистый вывод Slither: каждое предупреждение исправлено или объяснено.
- Тесты на форке сети для интеграций с внешними протоколами.
- Нет закомментированного кода,
TODO, отладочных функций и тестовых адресов в основных контрактах.
Блок 5. Права и обновления
- Схема прав после деплоя: какие роли уходят мультиподписи, таймлоку, кому-то ещё.
- Если контракты обновляемые: схема прокси, кто вправе обновлять, проверка раскладки storage. Подробности — в статье о proxy и UUPS.
- Перечень функций экстренной остановки и кто может их вызвать.
- Описание того, что может сделать администратор со средствами пользователей в худшем случае.
Блок 6. Деплой
- Скрипты деплоя в репозитории, с параметрами для каждой сети.
- Список сетей и порядок развёртывания контрактов, если они зависят друг от друга.
- План передачи прав и проверки после деплоя. О ключах и верификации — в статье о деплое смарт-контракта.
Когда заказывать аудит
Аудит заказывают, когда функциональность закончена, тесты зелёные и вы не планируете менять логику. Слишком ранний аудит тратит деньги на код, который потом перепишут. Слишком поздний — за неделю до запуска — не оставляет времени на исправления. Аудиторы часто бронируют время за несколько недель, поэтому договариваться стоит заранее, а сдавать код ровно к согласованной дате.
| Этап проекта | Что делать | Признак готовности |
|---|---|---|
| Прототип | Внутреннее ревью, без внешнего аудита | Логика ещё меняется |
| Функциональность закончена | Тесты, инварианты, документация | Нет открытых задач на изменение логики |
| Код заморожен | Передача аудитору | Тег в репозитории, чек-лист выполнен |
| Отчёт получен | Исправления и их проверка | Все находки закрыты или приняты осознанно |
| Запуск | Деплой проверенного коммита, мониторинг, лимиты | Байт-код совпадает с проверенным кодом |
Что положить в пакет для аудитора
- Ссылку на репозиторий и тег, доступ на чтение.
- README с командами сборки и тестов, которые работают на чистой машине.
- Документ с описанием системы, ролей, движения денег и инвариантов.
- Отчёт о покрытии и вывод статического анализа.
- Список вопросов, которые беспокоят саму команду: аудиторы ценят такие подсказки.
- Контакт разработчика, который быстро отвечает на вопросы во время аудита.
После отчёта аудитора
Аудитор присылает список находок с уровнями критичности. Каждую нужно исправить или обосновать, почему она принимается как риск. Исправления делаются отдельными коммитами, и аудитор проверяет именно их. Публикуйте итоговый отчёт вместе с коммитом, на котором он сделан, и проверьте, что развёрнутый байт-код соответствует этому коммиту. Иначе пользователи увидят отчёт об одном коде, а работать будут с другим.
| Ошибка после аудита | Чем опасна |
|---|---|
| Мелкие правки «уже после» без повторной проверки | Новая уязвимость в коде, которого аудитор не видел |
| Деплой с другими параметрами, чем в тестах | Неправильные роли или лимиты на боевой сети |
| Отчёт опубликован без указания коммита | Невозможно проверить, что развёрнут именно проверенный код |
| Находки «низкой важности» проигнорированы | Иногда в сочетании они дают серьёзный сценарий |
Что ещё сделать до запуска
Аудит — одна из линий защиты. Вторая — ограничения: лимиты на вывод, пауза для экстренных случаев, постепенное увеличение сумм. Третья — наблюдение: оповещения о крупных переводах, о вызовах административных функций и о необычной активности. Это задача мониторинга контрактов и реагирования на инциденты. Если проект связан с обычным сайтом и бэкендом, их безопасность проверяют отдельно, например в рамках аудита безопасности.
Подготовить код к аудиту, написать недостающие тесты и инварианты поможет команда разработки смарт-контрактов. Отдельно у нас есть страница аудита смарт-контракта.
Вопросы и ответы
Сколько длится аудит смарт-контракта?
Зависит от объёма кода и загрузки аудитора. Хорошая подготовка документации, инвариантов и тестов сокращает срок, потому что аудитор не тратит время на выяснение намерений.
Можно ли менять код во время аудита?
Нежелательно. Аудитор проверяет конкретный коммит. Если изменения неизбежны, согласуйте их и передайте отдельным коммитом на проверку.
Гарантирует ли аудит, что контракт не взломают?
Нет. Аудит снижает риск, но ограничен временем и объёмом. Поэтому кроме аудита нужны тесты, ограничения прав, мониторинг и план действий при инциденте.
Что важнее подготовить к аудиту в первую очередь?
Описание ролей и движения денег, список инвариантов и рабочие тесты. Без них аудитор тратит время на восстановление намерений команды, и на поиск уязвимостей его остаётся меньше.
Нужен ли повторный аудит после исправлений?
Исправления находок проверяет тот же аудитор в рамках работы. Существенные изменения логики после отчёта требуют новой проверки.
Читайте также
Смарт-контракт простыми словами: что это и когда бизнесу он не нужен
БлокчейнСколько стоит разработка смарт-контракта и из чего складывается цена
БлокчейнАпгрейдируемые смарт-контракты: proxy, UUPS, плюсы и риски
БлокчейнТестирование смарт-контрактов: Foundry, Hardhat, фаззинг, инварианты
БлокчейнДеплой и верификация смарт-контракта: ключи, скрипты, Etherscan
БлокчейнСколько стоит аудит смарт-контракта и что в него входит