Стандарт мульти-токенов ERC-1155
Последнее обновление страницы: 22 октября 2025 г.
Введение
Стандартный интерфейс для контрактов, которые управляют несколькими типами токенов. Один развернутый контракт может включать любую комбинацию взаимозаменяемых токенов, невзаимозаменяемых токенов или других конфигураций (например, полувзаимозаменяемых токенов).
Что значит стандарт мульти-токена?
Идея проста и предназначена для создания интерфейса смарт-контракта, который может представлять и контролировать любое количество токенов взаимозаменяемых и невзаимозаменяемых типов. Таким образом, токен 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 переводы. Давайте рассмотрим обычную функцию transferFrom стандарта ERC-20:
1// ERC-202function transferFrom(address from, address to, uint256 value) external returns (bool);34// ERC-11555function safeBatchTransferFrom(6 address _from,7 address _to,8 uint256[] calldata _ids,9 uint256[] calldata _values,10 bytes calldata _data11) external;Показать всеЕдинственное различие в ERC-1155 заключается в том, что мы передаем значения в виде массива и также передаем массив идентификаторов. Например, если ids=[3, 6, 13] и values=[100, 200, 5], то в результате будут выполнены следующие передачи:
- Передача 100 токенов с ID 3 от
_fromк_to. - Передача 200 токенов с ID 6 от
_fromк_to. - Передача 5 токенов с ID 13 от
_fromк_to.
В ERC-1155 есть только transferFrom, но нет transfer. Чтобы использовать ее как обычную функцию transfer, просто укажите в качестве адреса отправителя адрес, вызывающий функцию.
Пакетный баланс
Соответствующий вызов balanceOf в ERC-20 также имеет парную функцию с поддержкой пакетной обработки. В качестве напоминания версия ERC-20:
1// ERC-202function balanceOf(address owner) external view returns (uint256);34// ERC-11555function balanceOfBatch(6 address[] calldata _owners,7 uint256[] calldata _ids8) 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-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) 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 _data7) external returns(bytes4);Благодаря поддержке EIP-165 (opens 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).
Правило безопасной передачи
Мы уже коснулись нескольких правил безопасного перевода в предыдущих объяснениях. Но давайте взглянем на самые важные из правил:
- Вызывающий должен иметь разрешение на расходование токенов с адреса
_fromили вызывающий должен быть равен_from. - Вызов передачи должен быть отменен, если:
- адрес
_toравен 0. - длина
_idsне совпадает с длиной_values. - любой из балансов держателя(-ей) токена(-ов) из
_idsменьше соответствующего количества из_values, отправляемого получателю. - происходит любая другая ошибка.
- адрес
Примечание: все пакетные функции, включая хук, также существуют в версиях без пакетной обработки. Это сделано для эффективности расходования газа, поскольку передача одного актива, скорее всего, останется наиболее распространенным способом. Мы опустили их для простоты объяснения, включая правила безопасной передачи. Названия идентичны, просто уберите слово «Batch».