Стандарт мультитокенів 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:
- Пакетний переказ: переказ кількох активів за один виклик.
- Пакетний баланс: отримання балансів кількох активів за один виклик.
- Пакетне схвалення: схвалення всіх токенів для адреси.
- Хуки: хук отримання токенів.
- Підтримка NFT: якщо пропозиція дорівнює лише 1, він розглядається як NFT.
- Правила безпечного переказу: набір правил для безпечного переказу.
Пакетні перекази
Пакетний переказ працює дуже подібно до звичайних переказів ERC-20. Давайте поглянемо на звичайну функцію ERC-20 transferFrom:
// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);
// ERC-1155
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external;
Єдина відмінність в ERC-1155 полягає в тому, що ми передаємо значення як масив, а також передаємо масив ідентифікаторів. Наприклад, якщо задано ids=[3, 6, 13] та values=[100, 200, 5], отримані перекази будуть такими:
- Переказ 100 токенів з ідентифікатором 3 від
_fromдо_to. - Переказ 200 токенів з ідентифікатором 6 від
_fromдо_to. - Переказ 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-1155
function setApprovalForAll(
address _operator,
bool _approved
) external;
function isApprovedForAll(
address _owner,
address _operator
) external view returns (bool);
Схвалення дещо відрізняються від 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).
Правило безпечного переказу
Ми вже торкалися кількох правил безпечного переказу в попередніх поясненнях. Але давайте розглянемо найважливіші з них:
- Абонент, що викликає, повинен бути схвалений для витрачання токенів для адреси
_from, або абонент, що викликає, повинен дорівнювати_from. - Виклик переказу має бути скасовано, якщо:
- Адреса
_toдорівнює 0. - Довжина
_idsне збігається з довжиною_values. - Будь-який з балансів власників для токенів у
_idsє нижчим за відповідні суми в_values, надіслані одержувачу. - Виникає будь-яка інша помилка.
- Адреса
Примітка: усі пакетні функції, включно з хуком, також існують у версіях без пакетної обробки. Це зроблено для ефективності використання газу, враховуючи, що переказ лише одного активу, ймовірно, все ще буде найпоширенішим способом. Ми опустили їх для простоти в поясненнях, включно з правилами безпечного переказу. Назви ідентичні, просто видаліть «Batch».