Перейти к основному содержанию
Change page

Стандарт мульти-токенов 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:

Пакетные передачи

Перевод партией работает почти так же, как и обычные 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 токенов с ID 3 от _from к _to.
  2. Передача 200 токенов с ID 6 от _from к _to.
  3. Передача 5 токенов с ID 13 от _from к _to.

В ERC-1155 есть только transferFrom, но нет transfer. Чтобы использовать ее как обычную функцию transfer, просто укажите в качестве адреса отправителя адрес, вызывающий функцию.

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

Соответствующий вызов 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-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).

Правило безопасной передачи

Мы уже коснулись нескольких правил безопасного перевода в предыдущих объяснениях. Но давайте взглянем на самые важные из правил:

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

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

Дополнительные материалы

Была ли эта статья полезной?