Смарт-контракты токенов включают функцию approve(), которая позволяет другому адресу тратить токены от имени владельца. Это ключевой элемент современной экосистемы смарт-контрактов: без него многие DeFi-приложения были бы невозможны. Например, для обмена токенов на децентрализованной бирже, такой как Uniswap, перед выполнением свопа необходимо предоставить разрешение на использование токенов.
Однако разрешения на использование токенов сопряжены со значительными рисками. Предоставляя смарт-контракту право тратить токены, вы разрешаете ему делать это в любое время. Если контракт будет взломан или содержит вредоносный код, злоумышленники могут воспользоваться этими разрешениями для кражи токенов.
Существующие решения, такие как Revoke.cash, отслеживают разрешения кошелька и позволяют отзывать их по запросу. Однако они основаны на ручном процессе, который необходимо выполнить до или во время эксплойта, что не всегда практично. Revoke.delegate — хакатон-проект, созданный на EthGlobal '24, — предлагает более эффективное решение: автоматический отзыв разрешений во время эксплойта, устраняя необходимость в постоянном мониторинге или ручных действиях. Рассказываем, как команде удалось этого достичь.
Задача: делегирование прав кошелька с сохранением конфиденциальности и права собственности
Чтобы включить автоматический отзыв разрешений на использование токенов во время эксплойта, пользователи должны делегировать Revoke.delegate определённые права кошелька. В данном контексте делегирование означает, что аккаунт смарт-контракта (делегатор) предоставляет конкретные права другому смарт-контракту или внешнему аккаунту (делегату) для выполнения определённых действий в соответствии с чётко установленными правилами и условиями.
Этот процесс позволяет Revoke.delegate безопасно определять адреса затронутых токенов, проверять заранее заданные условия и отзывать разрешения, вызывая функции approve() или setApprovalForAll() для обнуления лимитов.
Главная задача — соблюдение принципов конфиденциальности и самостоятельного владения: пользователи не должны передавать приватные ключи или утрачивать контроль над кошельком, предоставляя размытые разрешения. Команда также уделила приоритетное внимание совместимости с существующей экосистемой кошельков для обеспечения беспрепятственного внедрения.
Решение: безопасное делегирование прав кошелька и управление ими с помощью Delegation Toolkit (DTK)
Интеграция с Delegation Toolkit (DTK) позволила Revoke.delegate дать пользователям возможность делегировать права кошелька, сохраняя при этом полный контроль над ним. При поступлении сообщения об эксплойте Revoke.delegate безопасно извлекает пользовательские делегирования из Delegation Storage, управляемого DTK, и использует их для отзыва разрешений на токены для затронутых кошельков. Вот общий обзор процесса:
Пользователь подключает кошелёк для просмотра всех существующих разрешений на токены.
Он выбирает делегирование прав кошелька. В фоновом режиме вызывается функция createRootDelegation(), в которой смарт-контракт Revoke.delegate указывается в качестве делегата.
Необходимые права определяются с помощью функции addCaveats(), задающей метод approve(), например: .addCaveat("allowedMethods", ["approve(address,uint256)"]).build().
Пользователь подписывает новое делегирование, которое затем надёжно сохраняется в Delegation Storage под управлением DKT.
В случае эксплойта Revoke.delegate извлекает все сохранённые делегирования, проверяет условия и отзывает разрешения на токены для затронутых кошельков, вызывая функции approve() или setApprovalForAll() для обнуления лимитов — всё это без каких-либо действий со стороны пользователя.
Изучите документацию, чтобы узнать больше о том, как Delegation Toolkit упрощает эти процессы.
«Delegation Toolkit помог нам обеспечить пользователям возможность делегировать права кошелька, не утрачивая права собственности» — Аюш и Аашиш, создатели Revoke.delegate и победители хакатона EthGlobal '24
Используя DTK, команда Revoke.delegate успешно автоматизировала отзыв разрешений на токены — даже в случаях, когда пользователи были офлайн или не знали о продолжающемся эксплойте. Кроме того, поскольку toolkit нативно поддерживает ERC-7579, команда разработала решение, совместимое с ведущими кошельками экосистемы, включая Safe, Kernel и Biconomy Nexus.