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

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

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

Вступ

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

Що означає Стандарт Мультитокенів?

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

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

Передумови

Щоб краще зрозуміти цю сторінку, ми рекомендуємо вам спочатку прочитати про стандарти токенів, ERC-20 та ERC-721.

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

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

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

1// ERC-20
2function transferFrom(address from, address to, uint256 value) external returns (bool);
3
4// ERC-1155
5function safeBatchTransferFrom(
6 address _from,
7 address _to,
8 uint256[] calldata _ids,
9 uint256[] calldata _values,
10 bytes calldata _data
11) external;
Показати все

Єдина відмінність у 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) як адресу, що викликає функцію.

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

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

1// ERC-20
2function balanceOf(address owner) external view returns (uint256);
3
4// ERC-1155
5function balanceOfBatch(
6 address[] calldata _owners,
7 uint256[] calldata _ids
8) external view returns (uint256[] memory);

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

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

1[
2 balanceOf(0xbeef...),
3 balanceOf(0x1337...),
4 balanceOf(0x1111...)
5]

Пакетне затвердження

1// ERC-1155
2function setApprovalForAll(
3 address _operator,
4 bool _approved
5) external;
6
7function isApprovedForAll(
8 address _owner,
9 address _operator
10) external view returns (bool);
Показати все

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

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

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

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

1function onERC1155BatchReceived(
2 address _operator,
3 address _from,
4 uint256[] calldata _ids,
5 uint256[] calldata _values,
6 bytes calldata _data
7) external returns(bytes4);

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

1bytes4(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. виникає будь-яка інша помилка.

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

Для подальшого читання

Чи була ця стаття корисною?