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

Разрешение на расходование токена — это записанное в контракте право указанного адреса списывать с вашего баланса до определённой суммы, причём запись хранится в той сети, где она была создана.

Ошибка в рассуждении возникает из-за одинаковых адресов. Адрес выглядит один. Кошелёк один. Разрешения разные — потому что контракт токена в каждой сети свой, и запись о доступе лежит в его памяти, а не в вашем кошельке.

Под какой сценарий подбирается кошелёк и порядок инвентаризации

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

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

Схема из пяти шагов: перечень сетей по истории адреса, выгрузка разрешений в каждой сети, отбор лишних прав по сумме и давности, отзыв разрешений по одной сети за раз, контрольная сверка после отзыва
Схема из пяти шагов: перечень сетей по истории адреса, выгрузка разрешений в каждой сети, отбор лишних прав по сумме и давности, отзыв разрешений по одной сети за раз, контрольная сверка после отзыва

Сравнение видов доступа: что меняется для пользователя

Вид доступа Где хранится запись Переносится ли между сетями Как убирается
Разрешение на расходование токена В контракте токена той сети, где выдано Нет Транзакцией в той же сети, с установкой остатка в нуль
Разрешение неограниченной суммы Там же, значением предельной величины Нет Отзывается первым: сумма не ограничена ничем
Доступ, выданный контракту-посреднику В контракте токена, адресатом указан посредник Нет Отзыв в сети посредника, с проверкой адреса реализации
Подпись намерения с отложенным исполнением Вне цепи, до момента предъявления Зависит от того, включён ли идентификатор цепи Сменой адреса или истечением срока подписи
Ключ наблюдения, отданный сервису У сервиса Относится ко всем сетям сразу Не отзывается: сменой счёта или путей вывода

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

Инвентаризация шаг за шагом

  1. Соберите перечень сетей, где адрес хоть раз появлялся: по истории в обозревателях, по письмам площадок, по приложениям, которыми вы пользовались.
  2. В каждой сети выгрузите действующие разрешения: кому выдано, на какой токен, на какую сумму, когда. Таблица на одном листе.
  3. Отметьте лишнее по двум признакам: сумма не ограничена либо последняя операция с этим адресатом была больше полугода назад.
  4. Отзывайте права по одной сети за раз, устанавливая остаток в нуль, и сверяйте результат запросом остатка после каждой транзакции.
  5. Для доступов, выданных контракту-посреднику, проверьте адрес текущей реализации: посредник мог сменить логику, оставив тот же внешний адрес.
  6. Запишите итог: сеть, число отозванных прав, дата. Через полгода эта запись станет точкой отсчёта для следующей ревизии.
Как устроено само разрешение. Стандарт ERC-20 (статус Final, создан 19 ноября 2015 года) описывает функцию approve как разрешение указанному адресу списывать с вашего счёта многократно, в пределах заданной суммы, а функция allowance возвращает остаток этого права. Там же сказано, что клиентским приложениям следует сначала устанавливать разрешение в нуль, прежде чем задавать новое значение для того же адресата. Для инвентаризации это и есть рабочая процедура отзыва.

Резервная копия и проверка восстановления

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

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

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

Типовые ошибки, которые стоят денег

Уверенность, что отзыв в одной сети закрывает доступ везде. Запись о разрешении лежит в контракте токена конкретной цепи, и соседние сети о ней не знают. Отозвав права в основной сети, вы не тронули ни одного разрешения в остальных.

Вторая ошибка — отзыв по подсказке всплывающего окна. Страница предлагает «очистить разрешения одним нажатием», и подписанная не глядя транзакция вместо отзыва выдаёт новое право тому же адресату, причём на неограниченную сумму и в той сети, которую владелец не собирался трогать. Читайте, что подписываете.

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

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

Что делать при утере доступа

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

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

Чек-лист

  • Перечень сетей, где адрес использовался, собран и записан
  • Разрешения выгружены отдельно по каждой сети
  • Неограниченные по сумме права отмечены для отзыва первыми
  • Права старше полугода без операций признаны лишними
  • Отзыв выполнен по одной сети за раз, с установкой остатка в нуль
  • Результат каждого отзыва сверен запросом остатка
  • Для посредников проверен адрес текущей реализации
  • Итог ревизии записан с датой как точка отсчёта

Материалы по теме:

Частые вопросы

Я отозвал разрешение. В других сетях оно тоже снято?

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

Как узнать, в каких сетях я вообще работал?

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

Чем опасно неограниченное разрешение?

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

Что проверять у контракта-посредника?

Адрес текущей реализации. Многие посредники построены как прокси: внешний адрес неизменен, а логика хранится в отдельном контракте, адрес которого администратор вправе сменить. Стандарт EIP-1967 задаёт для этого адреса фиксированный слот, и обозреватели сетей показывают его значение в карточке контракта.

Вердикт

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

Разборы и предупреждения о свежих схемах публикуем в Telegram-канале Cryptium.

Источники: спецификация ERC-20 о функциях approve и allowance и спецификация EIP-1967 о слотах хранения прокси-контрактов.