Аудит смарт-контрактов и чек-лист
Аудит — это вторая пара глаз профессионала, а не печать «теперь безопасно».
Аудит смарт-контракта — независимая экспертная проверка кода на уязвимости и логические/экономические ошибки перед выходом в прод (или после крупных изменений).
Зачем аудит, если есть тесты и инструменты
Тесты проверяют то, что вы предусмотрели; инструменты — типовое; аудитор приносит враждебный взгляд эксперта, который думает как атакующий и видел сотни взломов. Он ищет именно то, что авторы упустили: тонкие предположения, экономические перекосы, опасные взаимодействия между модулями. Аудит — обязательная ступень для любого протокола, держащего реальные деньги.
Как готовиться к аудиту
Аудит эффективнее, когда код к нему готов: заморожен (не меняется во время проверки), покрыт тестами и документацией, снабжён описанием намерений (что и почему должно происходить, какие инварианты предполагаются). Аудитору нужно понимать замысел, чтобы заметить расхождение между замыслом и кодом.
Чек-лист безопасности (выжимка курса)
| Область | Что проверить |
| Реентранси | CEI везде, nonReentrant на чувствительных функциях |
| Доступ | каждая привилегированная функция защищена; владелец — мультисиг |
| Арифметика | 0.8+, осознанный unchecked, направление округления |
| Оракулы | агрегированный источник, свежесть, отказ от спота |
| Внешние вызовы | проверка успеха, контролируемый delegatecall |
| Апгрейд | раскладка storage, защищённый initialize, таймлок |
| Подписи | nonce, EIP-712, deadline, ненулевой адрес |
| Газ/DoS | нет неограниченных циклов, pull-over-push |
| Случайность | VRF вместо данных блока |
Как работает под капотом: процесс аудита
Типично: знакомство с замыслом → ручной разбор кода построчно и по потокам средств → прогон инструментов → моделирование атак и проверка инвариантов → отчёт с находками по уровням критичности (critical/high/medium/low) → исправления командой → повторная проверка фиксов (фикс может внести новый баг). Один аудит редко достаточен для крупного протокола — практикуют несколько независимых.
Почему аудит не гарантия
Аудит снижает риск, но не обнуляет его: он ограничен временем, охватывает версию кода на момент проверки, и аудиторы тоже люди. Взламывали и многократно проаудированные протоколы. Поэтому аудит — часть системы (тесты + инструменты + аудит + bug bounty + мониторинг + аварийные механизмы), а не замена ей.
Частые ошибки
- Менять код после аудита без повторной проверки изменений.
- Считать аудит печатью безопасности и отключать другие рубежи.
- Аудит «галочкой» без документации намерений — аудитор не поймёт замысел.
Итоги
- Аудит — враждебный экспертный взгляд на код перед продом; обязателен для денег.
- Готовьте заморозку кода, тесты и описание намерений/инвариантов.
- Используйте чек-лист по всем классам уязвимостей курса.
- Аудит снижает, но не обнуляет риск — это часть системы, не замена ей.