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

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

Введение

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

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

Отличия от ERC-20

ERC-223 устраняет некоторые ограничения ERC-20 и представляет новый метод взаимодействия между контрактом токена и контрактом, который может получать токены. Есть несколько вещей, которые возможны с ERC-223, но не с ERC-20:

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

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

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

ERC-223 — это стандарт токенов, который реализует API для токенов внутри смарт-контрактов. Он также объявляет API для контрактов, которые должны получать токены ERC-223. Контракты, не поддерживающие API получателя ERC-223, не могут получать токены ERC-223, что предотвращает ошибки пользователей.

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

Контракт не обязан иметь только эти функции, и разработчик может добавить в этот контракт любую другую функцию из различных стандартов токенов. Например, функции approve и transferFrom не являются частью стандарта ERC-223, но эти функции могут быть реализованы в случае необходимости.

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

Методы

Токен ERC-223 должен реализовывать следующие методы:

function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transfer(address _to, uint256 _value, bytes calldata _data) public returns (bool success)

Контракт, который должен получать токены ERC-223, должен реализовывать следующий метод:

function tokenReceived(address _from, uint _value, bytes calldata _data)

Если токены ERC-223 отправляются на контракт, который не реализует функцию tokenReceived(..), то перевод должен завершиться ошибкой, а токены не должны списываться с баланса отправителя.

События

event Transfer(address indexed _from, address indexed _to, uint256 _value, bytes calldata _data)

Примеры

API токена ERC-223 аналогичен API ERC-20, поэтому с точки зрения разработки пользовательского интерфейса разницы нет. Единственным исключением здесь является то, что токены ERC-223 могут не иметь функций approve + transferFrom, поскольку они являются необязательными для этого стандарта.

Примеры на Solidity

Следующий пример иллюстрирует, как работает базовый контракт токена ERC-223:

Теперь мы хотим, чтобы другой контракт принимал депозиты tokenA, предполагая, что tokenA является токеном ERC-223. Контракт должен принимать только tokenA и отклонять любые другие токены. Когда контракт получает tokenA, он должен генерировать событие Deposit() и увеличивать значение внутренней переменной deposits.

Вот код:

Часто задаваемые вопросы

Что произойдет, если мы отправим какой-то tokenB на контракт?

Транзакция завершится ошибкой, и перевод токенов не произойдет. Токены будут возвращены на адрес отправителя.

Как мы можем внести депозит на этот контракт?

Вызовите функцию transfer(address,uint256) или transfer(address,uint256,bytes) токена ERC-223, указав адрес RecipientContract.

Что произойдет, если мы переведем токен ERC-20 на этот контракт?

Если токен ERC-20 отправлен на RecipientContract, токены будут переведены, но перевод не будет распознан (событие Deposit() не будет сгенерировано, а значение депозитов не изменится). Нежелательные депозиты ERC-20 не могут быть отфильтрованы или предотвращены.

Что, если мы хотим выполнить какую-то функцию после завершения депозита токена?

Существует несколько способов сделать это. В этом примере мы будем следовать методу, который делает переводы ERC-223 идентичными переводам эфира:

Когда RecipientContract получит токен ERC-223, контракт выполнит функцию, закодированную как параметр _data транзакции токена, идентично тому, как транзакции эфира кодируют вызовы функций в виде data транзакции. Прочтите о поле данных для получения дополнительной информации.

В приведенном выше примере токен ERC-223 должен быть переведен на адрес RecipientContract с помощью функции transfer(address,uin256,bytes calldata _data). Если параметр данных будет 0xc2985578 (подпись функции foo()), то функция foo() будет вызвана после получения депозита токена, и будет сгенерировано событие Foo().

Параметры также могут быть закодированы в data перевода токена, например, мы можем вызвать функцию bar() со значением 12345 для _someNumber. В этом случае data должно быть 0x0423a13200000000000000000000000000000000000000000000000000000000000004d2, где 0x0423a132 — это подпись функции bar(uint256), а 00000000000000000000000000000000000000000000000000000000000004d2 — это 12345 в формате uint256.

Ограничения

Хотя ERC-223 решает несколько проблем, обнаруженных в стандарте ERC-20, он не лишен собственных ограничений:

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

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