ШКОЛА
КРИПТОВАЛЮТЫ
Журнал о цифровых деньгах
Знания. Инструменты. Практика.
Все материалы ↗

Смарт-контракт: что он делает и чего не гарантирует

Что такое смарт-контракт простыми словами, где пределы его гарантий и как работают разрешения approve на списание токенов. Учебная модель лимита, проверка запроса на подпись и отзыв доступа.

Металлический механизм с ограничителем, в который вставлен бумажный талон; рядом лежат монета и оранжевый рычажок.
Редакционная иллюстрация · OpenAI
В этом материале

Смарт-контракт – это программа, записанная в блокчейн по своему адресу. Она хранит данные и выполняет заранее заданные действия, когда кто-то вызывает её транзакцией, и результат одинаков для всех узлов сети. Контракт гарантирует только то, что написано в его коде: он не проверяет честность авторов, не знает о событиях вне блокчейна без внешних источников данных и не отменяет ошибочную операцию. Для пользователя главный практический риск – разрешения, которые вы подписываете контрактам на списание своих токенов.

Как работает смарт-контракт

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

Классическая метафора, которую ethereum.org приводит со ссылкой на Ника Сабо, – торговый автомат. Вы выбираете товар, платите, автомат проверяет сумму и выдаёт покупку. Если не хватает денег, товара не будет. Так и контракт детерминированно исполняет однозначный код при выполнении условий, без посредника, который толкует договор.

Из того же описания следуют свойства, важные для пользователя:

  • Необратимость. По документации, контракты по умолчанию нельзя удалить, а взаимодействие с ними необратимо.
  • Публичность. Код и состояние находятся в блокчейне, любой может их прочитать. Понять их без подготовки сложно, но обозреватели блоков часто показывают проверенный исходный код.
  • Плата за исполнение. Любой вызов, меняющий состояние, требует газа. Чтение данных функциями view и pure из внешнего аккаунта газа не требует. Это описано в документации транзакций.

Ethereum.org для разработчиков упоминает, что Ethereum содержит два вида аккаунтов: внешние, управляемые приватным ключом, и контрактные, управляемые кодом. Отправить транзакцию может только внешний аккаунт, то есть человек с ключом. Контракт отвечает на вызовы, но сам по себе ничего не начинает. О том, как устроены ключи внешних аккаунтов, рассказано в материале «Как работает криптокошелёк».

Чего контракт не гарантирует

Что обеспечивает код и что остаётся за его пределами
ГарантируетНе гарантирует
Исполнение кода одинаково для всех узловЧто код делает то, что обещано в описании проекта
Выполнение условий, записанных в кодеОтсутствие ошибок и уязвимостей в этих условиях
Невозможность изменить уже совершённую операциюВозврат средств при ошибке пользователя
Работу с данными внутри блокчейнаПравильность данных о внешнем мире: их приносят отдельные источники, оракулы
Публичность кода и состоянияЧто у контракта нет администратора с особыми правами

Строка про внешний мир взята из раздела об ограничениях: по документации, контракт сам не может получить информацию о реальных событиях, потому что не обращается к данным вне сети. Это сделано намеренно: зависимость от внешней информации могла бы нарушить консенсус. Для таких данных используют оракулы, и надёжность контракта тогда зависит и от них.

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

Разрешения на токены: approve и transferFrom

Большинство токенов в Ethereum следуют стандарту ERC-20. В нём есть пара функций, ради которых стоит прочитать этот раздел.

  • approve(spender, value) разрешает адресу spender списывать с вашего счёта токены, многократно, в пределах value. По стандарту повторный вызов перезаписывает текущий лимит новым значением.
  • transferFrom(from, to, value) позволяет контракту переводить токены от вашего имени. Стандарт называет это сценарием вывода: контракт списывает токены сам, когда вы, например, обмениваете их или вносите в протокол.

Так работает почти любое децентрализованное приложение. Сначала вы даёте контракту разрешение, затем вызываете его функцию, и он забирает нужную сумму. Расширение ERC-2612 позволяет выдать такое разрешение подписью сообщения, без отдельной транзакции. Поэтому «просто подписать сообщение» тоже может означать выдачу права на ваши токены.

Учебный пример: как расходуется лимит

Учебный пример. Правила approve и transferFrom из ERC-20 смоделированы в Python. Токен условный, с 6 знаками после запятой; реальные контракты и средства не использовались.

Пошаговая модель разрешения
ШагДействиеРезультат модели
1На вашем адресе 500 токенов. Вы даёте контракту approve на 100Лимит 100
2Контракт списывает 60 через transferFromУспешно, остаток лимита 40
3Контракт пытается списать ещё 50Отказ: лимит меньше суммы
4Вы вызываете approve с нулёмЛюбое списание отклоняется
5Вы даёте «неограниченное» разрешение: максимальное число 2256 − 1Лимит около 1,16 × 1071 токенов
6Контракт списывает весь остаток, 440 токенов, на чужой адресУспешно, баланс 0

Шаг 6 показывает суть риска. Неограниченное разрешение даёт контракту право забрать весь баланс токена в любой момент, без вашей новой подписи. Гайд ethereum.org об отзыве доступа предупреждает: если платформа получила неограниченные права на токен, она может потратить все эти токены, даже если вы давно вывели средства с неё в свой кошелёк. Если такой контракт взломан или изначально вредоносен, восстановить средства будет нельзя.

Почему суммы в разрешении выглядят странно

Контракт хранит суммы целыми числами, а функция decimals из ERC-20 подсказывает, на сколько знаков сдвинуть запятую при показе. Для токена с 6 знаками «сырое» значение 2 500 000 означает 2,5 токена. Кошелёк обычно показывает пересчитанную сумму, но при неограниченном разрешении он может написать просто «без ограничений» или показать огромное число.

Как читать запрос на подпись

Прежде чем подтвердить действие в кошельке, ответьте на четыре вопроса.

  1. Какой это тип действия? Перевод, вызов функции контракта, разрешение на токен или подпись сообщения. Разрешение и подпись часто выглядят безобидно, но могут дать право на списание.
  2. Кому выдаётся право? Адрес spender должен принадлежать сервису, которым вы пользуетесь. Ethereum.org советует сверять адреса контрактов с официальным сайтом проекта.
  3. На какую сумму? Ethereum.org рекомендует не выдавать неограниченные лимиты, а ставить ровно ту сумму, которая нужна для операции. Многие кошельки позволяют изменить лимит перед подписью.
  4. На каком сайте вы находитесь? Фишинговые копии приложений просят такие же разрешения. Проверьте домен; надёжнее заходить через закладки.

Если сайт обещает бесплатные токены за «подтверждение» в кошельке, это прямой сценарий airdrop-мошенничества из раздела безопасности ethereum.org. Похожие схемы, где выманивают сид-фразу, разобраны в статье «Сид-фраза: что она открывает и как избежать её утечки».

Как отозвать разрешение

Ethereum.org описывает процедуру в отдельном гайде:

  1. Откройте инструмент просмотра разрешений. Гайд перечисляет несколько, в том числе функции в обозревателях блоков. Переходите по ссылке из гайда или проверенной закладки.
  2. Подключите кошелёк и выберите ту же сеть, что в кошельке. Разрешения в каждой сети свои: подключившись к основной сети Ethereum, вы не увидите разрешений в других сетях.
  3. Найдите контракты с доступом к вашим токенам и их лимиты.
  4. Отзовите ненужные. Кошелёк предложит отдельную транзакцию, и за неё нужно заплатить комиссию сети. Через несколько минут обновите страницу инструмента и убедитесь, что контракт исчез из списка.

Тот же гайд отвечает на частый вопрос: отключить кошелёк от сайта и отозвать разрешение – разные вещи. После отключения выданный лимит продолжает действовать, пока вы его не отзовёте.

Отзыв защищает от будущих списаний, но не возвращает уже списанное. Проверить, прошла ли транзакция отзыва, можно по её хешу в обозревателе, как описано в инструкции «Как проверить перевод криптовалюты по хешу транзакции».

Что можно узнать о контракте в обозревателе

Без программирования о контракте можно выяснить несколько полезных вещей. Набор вкладок у разных обозревателей отличается, но данные одни и те же, потому что берутся из блокчейна.

  • Адрес. Сверьте его с адресом, который проект публикует на официальном сайте. Совпадение названия и символа токена ничего не доказывает: гайд ethereum.org о поддельных токенах напоминает, что любой может выпустить токен с чужим именем.
  • Проверенный исходный код. Если автор опубликовал код и обозреватель сверил его с развёрнутым, вы видите функции контракта. Отсутствие кода – повод для осторожности.
  • Функции чтения. Можно посмотреть, например, decimals, общий выпуск и, в коде некоторых контрактов, адрес владельца с особыми правами. Чтение бесплатно и не требует подписи.
  • История транзакций. Видно, как давно контракт работает и насколько активно им пользуются.

Наличие кода и долгой истории не делает контракт безопасным. Это только снижает неопределённость и помогает задать правильные вопросы.

Где вы встречаете смарт-контракты

  • Токены. Стейблкоины и другие токены – это контракты с балансами внутри.
  • Обмен. Децентрализованные биржи работают через пулы ликвидности в контрактах.
  • Мультиподпись. По документации, мультиподписные контракты требуют несколько валидных подписей для выполнения транзакции.
  • Условное хранение. Пример с ethereum.org: контракт хранит средства для ребёнка и разрешает вывод только после определённой даты.

Во всех этих случаях действуют те же правила: код исполняется ровно так, как написан, а ответственность за выбор контракта и за подпись остаётся на пользователе.

Коротко

  • Смарт-контракт – программа по адресу в блокчейне, которая исполняется одинаково для всех и необратимо.
  • Он гарантирует исполнение кода, но не честность авторов, отсутствие ошибок и верность внешних данных.
  • Разрешение approve даёт контракту право списывать ваши токены без новой подписи в пределах лимита.
  • Выдавайте ограниченные лимиты, проверяйте адрес и домен, периодически отзывайте лишние разрешения.

Источники и подготовка

Материал подготовлен с помощью Claude по указанным источникам. Учебные примеры отмечены в тексте. Как мы работаем.

Следующий вопрос

Кошельки8 мин.

Как работает криптокошелёк: адрес, приватный ключ и доступ к средствам

Что на самом деле хранит криптокошелёк, чем адрес отличается от ключа и сид-фразы, и как сравнить биржевой счёт, приложение, аппаратный кошелёк и мультиподпись по контролю ключей.

Читать материал