Перейти к основному контенту
Change page

Стандарт токенов ERC-20

Введение

Что такое токен?

Токены могут представлять практически что угодно в Эфириуме:

  • очки репутации на онлайн-платформе
  • навыки персонажа в игре
  • финансовые активы, такие как доля в компании
  • фиатную валюту, такую как USD
  • унцию золота
  • и многое другое...

Такая мощная функция Эфириума должна управляться надежным стандартом, верно? Именно здесь ERC-20 играет свою роль! Этот стандарт позволяет разработчикам создавать приложения для токенов, которые интероперабельны с другими продуктами и сервисами. Стандарт ERC-20 также используется для предоставления дополнительных функций .

Что такое ERC-20?

ERC-20 вводит стандарт для взаимозаменяемых токенов. Иными словами, они обладают свойством, которое делает каждый токен абсолютно идентичным (по типу и стоимости) другому токену. Например, токен ERC-20 действует так же, как ETH, что означает, что 1 токен есть и всегда будет равен всем остальным токенам.

Предварительные требования

Основная часть

ERC-20 (Ethereum Request for Comments 20), предложенный Фабианом Фогельштеллером (Fabian Vogelsteller) в ноябре 2015 года, — это стандарт токенов, который реализует API для токенов внутри смарт-контрактов.

Примеры функций, которые предоставляет ERC-20:

  • перевод токенов с одного аккаунта на другой
  • получение текущего баланса токенов аккаунта
  • получение общего предложения токена, доступного в сети
  • одобрение того, может ли определенное количество токенов с аккаунта быть потрачено сторонним аккаунтом

Если смарт-контракт реализует следующие методы и события, его можно назвать контрактом токена ERC-20, и после развертывания он будет отвечать за отслеживание созданных токенов в Эфириуме.

Из EIP-20 (opens in a new tab):

Методы

События

event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

Примеры

Давайте посмотрим, насколько важен стандарт для упрощения проверки любого контракта токена ERC-20 в Эфириуме. Нам просто нужен двоичный интерфейс приложения (ABI) контракта, чтобы создать интерфейс для любого токена ERC-20. Как вы можете видеть ниже, мы будем использовать упрощенный ABI, чтобы сделать этот пример максимально понятным.

Пример с Web3.py

Сначала убедитесь, что вы установили библиотеку Python Web3.py (opens in a new tab):

pip install web3

Известные проблемы

Проблема получения токенов ERC-20

По состоянию на 20.06.2024 из-за этой проблемы было потеряно токенов ERC-20 на сумму не менее 83 656 418 долларов США. Обратите внимание, что чистая реализация ERC-20 подвержена этой проблеме, если вы не внедрите набор дополнительных ограничений поверх стандарта, как указано ниже.

Когда токены ERC-20 отправляются на смарт-контракт, который не предназначен для обработки токенов ERC-20, эти токены могут быть безвозвратно утеряны. Это происходит потому, что получающий контракт не имеет функциональности для распознавания или реагирования на входящие токены, а в стандарте ERC-20 нет механизма для уведомления получающего контракта о входящих токенах. Основные формы проявления этой проблемы:

  1. Механизм перевода токенов
  • Токены ERC-20 переводятся с использованием функций transfer или transferFrom
    • Когда пользователь отправляет токены на адрес контракта с помощью этих функций, токены переводятся независимо от того, предназначен ли получающий контракт для их обработки
  1. Отсутствие уведомления
    • Получающий контракт не получает уведомления или обратного вызова о том, что ему были отправлены токены
    • Если у получающего контракта нет механизма для обработки токенов (например, резервной функции или специальной функции для управления получением токенов), токены фактически застревают на адресе контракта
  2. Отсутствие встроенной обработки
    • Стандарт ERC-20 не включает обязательную функцию для реализации получающими контрактами, что приводит к ситуации, когда многие контракты не могут должным образом управлять входящими токенами

Возможные решения

Хотя полностью предотвратить эту проблему с ERC-20 невозможно, существуют методы, которые позволили бы значительно снизить вероятность потери токенов для конечного пользователя:

  • Самая распространенная проблема возникает, когда пользователь отправляет токены на адрес самого контракта токена (например, USDT вносится на адрес контракта токена USDT). Рекомендуется ограничить функцию transfer(..), чтобы вызывать откат таких попыток перевода. Рассмотрите возможность добавления проверки require(_to != address(this)); в реализацию функции transfer(..).
  • Функция transfer(..) в целом не предназначена для внесения токенов на контракты. Вместо этого для внесения токенов ERC-20 на контракты используется паттерн approve(..) & transferFrom(..). Можно ограничить функцию перевода, чтобы запретить внесение токенов на любые контракты с ее помощью, однако это может нарушить совместимость с контрактами, которые предполагают, что токены могут быть внесены на контракты с помощью функции transfer(..) (например, пулы ликвидности Юнисвоп).
  • Всегда исходите из того, что токены ERC-20 могут оказаться в вашем контракте, даже если ваш контракт вообще не должен их получать. Не существует способа предотвратить или отклонить случайные депозиты на стороне получателя. Рекомендуется реализовать функцию, которая позволила бы извлекать случайно внесенные токены ERC-20.
  • Рассмотрите возможность использования альтернативных стандартов токенов.

Из-за этой проблемы появились некоторые альтернативные стандарты, такие как ERC-223 или ERC-1363.

Дополнительная литература

Другие стандарты взаимозаменяемых токенов

Руководства: Создание с использованием ERC-20 в Эфириуме