Что такое одобрение токена на самом деле

В сети вроде Ethereum токены — USDT, USDC — это каждый отдельный контракт, который ведёт свой учёт. Когда вы хотите обменять USDT на ETH на DEX вроде Uniswap, возникает загвоздка: контракт Uniswap не может просто списать USDT с вашего счёта, у него нет на это прав.

Поэтому стандарт ERC-20 разбивает действие на два шага. Сначала вы вызываете у контракта токена approve(spender, amount) — это говорит контракту USDT: «я разрешаю вот этому адресу Uniswap двигать с моего счёта не больше стольких-то USDT». Затем, когда Uniswap проводит обмен, он вызывает transferFrom и списывает токены. Первый шаг — это одобрение, второй — уже сама трата.

На этом механизме держится вся DeFi: обмены на DEX, депозиты в кредитные протоколы, перевод токенов между сетями через мост — почти везде под капотом есть approve. Проблема в двух местах: сумма одобрения и его срок жизни. Думать о них вас никто не заставляет, а дефолт кошелька обычно делает за вас самый ленивый и самый опасный выбор.

Почему безлимитный апрув — главная лазейка

Когда большинство dApp показывают запрос approve, подставленная сумма — это не «та мелочь, что вы меняете прямо сейчас», а максимальное значение uint256, то есть фактически безлимит. Логика прагматичная: одобрил безлимит один раз — и больше не нужно подписывать approve для этого токена, опыт остаётся гладким. Расплата в том, что вы отдали контракту-spender контроль над всем балансом этого токена и над всем, что когда-либо на него зайдёт в будущем.

Главное — срок жизни: одобрение не истекает само. Безлимитный апрув, который вы выдали какому-то протоколу три года назад ради одного обмена, действует и сегодня. В тот день, когда тот контракт взломают — или если он с самого начала был фишинговым и ждал момента, — атакующему достаточно один раз вызвать transferFrom, и баланс этого токена уходит весь и сразу: ни приватного ключа не нужно, ни новой подписи, потому что вы всё подписали давным-давно.

Внимание

Безлимитный апрув плюс взломанный контракт — это классический ончейн-сценарий «потерять средства во сне». Большинство тех, кого опустошили, не попались на фишинг именно в тот день — одобрение, выданное задолго до этого, наконец сработало против них. Это не то же самое, что утёкший приватный ключ: при утечке ключа теряется весь адрес, а при злоупотреблении одобрением вы обычно теряете только тот токен, который был одобрен. Но выдайте безлимитные апрувы десятку протоколов — и вы прорубили в одной стене десяток дверей.

Чего на самом деле хотят мошенники: ваших одобрений

Как только вы понимаете механизм одобрений, огромный пласт кошельковых разводов вдруг становится ясным: им нужен не ваш приватный ключ, они разводят вас на подпись одобрения или эквивалентной подписи. Именно поэтому случается то самое «я никому не говорил seed-фразу, как же я потерял средства?» — вы не сливали seed, вы просто один раз подписали не то одобрение. Мы разбирали несколько реальных кейсов на сайте, и наживка везде одна и та же — этот самый шаг с одобрением:

  • Фейковый эирдроп, который заманивает вас подписать фишинговую ловушку с setApprovalForAll — переключатель «одобрить всё» для NFT, после подписи которого вся коллекция оказывается в распоряжении атакующего.
  • Страница под видом нормальной DEX, прячущая поддельный обмен через Permit EIP-2612 — вы думаете, что подписываете обычный обмен, а на деле подписываете офчейн-одобрение.
  • Ловушка с permit в bid на Blur, вшитая в процесс выставления оферты на NFT-маркетплейсе, — безобидная на вид «подпись листинга», которая тихо уводит одобрение.
  • Поддельная подпись Permit2, выдающая себя за Uniswap, — нацелена ровно на тот механизм Permit2, о котором речь ниже.

Общее у этих кейсов — момент подписи: в попапе либо непонятный hex, либо всё аккуратно обёрнуто под «обычную операцию». Защита от них — это не только «не кликать что попало», но и понимание того, что именно вы одобряете, и зачистка лишних одобрений потом. Первую часть — как включить разбор подписи — мы разбирали в Настройках безопасности MetaMask для повседневной работы; проверка и отзыв — тема этого гайда.

Шаг первый · найти свои текущие одобрения

По памяти свои одобрения вы не перечислите — у того, кто в теме год-два, список обычно пугающе длинный. Хорошая новость: одобрения — это публичные ончейн-данные, посмотреть может кто угодно. Чаще всего используют три типа инструментов:

Чекеры одобрений в блок-эксплорерах

В Ethereum это Etherscan, в BNB Chain — BscScan, у обоих встроен Token Approval Checker (адрес вида etherscan.io/tokenapprovalchecker). Вставьте адрес — и он выведет все ERC-20 / ERC-721 одобрения, которые этот адрес выдал: кто spender, какой размер allowance, для какого токена. Безлимитные одобрения помечаются как Unlimited, так что их видно сразу.

Это самый авторитетный источник — данные идут прямо из самой цепочки. Минус в том, что всё по сетям: Etherscan видит только мейннет Ethereum, а ваши одобрения в Arbitrum, Optimism или Base надо проверять в их эксплорерах. Пройдите по каждой сети, которой вы пользовались, отдельно — не проверяйте один мейннет и не считайте, что всё чисто.

Агрегаторы вроде revoke.cash

revoke.cash — самый ходовой сторонний инструмент в этой области, он собирает одобрения из нескольких сетей в один интерфейс: подключите кошелёк или вставьте адрес — и он подтянет весь набор ваших одобрений по сетям, отсортированный по сумме и дате последнего использования, отметив безлимитные и те, к которым вы давно не притрагивались. Можно даже запустить отзыв прямо здесь, не возвращаясь в эксплорер вызывать контракт руками.

Пояснение

Проверка одобрений — только чтение: вставить адрес для запроса не требует ни подключения кошелька, ни подписи — это безопасно. Подключение кошелька, подпись и gas нужны только на шаге самого отзыва. Поэтому «сначала проверить, решить, что отзывать, потом подключиться и действовать» — порядок безопаснее. Заходя на такие инструменты, обязательно набирайте официальный домен вручную или используйте закладку — не переходите из рекламы в поиске или из ссылки в Twitter. Поддельные сайты живут именно за счёт этого.

Встроенный менеджер одобрений в кошельке

Многие кошельки сегодня уже несут собственную панель одобрений. MetaMask в версиях после 11.x позволяет увидеть часть одобрений в деталях токена или в меню безопасности и отозвать их прямо там; ряд мобильных кошельков спрятал похожий вход в «Настройки / Безопасность». Встроенные инструменты выигрывают тем, что не надо выходить из кошелька, но покрывают они, как правило, меньше сетей и токенов, чем специализированные. Сам я в повседневке быстро поглядываю на встроенную панель, а при периодической большой уборке сверяюсь с эксплорером плюс revoke.cash.

Шаг второй · как отозвать

Первым делом запомните: отзыв — это тоже ончейн-транзакция, и за неё платят gas. Это не настройка, которую тыкаешь на сайте, — это настоящая транзакция в сеть, переписывающая allowance, записанную в контракте токена. Поэтому перед отзывом убедитесь, что в кошельке есть немного нативной монеты сети (ETH, BNB и т. д.) на комиссию. На примере revoke.cash — у других инструментов поток почти такой же:

  1. Подключите кошелёк и убедитесь, что сеть, показанная в правом верхнем углу, — это та сеть, чьи одобрения вы хотите чистить. Сетей несколько — переключайтесь и обрабатывайте каждую по очереди.
  2. Выберите в списке spender'ов на отзыв. В приоритете три типа: всё с allowance Unlimited, всё, что использовалось очень давно, и любой контракт, чьё имя вы вообще не узнаёте.
  3. Нажмите Revoke — кошелёк покажет запрос транзакции. Здесь вы подписываете — прочитайте, что он собирается сделать, прежде чем подписать. Нормальный отзыв ставит allowance в 0 или возвращает setApprovalForAll в false.
  4. Заплатите gas и дождитесь подтверждения. Как только транзакция попала в сеть, то одобрение мертво.

Различайте два типа одобрений и способ отзыва каждого. Одобрение ERC-20 (USDT, USDC и подобные) — это сумма, так что отзыв = поставить сумму в 0, хотя можно и не до нуля, а до небольшой достаточной суммы. ERC-721 / ERC-1155 (NFT) обычно используют setApprovalForAll — это переключатель: либо всё включено, либо всё выключено, без «убавить сумму». Отзыв = вернуть это булево значение в false.

Из практики · пример

Однажды я сделал полную чистку на основном адресе, которым пользовался больше трёх лет (цифры ниже — для иллюстрации). По четырём сетям нашлось больше 40 одобрений, больше половины безлимитных, самое старое — от протокола, который я использовал один раз два года назад и больше не трогал. Отзыв по одному вышел примерно в десяток с лишним долларов gas, разбил на два вечера, когда сеть была свободна.

Чем особенны Permit и Permit2

Описанный выше approve — это ончейн-одобрение: оно само по себе транзакция, остаётся в истории, поэтому его можно найти. А популярные в последние годы Permit (EIP-2612) и Permit2 от Uniswap — это одобрения, подписанные офчейн, и это усложняет проверку.

Permit задумывался ради экономии gas: вместо отдельной транзакции approve вы офчейн подписываете сообщение-одобрение и отправляете эту подпись вместе с самим действием, сливая одобрение и использование в один шаг. Минус в том, что эта подпись не обязательно оставляет отдельную ончейн-запись approve, и в истории транзакций вы можете вообще не увидеть, что именно одобрили. Мошенники эксплуатируют ровно это, маскируя вредоносное одобрение под одну безобидную подпись.

Permit2 — единый контракт одобрений от Uniswap. Логика такая: вы делаете один ончейн-approve (часто безлимитный) на единственный контракт Permit2, и дальше все приложения, использующие Permit2, запрашивают у него allowance офчейн-подписью, а Permit2 двигает ваши токены за них. Это собирает управление одобрениями в одном месте, но и означает, что сам контракт Permit2 держит большие права над вашими токенами.

Как проверять Permit2:

  • Сначала посмотрите, какие ERC-20 approve вы выдали на адрес контракта Permit2 — это ончейн-записи, их видно в эксплорере или revoke.cash.
  • Затем проверьте allowance, которые Permit2 выдал внутри себя: инструменты вроде revoke.cash уже читают внутренние связи одобрений Permit2 и показывают, каким приложениям он передал права, на какую сумму и когда они истекают.
  • У под-одобрений Permit2 может быть срок истечения, но многие дефолты по-прежнему ставятся очень длинными. Периодически заходите и убирайте под-одобрения, которыми больше не пользуетесь, вместе со слишком длинными сроками.
Внимание

Поскольку всё идёт через офчейн-подпись, в попапе Permit / Permit2 обычно видна структурированная подпись, а не «транзакция перевода», и это сбивает с толку сильнее. Заведите привычку: если в подписи всплывают слова вроде Permit, spender, allowance — остановитесь и прочитайте адрес spender и сумму; не сходится с ожиданием — отклоняйте. Как заставить кошелёк показывать эти поля человеческим языком — в разделе про разбор подписи в Настройках безопасности MetaMask.

Лучшие практики · держать экспозицию минимальной

Проверка и отзыв — это лечение постфактум; по-настоящему спокойнее, когда вы изначально не размазываете экспозицию так широко. Несколько правил, которых я всегда держусь:

  • Отозвал, как закончил. Попробовал новый протокол или сделал разовый mint — отзови одобрение, как только закончил: дверь закрывается ровно в момент завершения сделки.
  • Не давай безлимит. Если попап approve позволяет менять сумму, давай только то, что нужно этой транзакции. Большинство крупных кошельков и dApp сейчас поддерживают свою сумму.
  • Аудит регулярно. Задай себе ритм — например, раз в квартал прогонять сети через revoke.cash и чистить безлимитные, давно не использованные и неузнаваемые.
  • Крупные средства — на отдельный кошелёк, который никогда не подключается к dApp. Это самая действенная физическая изоляция: основные активы на адресе, который ни к чему не подключается, а для повседневной активности — другой «передовой» адрес с небольшим балансом; передовую разведут — основной запас цел. Про слоение по адресам — в полном гайде по кошелькам.
  • Читай перед подписью. Последний рубеж любой защиты — те три секунды перед подписью; понять spender и сумму важнее любого инструмента.

Стоимость и несколько частых мифов

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

Миф первый: отзыв бесплатный. Нет — это ончейн-транзакция, и вы платите gas. Поэтому отзывать каждое одобрение из истории незачем. В приоритете безлимитные, ненужные и непонятного происхождения; небольшая allowance доверенному протоколу, которым вы часто пользуетесь, может остаться — сэкономите gas на повторных апрувах.

Миф второй: есть одобрение = уже обокрали. Нет. Одобрение лишь означает, что spender мог бы двинуть ваши токены, но не что их уже двинули. Нашлась куча безлимитных одобрений — не пугайте себя сразу: сортируйте по риску и отзывайте с самых опасных. Беда случается только при условии, что тот контракт вредоносный или взломан.

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

Миф четвёртый: сменил приложение-кошелёк — старые одобрения пропали. Нет. Одобрение привязано к адресу, а не к тому приложению, которым вы его открываете. Пока на старом адресе ещё есть токены, те одобрения остаются действующими и остаются риском — надо подключиться и отозвать. Если старый адрес полностью пуст и не используется, можно оставить, но безопаснее вывести его из обращения и больше никогда не отправлять туда никаких активов.

Что подводит к углу, который не обойти: вся эта возня с проверкой, отзывом и аудитом — это, по сути, цена самостоятельного хранения: вы сами управляете ключами, значит, сами управляете одобрениями. Если часть активов лежит просто на долгий срок, без планов на частые ончейн-взаимодействия, то на централизованной бирже вроде Binance вопрос одобрений просто не возникает: платформа хранит за вас, и вы не теряете средства из-за одного неверного одобрения (в обмен — нужно доверять самой платформе). У самостоятельного хранения и кастодиального — свои компромиссы, и делить средства по назначению — более реалистичный путь; об этом мы тоже подробно говорим в холодный кошелёк vs горячий кошелёк.

Напоследок

Одобрения токенов — это водопроводные трубы под DeFi: используешь с умом — всё работает гладко, упустишь — и это незапертая дверь на вашем кошельке. Гайд сводится к трём вещам: понимать, что такое одобрение, регулярно проверять, что вы выдали, и отзывать лишнее и опасное. Плюс одна привычка, проходящая через всё, — читать, что именно вы одобряете, перед подписью.

Уделите десять минут сегодня и прогоните свой повседневный адрес через revoke.cash. С большой вероятностью всплывёт пара безлимитных одобрений, о которых вы давно забыли, — отзовите их, и, возможно, вы только что перекрыли будущую потерю, о которой никогда бы и не узнали.

Интерфейсы и инструменты меняются быстро. Если что-то в этом гайде не сходится с тем, что вы видите, — напишите нам, мы фиксируем это на странице исправлений. Беды с одобрениями обычно идут вместе с обманной подписью, так что советую прочитать Настройки безопасности MetaMask вместе с этим: там — «как прочитать перед подписью», а здесь — «как забрать обратно после»; две защиты, одна до и одна после.