ERC-777
ERC-777 — это стандарт смарт-контрактов в блокчейне Ethereum, определяющий правила создания и использования взаимозаменяемых (fungible) токенов. Он был разработан как расширенная и более функциональная альтернатива более раннему стандарту ERC-20, с целью устранения его недостатков, в частности, неэффективной обработки транзакций и возможности безвозвратной потери токенов при отправке на контракты, не предназначенные для их приёма.
История
Стандарт ERC-777 был предложен в 2017 году разработчиками Жаком Даффу (Jacques Dafflon) и Хорди Байлиной (Jordi Baylina) как Ethereum Improvement Proposal (EIP-777). Основной мотивацией для создания нового стандарта стало стремление решить проблему «зависания» токенов, отправленных на адреса смарт-контрактов, которые не реализуют механизм обработки входящих токенов (например, стандарт ERC-20 не предусматривает обязательного уведомления контракта-получателя). После обсуждения и доработки в сообществе разработчиков, EIP-777 был принят и включён в реестр стандартов Ethereum. Несмотря на свои преимущества, ERC-777 не получил столь же широкого распространения, как ERC-20, отчасти из-за сложности реализации и выявленных уязвимостей в некоторых реализациях.
Ключевые особенности
ERC-777 вводит несколько новшеств по сравнению с ERC-20, которые направлены на повышение удобства и безопасности использования токенов.
Функция хуков (hooks)
Главное отличие ERC-777 — это наличие механизма «хуков» (hooks). Хуки — это функции, которые вызываются на контракте-получателе до или после отправки токенов. Это позволяет контракту-получателю автоматически реагировать на получение токенов, например, обновлять внутренний баланс, запускать логику обмена или отклонять нежелательные транзакции. Для реализации этой возможности контракт-получатель должен реализовать интерфейс ERC777TokensRecipient. Если контракт не реализует этот интерфейс, отправка токенов на него будет заблокирована, что предотвращает случайную потерю токенов.
Операторы (operators)
Стандарт вводит понятие «операторов» — это адреса (обычно смарт-контракты или другие пользователи), которым владелец токенов может делегировать право управления своими токенами. Оператор может отправлять токены от имени владельца, что полезно для реализации децентрализованных бирж, автоматических маркетмейкеров (AMM) и других сценариев, где требуется автоматическое управление токенами без необходимости подписывать каждую транзакцию отдельно. Владелец может в любой момент назначить или отозвать оператора.
Обратная совместимость с ERC-20
ERC-777 спроектирован так, чтобы быть обратно совместимым с ERC-20. Это означает, что любой токен, созданный по стандарту ERC-777, может быть использован в интерфейсах и приложениях, которые поддерживают только ERC-20. Для этого в стандарте определены обязательные функции, дублирующие функции ERC-20 (например, balanceOf, totalSupply, transfer, approve, transferFrom). Однако, при использовании этих функций теряются преимущества ERC-777, такие как хуки и операторы.
Устройство и интерфейс
Стандарт ERC-777 определяет набор обязательных и опциональных функций и событий, которые должен реализовать смарт-контракт токена.
Основные функции
name()— возвращает название токена (опционально).symbol()— возвращает символ токена (опционально).totalSupply()— возвращает общее количество выпущенных токенов.balanceOf(address owner)— возвращает баланс указанного адреса.send(address recipient, uint256 amount, bytes data)— основная функция для отправки токенов. В отличие отtransferв ERC-20, она принимает дополнительный параметрdata, который может содержать произвольную информацию, передаваемую получателю. Эта функция вызывает хукtokensReceivedна контракте-получателе.operatorSend(address sender, address recipient, uint256 amount, bytes data, bytes operatorData)— функция, вызываемая оператором для отправки токенов от имени другого пользователя.burn(uint256 amount, bytes data)— функция для уничтожения (сжигания) токенов.authorizeOperator(address operator)— назначает указанный адрес оператором для всех токенов отправителя.revokeOperator(address operator)— отзывает права оператора у указанного адреса.defaultOperators()— возвращает список операторов по умолчанию, которые получают права на управление токенами при их создании (опционально).
События
Sent(address indexed operator, address indexed from, address indexed to, uint256 amount, bytes data, bytes operatorData)— генерируется при отправке токенов.Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData)— генерируется при выпуске новых токенов.Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData)— генерируется при уничтожении токенов.AuthorizedOperator(address indexed operator, address indexed tokenHolder)— генерируется при назначении оператора.RevokedOperator(address indexed operator, address indexed tokenHolder)— генерируется при отзыве оператора.
Применение
ERC-777 используется для создания токенов, где требуется более сложная логика взаимодействия, чем в ERC-20. Основные области применения:
- Децентрализованные финансы (DeFi): Токены ERC-777 могут использоваться в протоколах DeFi, где автоматическое уведомление контрактов о получении токенов упрощает интеграцию и снижает риск ошибок. Например, при внесении ликвидности в пул, контракт пула может автоматически обновить баланс пользователя.
- Управление активами: Возможность назначать операторов позволяет создавать сложные схемы управления активами, например, доверительное управление или автоматическое исполнение ордеров.
- Игровые и NFT-платформы: В играх и платформах, где токены используются как внутриигровая валюта, хуки могут автоматически запускать игровые события при получении токенов.
- Корпоративные решения: Для выпуска внутренних токенов, где требуется строгий контроль над перемещением средств и возможность автоматической обработки транзакций.
Критика и уязвимости
Несмотря на преимущества, ERC-777 подвергался критике и был связан с некоторыми проблемами безопасности.
- Уязвимость при повторном входе (reentrancy): В 2020 году была обнаружена уязвимость в некоторых реализациях ERC-777, связанная с возможностью атаки повторного входа. При отправке токенов на контракт, который реализует хук
tokensReceived, этот хук может вызывать другие функции, которые, в свою очередь, могут снова вызвать функцию отправки токенов, что приводит к неконсистентному состоянию. Эта уязвимость была использована в атаке на протокол imBTC. - Сложность реализации: Реализация полного стандарта ERC-777 требует большего объёма кода и более глубокого понимания механизмов хуков и операторов, что увеличивает риск ошибок при разработке.
- Несовместимость с некоторыми старыми контрактами: Некоторые старые контракты, не поддерживающие хуки, не могут принимать токены ERC-777, что ограничивает их совместимость.
Сравнение с ERC-20
| Характеристика | ERC-20 | ERC-777 |
|---|---|---|
| Обработка транзакций | Не уведомляет получателя | Вызывает хук tokensReceived на получателе |
| Риск потери токенов | Высокий (отправка на контракт без поддержки) | Низкий (отправка блокируется, если контракт не реализует хук) |
| Управление правами | Только через approve/transferFrom | Операторы и хуки |
| Сложность | Низкая | Средняя/Высокая |
| Обратная совместимость | База | Совместим с ERC-20 |
| Безопасность | Стандартная | Требует осторожности из-за риска reentrancy |
Источники
- Ethereum Improvement Proposal 777 (EIP-777): Token Standard.
- Документация OpenZeppelin по реализации ERC-777.
- Статья «ERC-777: The New Token Standard That Could Replace ERC-20» (CoinDesk).
- Анализ уязвимости imBTC и атаки повторного входа на ERC-777.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →