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

Стандарт мультитокенів ERC-1155

Вступ

Стандартний інтерфейс для контрактів, які керують кількома типами токенів. Один розгорнутий контракт може містити будь-яку комбінацію взаємозамінних токенів, невзаємозамінних токенів або інших конфігурацій (наприклад, напіввзаємозамінних токенів).

Що мається на увазі під стандартом мультитокенів?

Ідея проста і полягає у створенні інтерфейсу смарт-контракту, який може представляти та контролювати будь-яку кількість типів взаємозамінних і невзаємозамінних токенів. Таким чином, токен ERC-1155 може виконувати ті ж функції, що й токени ERC-20 та ERC-721, і навіть обидві одночасно. Він покращує функціональність стандартів ERC-20 та ERC-721, роблячи його ефективнішим і виправляючи очевидні помилки реалізації.

Токен ERC-1155 повністю описаний у EIP-1155 (opens in a new tab).

Передумови

Для кращого розуміння цієї сторінки ми рекомендуємо спочатку прочитати про стандарти токенів, ERC-20 та ERC-721.

Функції та особливості ERC-1155:

Пакетні перекази

Пакетний переказ працює дуже подібно до звичайних переказів ERC-20. Давайте поглянемо на звичайну функцію ERC-20 transferFrom:

Єдина відмінність в ERC-1155 полягає в тому, що ми передаємо значення як масив, а також передаємо масив ідентифікаторів. Наприклад, якщо задано ids=[3, 6, 13] та values=[100, 200, 5], отримані перекази будуть такими:

  1. Переказ 100 токенів з ідентифікатором 3 від _from до _to.
  2. Переказ 200 токенів з ідентифікатором 6 від _from до _to.
  3. Переказ 5 токенів з ідентифікатором 13 від _from до _to.

В ERC-1155 ми маємо лише transferFrom, без transfer. Щоб використовувати його як звичайний transfer, просто встановіть адресу відправника (from) на адресу, яка викликає функцію.

Пакетний баланс

Відповідний виклик ERC-20 balanceOf також має свою партнерську функцію з підтримкою пакетної обробки. Нагадаємо, це версія ERC-20:

// ERC-20
function balanceOf(address owner) external view returns (uint256);

// ERC-1155
function balanceOfBatch(
    address[] calldata _owners,
    uint256[] calldata _ids
) external view returns (uint256[] memory);

Ще простіше для виклику балансу: ми можемо отримати кілька балансів за один виклик. Ми передаємо масив власників, за яким слідує масив ідентифікаторів токенів.

Наприклад, якщо задано _ids=[3, 6, 13] та _owners=[0xbeef..., 0x1337..., 0x1111...], значення, що повертається, буде таким:

[
    balanceOf(0xbeef...),
    balanceOf(0x1337...),
    balanceOf(0x1111...)
]

Пакетне схвалення

Схвалення дещо відрізняються від ERC-20. Замість того, щоб схвалювати конкретні суми, ви встановлюєте оператора як схваленого або не схваленого за допомогою setApprovalForAll.

Прочитати поточний статус можна за допомогою isApprovedForAll. Як бачите, це операція «все або нічого». Ви не можете визначити, скільки токенів схвалювати або навіть який клас токенів.

Це навмисно розроблено з урахуванням простоти. Ви можете схвалити лише все для однієї адреси.

Хук отримання

function onERC1155BatchReceived(
    address _operator,
    address _from,
    uint256[] calldata _ids,
    uint256[] calldata _values,
    bytes calldata _data
) external returns(bytes4);

Враховуючи підтримку EIP-165 (opens in a new tab), ERC-1155 підтримує хуки отримання лише для смарт-контрактів. Функція хука повинна повертати магічне попередньо визначене значення bytes4, яке задається як:

bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))

Коли контракт-отримувач повертає це значення, передбачається, що контракт приймає переказ і знає, як обробляти токени ERC-1155. Чудово, більше ніяких застряглих токенів у контракті!

Підтримка NFT

Коли пропозиція дорівнює лише одиниці, токен по суті є невзаємозамінним токеном (NFT). І, як це стандартно для ERC-721, ви можете визначити URL-адресу метаданих. URL-адресу можуть читати та змінювати клієнти, див. тут (opens in a new tab).

Правило безпечного переказу

Ми вже торкалися кількох правил безпечного переказу в попередніх поясненнях. Але давайте розглянемо найважливіші з них:

  1. Абонент, що викликає, повинен бути схвалений для витрачання токенів для адреси _from, або абонент, що викликає, повинен дорівнювати _from.
  2. Виклик переказу має бути скасовано, якщо:
    1. Адреса _to дорівнює 0.
    2. Довжина _ids не збігається з довжиною _values.
    3. Будь-який з балансів власників для токенів у _ids є нижчим за відповідні суми в _values, надіслані одержувачу.
    4. Виникає будь-яка інша помилка.

Примітка: усі пакетні функції, включно з хуком, також існують у версіях без пакетної обробки. Це зроблено для ефективності використання газу, враховуючи, що переказ лише одного активу, ймовірно, все ще буде найпоширенішим способом. Ми опустили їх для простоти в поясненнях, включно з правилами безпечного переказу. Назви ідентичні, просто видаліть «Batch».

Подальше читання