От автора
Когда я впервые столкнулся со смарт-контрактом, у меня было ощущение подъёма – возможности создавать программы, которые живут в сети и действуют без посредников. Через некоторое время к этому прилагательному «восхитительно» добавилось другое слово – «уязвимо». Я видел, как одна-единственная ошибка в логике или в проверках прав доступа превращала многообещающий проект в новость о похищенных миллионах. Этот опыт не научил меня бояться блокчейна – он научил меня уважать его правила и строить защиту с самого начала.
Эта книга родилась из простой мысли: аудит смарт-контрактов – это не таинственное заклинание для узкого круга экспертов; это практический набор навыков и процедур, которые должны знать разработчик, основатель проекта, инвестор и любой, кто хочет, чтобы деньги и данные в блокчейне были в безопасности. Моя цель – объяснить это понятным языком и снабдить читателя инструментами, чтобы он мог минимизировать риски, понять отчёты аудиторов и выстроить свой безопасный цикл разработки.
Для кого эта книга?
Кому она будет полезна:
Разработчикам, которые пишут смарт-контракты (Solidity, Vyper, Rust для Solana и т. п.).
Техническим руководителям и CTO, которым нужно выстраивать процесс безопасности в команде.
Основателям и менеджерам проектов, которые хотят понимать, за что платят аудиторам и как подготовиться к аудиту.
Инвесторам и аналитикам, оценивающим риски смарт-контракта перед вложением.
Начинающим аудиторам и специалистам по безопасности, которым нужна практическая дорожная карта.
Если вы – человек, который считает, что «достаточно тестов» или «аудит – это для галочки», – эта книга для вас вдвойне. В ней я постарался показать, почему безопасность – это процесс, а не разовая галочка в календаре релиза.
Что вы найдёте в этой книге?
Главная цель книги – трибучить (три пункта, которые нельзя забыть):
Понять устройство смарт-контрактов и типичные источники уязвимостей.
Научиться практическим приёмам поиска ошибок: инструменты, тесты, анализ архитектуры.
Выстроить безопасный жизненный цикл проекта: от проектирования до пострелизной поддержки и bug bounty.
Сейчас я рассказываю, почему тема важна, какой подход я предлагаю и как лучше всего использовать книгу.
Дальше идут технические главы с проверенными приёмами, разбором реальных кейсов и практическими заданиями.
Подход и принцип изложения
Я сознательно избегаю двух крайностей:
сухой академичности
жаргонной демагогии.
Книга построена по принципу «практика + объяснение»: сначала мы видим пример или кейс, затем – разбор причин и пошаговые рекомендации.
Там, где нужно, я даю короткие примеры кода и шаблоны проверки, но не надеюсь заменить собой документацию по конкретным фреймворкам – вместо этого вы получите рабочие принципы, которые применимы независимо от языка и платформы.
Несколько принципов, которыми я руководствовался при написании:
Понятно: сложные идеи разбиты на простые логические блоки.
Практично: максимум примеров и чеклистов, которые можно использовать сразу.
Актуально: я описываю популярные классы уязвимостей и современные инструменты.
Ответственно: безопасность – это не только техническая задача, но и организационная. Я уделяю внимание процессам и культуре.
Что я ожидаю от читателя
Чтобы воспользоваться материалом полностью, полезно иметь базовое представление о программировании и архитектуре распределённых систем.
Знание Solidity или другого языка смарт-контрактов ускорит усвоение материалов, но книга также рассчитана на менеджеров и инвесторов: для них я выделил блоки с пояснениями без кода и практическими советами по взаимодействию с аудиторами.
Если вы берётесь за практическую часть – подготовьте локальную среду разработки (Hardhat/Foundry/Truffle), репозиторий с кодом и доступ к тестовой сети. В конце каждой технической главы вас ждут мини-задания и чеклисты, которые помогут закрепить материал.
Почему аудит – это не только о поиске багов
Когда люди слышат «аудит», они часто представляют себе двух-трёх экспертов, которые читают код и после выдают список ошибок.
На деле аудит – это глубже:
Это анализ архитектуры (правильно ли спроектированы роли, механики, пределы).
Это проверка бизнес-логики (не противоречит ли контракт ожиданиям пользователей и документации).
Это оценка взаимодействия с внешними контрактами и оракулами.
Это проверка производительности (gas-эффективность, возможные DOS-сценарии).
Это помощь в процессе исправления и верификации правок.
Аудит – это также коммуникация: качественный отчёт должен объяснять не только что исправить, но и почему это важно, как правильно закрыть проблему и какие изменения могут повлиять на другие части системы.
Насыщённая реальность: риск и ответственность
Важно понимать, что даже после идеального аудита гарантии 100% безопасности не существует.
Почему?
Контракты неизменяемы (в большинстве случаев) – ошибка в логике сохраняется навсегда, если нет предусмотренной миграции.
Экосистема постоянно развивается: новые векторы атак и комбинации уже известных уязвимостей возникают регулярно.
Человеческий фактор – от неверно сформулированного требования до опечатки в деплой-скрипте – остаётся одной из основных причин инцидентов.
Моя задача – помочь вам снизить вероятность ошибок и подготовить систему к тому, чтобы её можно было безопасно поддерживать и при необходимости оперативно реагировать.
Как пользоваться книгой
Прочитайте введение и главу «Что такое смарт-контракт» – если вы новичок, это даст базу.
Перейдите к главам про уязвимости и инструменты – здесь вы найдёте методы поиска и воспроизведения багов.
Практикуйтесь на примерах – в книге есть задания и тестовые контракты, которые можно запускать локально.
Изучите раздел про аудит процессов и отчёты – если вы заказчик аудита, эти главы помогут вам подготовить качественное техзадание и оценить результаты.
Используйте чеклисты при каждом релизе – краткие контрольные списки в конце глав созданы для быстрой проверки перед публикацией.
Чего вы не найдёте в этой книге
Я не ставил целью заменить официальные спецификации стандартов или служебные инструкции по конкретным аудит-фирмам.
Вы не найдёте тут «магических» рецептов, которые полностью исключают риск. Нет универсального скрипта «вставь это – и всё безопасно». Вместо этого вы получите практические инструменты мышления и отработанные методы, которые помогут вам принимать обоснованные решения и уменьшать вероятность критических ошибок.
Небольшое предупреждение об этике
Безопасность и знания об уязвимостях – двойной меч.
Я подробно разбираю реальные уязвимости и способы их эксплуатации исключительно в образовательных целях – чтобы вы могли защищать проекты, а не атаковать их.
Любые знания, полученные из этой книги, используйте ответственно: сообщайте о найденных проблемах владельцам контрактов и предпочтительно через официальные каналы bug bounty или координационные платформы.
Краткий план действий после прочтения
Чтобы книга дала реальный практический эффект, выполните минимум три вещи сразу после прочтения:
Проверьте текущий процесс разработки: есть ли у вас код-ревью, тесты, CI, и запущены ли статические анализаторы?
Подготовьте чек-лист релиза (в книге есть шаблон) и примените его к ближайшему релизу.
Наладьте канал для пострелизной безопасности: bug bounty или программный мониторинг – чтобы быстро выявлять и реагировать на инциденты.
Я писал эту книгу, думая о людях, которые создают финансовые продукты и сервисы, о тех, кто доверяет этим продуктам свои средства и время. Аудит – это не пестрая бирюлька для отчёта в медиа; это повседневная работа, дисциплина и культура ответственности.
Если вы прочтёте книгу и начнёте применять хотя бы половину предложенных практик – вы уже сделаете мир Web3 чуть безопаснее.
В следующих главах мы подробно разберём конкретные уязвимости, инструменты, примеры реальных атак и шаги по их устранению. Я порекомендую рабочие практики, дам проверенные чек-листы и покажу, как стать тем, кто не только умеет писать код, но и знает, как его защищать.
Давайте начнём.
Введение. Что такое смарт-контракт
Смарт-контракт – это программа, которая выполняется в блокчейне и автоматически исполняет заранее прописанную логику при наступлении определённых условий. Если сказать коротко: это код + деньги + правила, которые работают в распределённой среде без центрального администратора. Но за простым определением скрывается много важных деталей, которые определяют, как смарт-контракты проектируют, пишут, тестируют и – что особенно важно – как их безопасно аудитируют.
В этой главе мы подробно разберём, что такое смарт-контракты, как они работают «изнутри», какие фундаментальные свойства у них есть и почему эти свойства диктуют специальный подход к разработке и аудиту.
1. Ключевые свойства смарт-контракта и их последствия
1.1. Автономность и детерминированность
Смарт-контракт выполняется автономно: как только в блокчейн попадает транзакция, узлы сети запускают код контракта и результат вычисления закрепляется в состоянии цепочки. Выполнение детерминировано – один и тот же вход в одинаковых условиях даст один и тот же результат на всех нодах.
Следствие: нужно учитывать все возможные входы и сценарии – ошибки невозможно «пофиксить» посередине выполнения транзакции.
1.2. Неизменяемость (immutability)
После деплоя код контрактa обычно нельзя изменить (если только заранее не предусмотрен механизм обновления). Это повышает доверие, но означает: ошибка в деплоенном контракте остаётся навсегда, если не заложена логика миграции/апгрейда.
Следствие для безопасности: критично тщательно тестировать и аудировать код до релиза; предусматривать безопасные механизмы апгрейда, если они требуются.
1.3. Прозрачность
Код и состояние контракта в публичных блокчейнах видимы всем. Это даёт преимущества (внешний аудит, проверка) и риски (изучив код, злоумышленник найдёт уязвимости).
Следствие: публикация кода – благо, но нужно минимизировать потенциальные векторы атак через дизайн.
1.4. Экономическая природа – газ и стоимость операций
Каждая операция в блокчейне обходится дорого: исполнение кода потребляет газ, который платится в нативном токене. Непродуманная реализация может привести к большим издержкам или невозможности исполнения (out-of-gas).
Следствие: оптимизация по газу и контроль worst-case сценариев – часть безопасности и UX.
1.5. Взаимодействие с внешним миром – оракулы, внешние контракты
Смарт-контракты не имеют прямого доступа к внешним данным – для этого используют оракулы. Взаимодействие с другими контрактами и внешними сервисами добавляет сложности и риски (reentrancy, неверные допущения о поведении внешних контрактов и т.п.).
Следствие: интерфейсы, проверки и устойчивость к ошибкам внешних систем – обязательны.
2. Где живёт смарт-контракт: кратко о средах исполнения
Разные блокчейны имеют разные виртуальные машины и модели исполнения. Наиболее распространённые примеры:
EVM (Ethereum Virtual Machine) – модель, к которой привыкли большинство Solidity-разработчиков. Многие блокчейны совместимы с EVM.
WASM/Rust (например, Solana, NEAR, Substrate) – другая модель, где программы компилируются в WebAssembly, с иными ограничениями и парадигмами.
Каждая среда диктует свои идиомы и опасности: какие-то классы уязвимостей характерны для EVM (reentrancy через вызовы внешних контрактов), другие – для WASM-сред (например, особенности управления памятью и сериализации данных).
3. Основные строительные блоки смарт-контракта (терминология и устройство)
3.1. Адреса и аккаунты
EOA (Externally Owned Account) – аккаунт, управляемый приватным ключом (пользователь).
Contract Account – аккаунт, которому присвоен код. Вызовы отправляются на адрес контракта.
3.2. Состояние (storage)
Контракт хранит своё состояние в персистентном хранилище блокчейна. В EVM это key-value хранилище (слоты). Доступ к storage дороже по газу, чем локальные переменные.
3.3. Транзакции и вызовы (transactions and calls)
Транзакция – изменение состояния, требует подписи и газ, добавляется в блок.
Call – локальный вызов, не меняющий состояния (view/pure), может использоваться для чтения.
3.4. Events (события)
Контракты могут эмитить события, которые индексируются нодами и используются внешними системами (дающие логи и облегчающие аудит действий).
3.5. Функции, модификаторы и уровни доступа
Функции могут быть:
public,
external,
internal,
private.
Правильно настроенные модификаторы доступа (onlyOwner, onlyAdmin) – ключ к безопасности.
Операции с балансом нужно делать осторожно (раньше возможны были overflow/underflow – сейчас Solidity 0.8+ делает проверки по умолчанию).
Нет управления доступом к функциям – в более сложных токенах нужны дополнительные методы и проверки.
4. Типичный жизненный цикл контракта: от идеи до эксплуатации
1) Проектирование – архитектура, роли, сценарии использования, граничные случаи.
2) Реализация – код, модульные тесты, комментарии.
3) Локальное
тестирование
– unit tests, integration tests, fuzzing.
4) Статический и динамический анализ – Slither, Mythril, Echidna, тесты на покрытие.
5) Аудит сторонней компанией – мануальный + автоматизированный анализ.
6) Ревизия и исправление – фиксы, ретесты, повторный аудит (при необходимости).
7) Деплой и мониторинг – мониторинг транзакций, bug bounty, пострелизный контроль.
8) Миграция/апгрейд – если заложена возможность апгрейда, соблюдение процедур безопасного перехода.
На каждом шаге есть точки, где ошибки приводят к серьёзным последствиям: неверная предпосылка в проектировании, неполные тесты, пропуск проверки внешних контрактов и т.д.
5. Частые неправильные представления о смарт-контрактах
«Контракты сами по себе безопасны, потому что код открыт» – открытость помогает, но открытый код также облегчает поиск уязвимостей.
«Аудит = гарантия безопасности» – аудит снижает риск, но не исключает его. Аудит – это снимок на момент проверки с рекомендациями.
«Можно всё исправить после деплоя» – не всегда. Если контракт неизменяем и уязвимость критична, средства могут быть потеряны навсегда.
6. Архитектурные шаблоны и важные концепции (которые часто влияют на аудит)
6.1. Разделение логики и данных
Вынос логики в отдельные контрактные модули и данных (storage) в другие помогает при апгрейде и уменьшает сложность.
6.2. Каноны безопасности: Checks-Effects-Interactions
Это правило рекомендует: проверяем условия (Checks), обновляем собственное состояние (Effects), затем выполняем внешние вызовы (Interactions). Это помогает минимизировать reentrancy-атаки.
6.3. Контракты-хранители ролей (Ownable / AccessControl)
Управление правами важно: кто может менять параметры, вытянуть средства, обновить логику. Неправильная конфигурация ролей – частая причина инцидентов.
6.4. Прокси-паттерны и апгрейдируемость
Прокси позволяют менять логику, сохраняя storage. Это удобно, но добавляет сложность и новые векторы атак (уязвимости в механизме апгрейда).
7. Как это всё влияет на аудит
Поскольку смарт-контракт – это сочетание кода, денег и публичной инфраструктуры, аудит нужно смотреть под несколькими углами:
Технический: поиск уязвимостей, логических ошибок, неправильных предположений.
Экономический: моделирование атак, которые опираются на экономическую мотивацию (flash loans, front-running).
Процессный: кто подписывает релиз, как управляются приватные ключи, CI/CD безопасность, проверка миграций.
Социальный/операционный: как реагирует команда на найденные баги, есть ли баг-баунти, позволяют ли процедуры откатывать критические операции.
Аудиторы должны не просто указать строчки кода с проблемой, а объяснить потенциальный вред, условия эксплойта и конкретный патч с минимальным побочным эффектом.
8. Мини-практика: прочувствуйте поведение транзакции
1)
Разверните простой локальный тестовый нод (Hardhat/Foundry) и деплойте минимальный SimpleToken из примера выше.
2)
Попробуйте вызвать transfer с балансом меньше требуемого – посмотрите, как транзакция откатывается и что происходит с тратой газа.
3)
Проверьте, можно ли отправить токены на address(0) – что это означает с экономической точки зрения? Добавьте require защиту и перепроверьте.
Цель упражнений – почувствовать, как контракт ведёт себя в реальных транзакциях, и увидеть, что откат – это не «отмена следствий» в реальном мире: средства могут быть потеряны, а логи уже в сети.
9. Контрольный список (что вы уже должны понимать после этой главы)
Понимать базовую идею: смарт-контракт – программа в блокчейне, управляющая состоянием и активами.
Знать ключевые свойства: автономность, детерминированность, неизменяемость, прозрачность.
Осознавать влияние газа и экономической модели на дизайн.
Знать типичные строительные блоки: storage, events, транзакции, роли.
Понимать, почему аудит должен покрывать архитектуру, код, экономику и процессы.
10. Что дальше в книге (коротко)
Дальше мы перейдём от общей картины к конкретным уязвимостям и приёмам их поиска:
реентранси,
управление правами,
ораклы,
ошибки арифметики в старых версиях,
фронт-раннинг,
газовые ловушки
и т.д.
Также подробно разберём инструменты, методики тестирования (fuzzing, property-testing), и формат профессионального отчёта аудитора.
Заключительная мысль
Понимание того, что такое смарт-контракт, – не просто терминологическое упражнение. Это основа мышления, от которой зависят все последующие решения:
как проектировать,
тестировать,
защищать систему.
Смарт-контракты – это код с реальными последствиями; относиться к ним нужно так же серьёзно, как к любому финансовому продукту.
В следующих главах научу видеть эти последствия заранее и работать так, чтобы избегать самых распространённых ловушек.
На этой странице вы можете прочитать онлайн книгу «Аудит смарт-контрактов в крипте», автора Дмитрий Подлужный. Данная книга имеет возрастное ограничение 18+, относится к жанрам: «Бухучет, налогообложение, аудит», «Интернет-бизнес». Произведение затрагивает такие темы, как «аудит», «угроза безопасности». Книга «Аудит смарт-контрактов в крипте» была написана в 2025 и издана в 2025 году. Приятного чтения!
О проекте
О подписке
Другие проекты