Перейти до основного вмісту
Change page

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

Редагувати сторінку (opens in a new tab)

Вступ

Що таке 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, тому з точки зору розробки інтерфейсу користувача (UI) немає жодної різниці. Єдиним винятком є те, що токени 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.

Додаткові матеріали

Останнє оновлення сторінки: 6 вересня 2025 р.