Открыть сервис

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-20ERC-777
Обработка транзакцийНе уведомляет получателяВызывает хук tokensReceived на получателе
Риск потери токеновВысокий (отправка на контракт без поддержки)Низкий (отправка блокируется, если контракт не реализует хук)
Управление правамиТолько через approve/transferFromОператоры и хуки
СложностьНизкаяСредняя/Высокая
Обратная совместимостьБазаСовместим с ERC-20
БезопасностьСтандартнаяТребует осторожности из-за риска reentrancy

Источники

  1. Ethereum Improvement Proposal 777 (EIP-777): Token Standard.
  2. Документация OpenZeppelin по реализации ERC-777.
  3. Статья «ERC-777: The New Token Standard That Could Replace ERC-20» (CoinDesk).
  4. Анализ уязвимости imBTC и атаки повторного входа на ERC-777.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →