За пять уроков этого модуля мы разобрали, как устроен блокчейн изнутри: блоки и хэши, майнинг и Proof of Work, Proof of Stake, приватные ключи. В прошлом уроке мы проследили путь транзакции от нажатия кнопки до записи в блокчейн. Теперь поверх этого фундамента можно строить программы — умные программы, которые работают без посредников.
Смарт-контракт — это код, который нельзя остановить после запуска. Это его суперсила и его ахиллесова пята одновременно. Баг в коде означает безвозвратную кражу миллионов — и такое уже случалось не раз.
В этом уроке вы узнаете:
- Что такое смарт-контракт и три его ключевых свойства
- Почему контракт не может сам узнать цену BTC и как решается Oracle Problem
- Как смарт-контракты взаимодействуют между собой — и почему это одновременно мощно и рискованно
- Как устроена EVM и что происходит под капотом при выполнении контракта
- Какие уязвимости позволяют хакерам похищать сотни миллионов долларов
- Как за 15 минут проверить контракт перед взаимодействием с ним
После урока вы сможете самостоятельно оценить базовые признаки безопасности любого DeFi-протокола.
Точное определение смарт-контракта
Представьте депозитный сейф с таймером: вы кладёте деньги, задаёте условие — «выдать через год» — и закрываете его. Ни вы, ни сотрудник банка не можете открыть его раньше. Условие вписано в механизм и исполнится автоматически. Смарт-контракт работает по той же логике, только вместо сейфа — код в блокчейне, а вместо таймера — любое условие, которое можно проверить программно.
Формально: смарт-контракт — это программа, опубликованная в блокчейне, которая автоматически исполняется при выполнении заданных условий без участия каких-либо третьих лиц. Создатель пишет правила один раз, деплоит (публикует) контракт — и дальше он работает сам.
У смарт-контрактов три принципиальных свойства, которые отличают их от обычных программ. Первое — детерминизм: один и тот же входной сигнал даёт один и тот же результат на тысячах нод (node — узел сети, компьютер-участник блокчейна) по всему миру одновременно. Никакой случайности, никаких «у меня работало по-другому».
Второе — trustless (без доверия): вам не нужно доверять разработчику или посреднику. Вы доверяете коду. Если контракт написан честно — правила выполнятся именно так, как написано. Без возможности «войти в положение» или передумать.
Третье — unstoppable (неостановимость): никто, включая автора контракта, не может остановить или изменить уже задеплоенный контракт. Он будет выполнять условия, пока существует сеть. Это свойство — самое важное и самое опасное одновременно.
Сравните со стандартным юридическим договором: нарушение условий → суд → апелляция → исполнительный лист → пристав. Месяцы, иногда годы, и результат не гарантирован. Смарт-контракт: условие выполнено → мгновенный автоматический перевод. Без судей, юристов и человеческого фактора.
Ethereum — крупнейшая платформа для смарт-контрактов. Но ими пользуются и BNB Chain, Polygon, Avalanche, Arbitrum — потому что все они используют один и тот же стандарт исполнения (о нём в разделе про EVM ниже). Подробнее о совместимых сетях — в уроке 2.8.
Смарт-контракт не знает слова «наверное». Либо условие выполнено — и код исполняется, либо нет. Никаких интерпретаций, никакого «войдём в положение». Именно это делает их мощным инструментом — и именно это превращает каждый баг в потенциальную катастрофу.
Oracle Problem: откуда контракт знает цену BTC?
Смарт-контракт изолирован. Он видит только то, что находится внутри блокчейна. Если вы хотите построить лендинговый протокол, который выдаёт кредиты под залог ETH, — контракту нужно знать текущую цену ETH в долларах. Но как он её узнает? Выйти в интернет и проверить на бирже он не может.
Это и есть Oracle Problem: EVM детерминирована и изолирована — она не может напрямую получить данные «с улицы»: цены активов, данные о погоде, курсы валют. Всё, что происходит вне блокчейна, для контракта недоступно.
Решение — оракул (oracle): внешняя служба, которая доставляет реальные данные в блокчейн через транзакцию. Централизованный оракул — один источник данных. Быстро и просто, но это единственная точка отказа: если поставщик ошибся или был скомпрометирован, контракт получает неверные данные и принимает неверные решения.
Децентрализованный оракул — и здесь лидер рынка Chainlink — работает иначе. Сотни независимых нод собирают данные из множества источников, вычисляют медиану и публикуют результат в блокчейн. Чтобы манипулировать таким оракулом, нужно подкупить большинство нод одновременно — это на несколько порядков дороже, чем потенциальная выгода от атаки.
Price feed — это смарт-контракт Chainlink, который хранит текущую цену пары (например, ETH/USD). Другие контракты читают его как справочник: «дай мне текущую цену ETH» — и получают ответ без выхода за пределы блокчейна.
Если протокол использует для расчёта цены не Chainlink, а «spot-цену» из собственного DEX — это серьёзный красный флаг. Spot-цену в DEX можно временно исказить через крупную сделку. Несколько взломов на десятки миллионов долларов произошли именно через эту лазейку — подробнее в разделе про Flash Loan ниже.
Composability: «Денежные LEGO»
Оракул — мост между контрактом и внешним миром. Но сами контракты умеют взаимодействовать и между собой: вызывать друг друга, передавать токены, читать состояние. Один клик пользователя может запустить цепочку из пяти, десяти и больше взаимодействий между независимыми протоколами — автоматически и без чьего-либо разрешения. Эту возможность называют composability (компонуемость).
Наглядный пример: вы депонируете ETH в Lido — получаете stETH. Используете stETH как залог в Aave — берёте кредит в DAI. Вносите DAI в Curve — начисляется доход в виде 3CRV. Весь этот путь — четыре независимых протокола, четыре смарт-контракта, одна экономическая позиция. Разработчики называют это Money Lego: DeFi-протоколы как кубики LEGO, из которых без центрального координатора можно строить сложные финансовые конструкции.
Плюс очевиден: экспоненциальный рост возможностей. Любой разработчик может создать новый протокол, который использует уже существующие — и предложить пользователям то, что было невозможно в традиционных финансах.
Минус не менее очевиден: сложность скрывает риски. Если один «кубик» ведёт себя нештатно — вся цепочка может рухнуть. В 2022 году Celsius Network держала stETH как залоговый актив. Когда stETH начал торговаться с дисконтом к ETH, а рынок охватила паника, composability-конструкция Celsius рассыпалась: залоги обесценились, кредиторы потребовали возврата, вывод средств был заморожен. Тысячи пользователей лишились доступа к своим средствам.
EVM: движок под капотом
Мы видели, как контракты взаимодействуют — с внешним миром через оракулы, между собой через composability. Встаёт вопрос: как именно они исполняются синхронно на тысячах машин по всему миру? Для этого нужна стандартная среда исполнения. Ею служит EVM — Ethereum Virtual Machine, виртуальная машина Ethereum.
EVM — это не физический компьютер, а изолированная среда, запущенная одновременно на каждой ноде сети. «Виртуальная» означает: она изолирована от реальной операционной системы ноды. Что бы ни происходило внутри EVM — файлы хоста не пострадают, и результат на каждой ноде будет идентичным.
Исходный код контрактов пишется на Solidity (об этом — в следующем разделе), но в блокчейне хранится не Solidity-код, а скомпилированный bytecode — набор низкоуровневых инструкций, которые понимает EVM. Именно bytecode исполняется на всех нодах одновременно.
Детерминизм — главное требование к EVM. Нельзя делать случайные операции. Нельзя читать внешние данные напрямую. Нельзя получить текущее время с точностью до секунды — только номер блока. Всё, что может дать разные результаты на разных машинах, запрещено. Именно поэтому оракулы — необходимая часть DeFi-экосистемы.
Каждая операция внутри EVM стоит определённое количество gas: простое сложение двух чисел — 3 gas, запись данных в хранилище контракта — 20 000 gas. Чем сложнее контракт, тем дороже его выполнение. Детальный разбор системы газа — в уроке 2.7.
Стандарт EVM стал де-факто индустриальным. BNB Chain, Polygon, Avalanche C-Chain, Arbitrum — все они EVM-совместимы. Контракт, написанный для Ethereum, можно задеплоить в любую из этих сетей без изменения кода. Это резко снизило порог входа для разработчиков и ускорило рост всего DeFi-сектора.
Solidity: язык смарт-контрактов
EVM исполняет bytecode. Его получают компиляцией из читаемого кода на Solidity — языке, который Гэвин Вуд создал в 2014 году специально для EVM. Синтаксически он похож на JavaScript. Вам не нужно уметь на нём программировать — но умение читать базовый Solidity-код реально помогает: вы сможете понять, что делает контракт, прочитать аудиторский отчёт и разобраться в описании уязвимости.
Посмотрите на простой пример — контракт-копилка. Любой может пополнить, только владелец может забрать:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Piggybank {
address public owner; // адрес владельца — хранится в блокчейне
uint256 public balance; // текущий баланс в wei
constructor() {
owner = msg.sender; // создатель контракта становится владельцем
}
// Любой может пополнить копилку, отправив ETH
function deposit() external payable {
balance += msg.value;
}
// Только владелец может забрать средства
function withdraw() external {
require(msg.sender == owner, "Not owner");
uint256 amount = balance;
balance = 0; // сначала обнуляем баланс
payable(owner).transfer(amount); // потом отправляем ETH
}
} Разберём ключевые элементы. address public owner — переменная состояния: хранится прямо в блокчейне и видна всем желающим. msg.sender — адрес того, кто вызвал функцию прямо сейчас. require — проверка условия: если оно не выполнено, транзакция отменяется целиком. payable — обозначает, что функция принимает ETH вместе с вызовом.
Обратите внимание на порядок в withdraw(): сначала обнуляем balance, и только потом отправляем ETH. Это не случайно. Нарушение именно этого порядка привело к крупнейшему взлому в истории Ethereum — о нём в разделе про уязвимости.
ABI (Application Binary Interface) — описание всех публичных функций контракта и их параметров. Именно через ABI ваш кошелёк или dApp понимает, как взаимодействовать с контрактом: какие функции доступны и что им передавать. Events (события) — логи, которые контракт публикует в блокчейн при каждом значимом действии. MetaMask показывает их как «транзакция выполнена», Etherscan индексирует для поиска по истории.
Исходный код Solidity можно прочитать прямо на Etherscan: откройте страницу любого верифицированного контракта и нажмите вкладку «Contract». Это именно то, что видит аудитор. Если вкладки нет или код не верифицирован — вы имеете дело с чёрным ящиком.
Immutability и Upgradeable Proxies
Контракт написан, скомпилирован, задеплоен. А теперь важный вопрос: что, если через неделю в коде найдут баг? После деплоя в блокчейн код контракта неизменен навсегда. Никто — ни разработчик, ни хакер, ни сам Ethereum — не может тихо залатать уязвимость в уже живом контракте. Это и есть immutability (неизменяемость).
Плюс очевиден: никто не может тайно переписать правила после того, как вы вложили деньги. Что вы видели при деплое — то и будет работать. Минус тоже очевиден: найденный баг нельзя исправить. Деньги остаются в уязвимом контракте до тех пор, пока их не выведут — пользователи или хакер.
Эту проблему решает Upgradeable Proxy Pattern — обходной путь, который используют многие крупные протоколы. Архитектура выглядит так:
- Proxy-контракт — принимает все вызовы пользователей и перенаправляет их на исполнение
- Implementation-контракт — содержит реальную логику, именно его код выполняется при каждом вызове
- Storage — данные (балансы, настройки) хранятся в Proxy и не меняются при обновлении Implementation
- Владелец Proxy может заменить Implementation на новую версию — фактически «обновив» протокол без миграции данных
- Timelock — задержка между объявлением изменения и его вступлением в силу (обычно 24–72 часа), чтобы пользователи успели отреагировать и при необходимости вывести средства
Upgradeable Proxy — это централизованная точка доверия. Тот, кто контролирует Proxy, может изменить логику контракта в любой момент. Если timelock отсутствует или минимален — владелец теоретически может провести обновление быстрее, чем пользователи успеют вывести средства. Всегда проверяйте: кто управляет Proxy и есть ли timelock.
Главные уязвимости: как хакеры крадут миллионы
Неизменяемость означает, что баг в живом контракте не исправить. А баги бывают. С 2016 по 2026 год хакеры вывели из DeFi-протоколов более $6 млрд. Почти все крупные взломы объясняются несколькими классическими типами уязвимостей. Понимание их механики — практическое знание, которое помогает оценивать риски конкретного протокола.
| Тип уязвимости | Реальный взлом | Потери |
|---|---|---|
| Reentrancy Attack | The DAO, 2016 | $60 млн ETH |
| Flash Loan + манипуляция оракулом | Harvest Finance, 2020 | $34 млн |
| Access Control (права доступа) | Ronin Bridge, 2022 | $625 млн |
| Integer Overflow/Underflow | BEC Token, 2018 | Обрушение токена до нуля |
| Logic Error (ошибка логики) | Euler Finance, 2023 | $197 млн |
Разберём каждую уязвимость по механике — от самой классической к современным.
Reentrancy Attack — самая опасная классика
Вернёмся к контракту-копилке из раздела про Solidity. Помните, что функция withdraw() сначала обнуляет баланс и только потом отправляет ETH? Теперь представьте, что разработчик перепутал порядок: сначала отправил ETH, потом обнулил баланс. Именно здесь и открывается дверь для reentrancy.
Механика атаки: контракт-жертва вызывает внешний контракт — например, отправляет ETH получателю. Злоумышленник в своём контракте реализует функцию receive(), которая при получении ETH немедленно снова вызывает функцию вывода у жертвы. Баланс в контракте-жертве ещё не обнулился — функция снова отрабатывает и снова отправляет ETH. Цикл повторяется, пока в контракте не закончатся средства.
Именно так в 2016 году был взломан The DAO — один из первых крупных DeFi-проектов на Ethereum. Хакер вывел $60 млн в ETH. Это событие спровоцировало раскол сообщества и хардфорк, после которого появилась отдельная сеть Ethereum Classic — подробнее об этом в уроке 2.10 про форки блокчейна.
Решение — паттерн Checks-Effects-Interactions. Сначала проверяй условия (Checks), потом обновляй внутреннее состояние контракта (Effects), и только потом вызывай внешний код (Interactions). Именно так устроена наша копилка: баланс обнуляется до отправки ETH.
Flash Loan Attack — современная угроза
Flash loan (мгновенный заём) — это заём без залога, который нужно взять и вернуть в рамках одной транзакции. Если деньги не возвращены до конца транзакции — она отменяется целиком, как будто её не было. Сами по себе flash loan — легитимный инструмент для арбитража.
В руках атакующего схема иная: взять $100 млн flash loan → обрушить цену токена в DEX крупной продажей → использовать искажённую spot-цену в протоколе, который читает её вместо нормального оракула → вывести чужие средства по перекошенной цене → вернуть flash loan. Всё это происходит в одной транзакции, за секунды. В 2020 году Harvest Finance потерял $34 млн именно по этой схеме: злоумышленник манипулировал ценой USDC/USDT в Curve, что заставило протокол выдать атакующему значительно больше, чем положено.
Access Control — ошибки прав доступа
Некоторые функции в контракте должны быть доступны только владельцу или доверенным адресам: вывод средств, смена параметров протокола, выпуск дополнительных токенов. Если проверка «кто вызывает» отсутствует или реализована с ошибкой — любой желающий может выполнить эти действия. Взлом Ronin Bridge в 2022 году на $625 млн стал следствием компрометации приватных ключей валидаторов в сочетании с ошибками в логике проверки кворума: злоумышленник смог авторизовать массовый вывод средств без достаточного числа подписей.
Integer Overflow/Underflow — арифметические ошибки
В Solidity до версии 0.8 целые числа не проверялись на переполнение. uint8 хранит значения от 0 до 255. Прибавьте к 255 единицу — получите 0. Вычтите из 0 единицу — получите 255. Программа не выдаёт ошибку: она просто «переполняется» по кругу.
В 2018 году токен BEC (BeautyChain) был взломан именно через overflow: ошибка позволила злоумышленнику создать колоссальное количество токенов из воздуха, что мгновенно обрушило их цену до нуля. С версии Solidity 0.8+ компилятор автоматически добавляет проверки и отменяет транзакцию при переполнении. Однако в старых контрактах или при использовании блока unchecked{} риск остаётся — и именно это первым делом проверяют аудиторы при анализе форков или унаследованного кода.
При оценке любого DeFi-протокола первый вопрос — не «сколько там TVL?», а «когда и кем был написан контракт?». Старые контракты на Solidity до 0.8, форки непроверенного кода, отсутствие аудита — это красные флаги, которые видны ещё до вложения денег.
Аудиты: защита, которая не гарантирует безопасность
Сообщество давно осознало риски уязвимостей. Первый ответ — аудит: ручная и автоматизированная проверка кода специализированными компаниями перед запуском протокола. Аудиторы ищут reentrancy, overflow, ошибки контроля доступа, flash loan векторы и логические ошибки в бизнес-логике.
Ведущие аудиторы рынка в 2026 году — Trail of Bits, OpenZeppelin, Certik, Hacken, Peckshield, Code4rena. Стоимость аудита — от $15 000 до $150 000 и выше, в зависимости от сложности кода и репутации компании. Отчёты публикуются открыто — это один из сигналов серьёзности проекта.
Но вот критически важная оговорка, которую часто игнорируют: аудит снижает риск, но не устраняет его. Реальные примеры этого хорошо известны рынку:
- Euler Finance, март 2023 — прошёл несколько аудитов, взломан на $197 млн
- Nomad Bridge, август 2022 — аудирован, потерял $190 млн
- Wormhole, февраль 2022 — аудирован, $320 млн похищено
- Harmony Horizon Bridge, 2022 — прошёл несколько аудитов, $100 млн потеряно
- Cream Finance, 2021 — многократно аудирован, трижды взломан суммарно на $190 млн
Bug Bounty — более живая форма защиты. Протоколы через платформы ImmuneFi и HackerOne предлагают вознаграждение любому, кто найдёт и ответственно раскроет уязвимость. Выплаты за критические уязвимости достигают $10 млн. С 2020 года ImmuneFi выплатил исследователям более $80 млн — и каждая такая выплата означает предотвращённый взлом. Активная программа bug bounty с высокими выплатами — реальный дополнительный уровень защиты.
При изучении аудиторского отчёта сразу открывайте раздел «Critical» или «High» — там самые опасные находки. Если написано «найдено и устранено» — хорошо. Если «команда осознала риск и решила не устранять» — это серьёзный сигнал тревоги вне зависимости от репутации аудитора.
Практика: как проверить смарт-контракт перед взаимодействием с ним
Аудит есть — но он не гарантирует безопасность. Что же вы можете проверить самостоятельно за 10–15 минут? Откройте Etherscan — блокчейн-эксплорер Ethereum, где можно изучить любой контракт в деталях. Адрес нужного контракта обычно указан в официальной документации или на сайте протокола.
Для наглядности откройте в качестве примера контракт токена USDC на Etherscan — один из самых изученных и верифицированных контрактов на Ethereum — и пройдитесь по нему по чеклисту ниже.
Вот что нужно проверить по порядку:
- Verified Source Code — на странице контракта должна быть зелёная галка и вкладка «Contract» с кодом на Solidity. Если кода нет — вы имеете дело с чёрным ящиком, риск максимален.
- Возраст контракта — новый контракт без истории транзакций (менее 3 месяцев) несёт повышенный риск. Дата деплоя и объём транзакций — косвенная проверка боевым огнём.
- Proxy check — на Etherscan ищите пометку «This contract is a proxy». Если proxy — кто управляет? Есть ли timelock? Timelock менее 24 часов даёт пользователям слишком мало времени для реакции.
- Аудит — ищите публичный отчёт, а не просто логотип аудитора на сайте. Убедитесь, что отчёт датирован последней версией контракта. Прочитайте секцию Critical/High.
- TVL на DeFiLlama — сколько средств находится в протоколе прямо сейчас. $500 млн+ TVL означает, что тысячи пользователей доверяют ему деньги в течение длительного времени. Это не гарантия, но рыночная проверка временем.
- Bug Bounty программа — есть ли активная программа вознаграждений на ImmuneFi? Какой максимальный размер выплаты за критическую уязвимость? Серьёзные протоколы платят от $1 млн и выше.
Ни один из этих пунктов не даёт стопроцентной гарантии. Euler Finance прошёл все эти проверки — и всё равно был взломан. Но каждый пункт статистически снижает вероятность потерь. Аудированный протокол с TVL $1 млрд, пятилетней историей и активным bug bounty — намного безопаснее анонимного форка с неверифицированным кодом, запущенного три недели назад.
Перед изучением любого DeFi-протокола смотрите его историю на Rekt.news — там публикуется каждый значимый взлом с разбором механики. Это бесплатная база знаний о том, что реально пошло не так — и почему.