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

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

Последнее обновление страницы: 6 сентября 2025 г.

Введение

Что такое 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. После развертывания он будет отвечать за отслеживание созданных токенов в Ethereum.

Контракт не обязан иметь только эти функции, и разработчик может добавить в него любую другую функцию из разных стандартов токенов. Например, функции 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.

Дополнительные материалы

Была ли эта статья полезной?