Аудит смарт-контрактов и чек-лист

Аудит — это вторая пара глаз профессионала, а не печать «теперь безопасно».

Аудит смарт-контракта — независимая экспертная проверка кода на уязвимости и логические/экономические ошибки перед выходом в прод (или после крупных изменений).

Зачем аудит, если есть тесты и инструменты

Тесты проверяют то, что вы предусмотрели; инструменты — типовое; аудитор приносит враждебный взгляд эксперта, который думает как атакующий и видел сотни взломов. Он ищет именно то, что авторы упустили: тонкие предположения, экономические перекосы, опасные взаимодействия между модулями. Аудит — обязательная ступень для любого протокола, держащего реальные деньги.

Как готовиться к аудиту

Аудит эффективнее, когда код к нему готов: заморожен (не меняется во время проверки), покрыт тестами и документацией, снабжён описанием намерений (что и почему должно происходить, какие инварианты предполагаются). Аудитору нужно понимать замысел, чтобы заметить расхождение между замыслом и кодом.

Чек-лист безопасности (выжимка курса)

ОбластьЧто проверить
РеентрансиCEI везде, nonReentrant на чувствительных функциях
Доступкаждая привилегированная функция защищена; владелец — мультисиг
Арифметика0.8+, осознанный unchecked, направление округления
Оракулыагрегированный источник, свежесть, отказ от спота
Внешние вызовыпроверка успеха, контролируемый delegatecall
Апгрейдраскладка storage, защищённый initialize, таймлок
Подписиnonce, EIP-712, deadline, ненулевой адрес
Газ/DoSнет неограниченных циклов, pull-over-push
СлучайностьVRF вместо данных блока

Как работает под капотом: процесс аудита

Типично: знакомство с замыслом → ручной разбор кода построчно и по потокам средств → прогон инструментов → моделирование атак и проверка инвариантов → отчёт с находками по уровням критичности (critical/high/medium/low) → исправления командой → повторная проверка фиксов (фикс может внести новый баг). Один аудит редко достаточен для крупного протокола — практикуют несколько независимых.

Почему аудит не гарантия

Аудит снижает риск, но не обнуляет его: он ограничен временем, охватывает версию кода на момент проверки, и аудиторы тоже люди. Взламывали и многократно проаудированные протоколы. Поэтому аудит — часть системы (тесты + инструменты + аудит + bug bounty + мониторинг + аварийные механизмы), а не замена ей.

Частые ошибки

  • Менять код после аудита без повторной проверки изменений.
  • Считать аудит печатью безопасности и отключать другие рубежи.
  • Аудит «галочкой» без документации намерений — аудитор не поймёт замысел.

Итоги

  • Аудит — враждебный экспертный взгляд на код перед продом; обязателен для денег.
  • Готовьте заморозку кода, тесты и описание намерений/инвариантов.
  • Используйте чек-лист по всем классам уязвимостей курса.
  • Аудит снижает, но не обнуляет риск — это часть системы, не замена ей.
Проверьте себя
1. Что аудитор приносит сверх тестов и инструментов?
AГотовый деплой
BВраждебный экспертный взгляд, ищущий упущенные авторами предположения и экономические перекосы
CСнижение комиссий
DСлучайность
2. Почему важна повторная проверка фиксов после аудита?
AЧтобы ускорить релиз
BПотому что исправление может внести новый баг
CЧтобы снизить газ
DЭто не нужно
3. Почему аудит не даёт гарантии безопасности?
AАудиторы не читают код
BОн ограничен временем и версией кода, а аудиторы тоже люди — поэтому это часть системы, не замена ей
CОн всегда находит всё
DОн заменяет тесты