Token approvals в Ethereum: что даёт разрешение смарт-контракту и как отозвать лишние доступы

Что такое token approval на уровне контракта​


Стандарт ERC-20 определяет функцию approve(spender, amount), которая записывает в хранилище токена разрешение для указанного адреса (spender) списывать до amount единиц токена с баланса вызывающего. Это разрешение хранится в маппинге allowance[owner][spender] внутри контракта токена и не привязано к сессии, браузеру или кошельку — оно существует на уровне состояния блокчейна.

Когда DEX, лендинг-протокол или любой другой смарт-контракт просит «подключить кошелёк и подтвердить транзакцию», за этим обычно стоит вызов approve. После подтверждения контракт получает право вызывать transferFrom(owner, recipient, amount) и перемещать токены с вашего адреса без повторного запроса.

Ключевые свойства approval:

  • Не имеет срока действия. Разрешение, выданное сегодня, будет активно и через пять лет, если его не отозвать.
  • Не привязано к балансу. Даже если вы вывели все токены с платформы на свой кошелёк, контракт с активным approval может списать токены в любой момент, когда они снова появятся на адресе.
  • Не отменяется отключением кошелька. Кнопка «Disconnect» на сайте убирает только UI-сессию. Запись в allowance остаётся в блокчейне.

Почему unlimited-разрешения создают риск​


Большинство DeFi-протоколов по умолчанию запрашивают approve на максимальное значение uint256 (часто отображается как Unlimited или ). Мотивация понятна: пользователю не нужно платить gas за повторный approve при каждой операции. Но это означает, что контракт получает неограниченный доступ ко всему балансу токена на вашем адресе.

Сценарии, при которых unlimited-approval приводит к потере средств:

  1. Уязвимость в контракте. Если в коде протокола обнаружен баг, атакующий может вызвать transferFrom и вывести токены всех пользователей, выдавших разрешение.
  2. Вредоносный контракт. Злонамеренный разработчик может встроить бэкдор, который списывает токены через некоторое время после взаимодействия.
  3. Компрометация приватного ключа разработчика. Если ключ деплоера украден, а контракт имеет upgradeable-прокси, логика может быть заменена на вредоносную.

Во всех трёх случаях пользователь не получает уведомления и не может отменить транзакцию после её подтверждения в блоке.

Как проверить активные approvals​


Существует несколько инструментов, которые читают состояние allowance для вашего адреса и выводят список контрактов с активными разрешениями:

ИнструментПоддерживаемые сетиОсобенности
Etherscan (Token Approvals)Ethereum MainnetВстроен в блок-эксплорер, показывает лимит и контракт
BlockscoutEthereum и совместимые сетиОткрытый эксплорер с аналогичной функцией
Revoke.cashНесколько сетей (Ethereum, Polygon, Arbitrum, BSC и др.)Специализированный интерфейс для отзыва
UnrektНесколько сетейАгрегатор с проверкой на известные эксплойты
EverRevokeНесколько сетейПоддержка множества EVM-совместимых цепочек

Общий принцип работы с любым из этих инструментов:

  1. Подключите кошелёк (обычно через WalletConnect или инъекцию провайдера).
  2. Убедитесь, что выбрана правильная сеть. Approvals в Ethereum Mainnet и в Polygon — это разные записи в разных блокчейнах.
  3. Инструмент отобразит список контрактов, для которых allowance > 0, с указанием токена, лимита и адреса контракта.

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


Отзыв approval — это транзакция, которая вызывает approve(spender, 0) для конкретного контракта и токена. По сути вы перезаписываете значение allowance на ноль.

Пошаговый процесс:

  1. Откройте один из перечисленных инструментов и подключите кошелёк.
  2. Найдите в списке контракт, доступ которого хотите отозвать.
  3. Нажмите кнопку «Revoke» (или аналогичную).
  4. Кошелёк предложит подтвердить транзакцию. Это обычная on-chain транзакция, которая требует оплаты gas.
  5. Дождитесь подтверждения (обычно от нескольких секунд до пары минут в зависимости от загрузки сети).
  6. Обновите страницу инструмента и убедитесь, что контракт исчез из списка или лимит стал равен нулю.

Стоимость отзыва​


Каждый отзыв — отдельная транзакция. Если у вас 20 активных approvals в Ethereum Mainnet, потребуется 20 транзакций. При высоком gas price это может быть ощутимо. В L2-сетях (Arbitrum, Optimism, Base) стоимость значительно ниже.

Что не происходит при отзыве​


  • Стейкинг, пулы ликвидности и лендинг-позиции не закрываются. Отзыв approval не влияет на средства, уже заблокированные в контракте. Вы остаётесь в позиции и продолжаете получать вознаграждения.
  • Баланс токена не меняется. Отзыв убирает только право контракта списывать токены в будущем.
  • NFT-approvals работают аналогично. Для ERC-721 и ERC-1155 существуют свои механизмы (setApprovalForAll, approve), и их отзыв происходит тем же способом через те же инструменты.

Типичные ошибки​


Отключение кошелька вместо отзыва. Кнопка «Disconnect wallet» на сайте dApp не отзывает approval. Это распространённое заблуждение: пользователь думает, что раз кошелёк отключён, контракт больше не имеет доступа. На деле запись в allowance сохраняется.

Проверка только в одной сети. Если вы взаимодействовали с протоколом в Polygon, Arbitrum и Ethereum Mainnet, approvals существуют в каждой из этих сетей отдельно. Нужно проверять и отзывать в каждой.

Игнорирование старых approvals. Разрешения, выданные год или два назад, всё ещё активны. Если протокол с тех пор не аудировался или сменил команду, риск возрастает.

Одобрение на сумму больше необходимой. Если вы меняете 100 USDC на DEX, нет смысла давать unlimited-approval. Некоторые кошельки позволяют вручную указать сумму при подписании транзакции approve.

Практики снижения риска​


  • Ограничивайте сумму approve. Если кошелёк позволяет отредактировать значение перед подписанием, указывайте только необходимый объём. При следующей операции потребуется повторный approve, но это осознанный trade-off между удобством и безопасностью.
  • Регулярно проводите аудит approvals. Раз в несколько недель проверяйте список активных разрешений и отзывайте те, которые больше не нужны.
  • Не взаимодействуйте с непроверенными контрактами. Если проект новый, не прошёл аудит и просит unlimited-approval — это красный флаг.
  • Читайте данные транзакции перед подписанием. Кошелёк показывает, какой метод вызывается и с какими параметрами. Если видите approve с amount = 2^256 - 1 (unlimited), оцените, доверяете ли вы этому контракту.
  • Используйте аппаратный кошелёк для крупных сумм. Даже если approval скомпрометирован, для его использования атакующему нужно, чтобы токены находились на адресе. Холодное хранение основной части средств снижает потенциальный ущерб.

Чек-лист перед взаимодействием с новым dApp​


  • Проверьте, запрашивает ли контракт unlimited-approval или конкретную сумму.
  • Убедитесь, что проект имеет публичный аудит смарт-контрактов.
  • Оцените, сколько токенов реально нужно для операции, и ограничьте approve этой суммой.
  • После завершения работы с протоколом отзовите approval, если не планируете возвращаться.
  • Зафиксируйте дату и сеть, в которой выдали разрешение, чтобы не потерять его при будущем аудите.

Источники​


 
Назад
Верх Низ