ERC-1155 — мульти-токены в Ethereum (multi-token standard)

ERC-1155 — это стандарт «мульти-токенов» в экосистеме Ethereum и других EVM-сетях.

В отличие от ERC-20 и ERC-721, где один контракт описывает один тип токена, ERC-1155 позволяет:

  • держать десятки и сотни типов токенов внутри одного смарт-контракта;
  • сочетать взаимозаменяемые и невзаимозаменяемые токены;
  • делать массовые переводы нескольких токенов в одной транзакции, экономя gas.

Именно поэтому стандарт ERC-1155 стал де-факто основой для игровых активов, коллекций предметов и сложных NFT-экосистем.

Подробнее о семействах стандартов см. ERC-стандарты в Ethereum.

ERC-1155 — мульти-токены: один контракт, много типов активов

Ключевая идея ERC-1155

В ERC-1155 токен определяется парой:

  • адрес контракта;
  • идентификатор токена id.

Один контракт:

  • хранит общую логику для всех токенов;
  • ведёт балансы по схеме balances[id][owner];
  • может смешивать:
    • взаимозаменяемые «фишки» (как ERC-20);
    • уникальные NFT-предметы (как ERC-721);
    • гибриды (ограниченная серия предметов).

Это сильно снижает накладные расходы:

  • не нужно разворачивать отдельный контракт под каждый тип токена;
  • массовые операции с несколькими токенами проходят через один вызов.

Чем ERC-1155 отличается от ERC-20 и ERC-721

Стандарт Тип токенов Особенности и сценарии
ERC-20 Взаимозаменяемые Один контракт = один тип токена. Простой учёт балансов, DeFi, стейблкоины.
ERC-721 Невзаимозаменяемые (NFT) Один контракт = коллекция уникальных tokenId. Метаданные и уникальные объекты.
ERC-1155 Мульти-токены (fungible + NFT) Один контракт = множество типов токенов. Массовые переводы, оптимизация gas, игровые предметы.

Ключевые отличия ERC-1155:

  • один контракт может вести целый каталог активов;
  • интерфейс ориентирован на работу с массивами:
    • balanceOfBatch, safeBatchTransferFrom;
  • стандарт изначально проектировался с учётом экономии gas и массовых операций.

Обязательные функции ERC-1155

Базовый интерфейс стандарта (упрощённо):

  • balanceOf(address account, uint256 id)

Возвращает баланс токена с идентификатором id у адреса account.

  • balanceOfBatch(address[] accounts, uint256[] ids)

Пакетная версия для запросов нескольких балансов за один вызов.

  • setApprovalForAll(address operator, bool approved)

Даёт/отзывает глобальное разрешение оператору управлять всеми токенами владельца в этом контракте.

  • isApprovedForAll(address account, address operator)

Проверяет, является ли operator глобальным оператором для account.

  • safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data)

Переводит *один* тип токена id в количестве amount от from к to.

Если to — контракт, он должен уметь принимать ERC-1155-токены, иначе транзакция откатится.

  • safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data)

Пакетный перевод нескольких типов токенов за один вызов:

  • уменьшает комиссию за gas;
  • особенно полезен для игр и маркетплейсов.

Для идентификации интерфейса используется EIP-165 (контракт сообщает, какие интерфейсы он поддерживает).

События ERC-1155

Вместо событий Transfer/Approval из ERC-20 и ERC-721 используются:

  • TransferSingle(operator, from, to, id, value)

Логирует перевод одного типа токена id в количестве value.

  • TransferBatch(operator, from, to, ids, values)

Логирует массовый перевод нескольких ids и values.

  • ApprovalForAll(account, operator, approved)

Аналогично ERC-721: массовое разрешение/отзыв прав оператора.

  • URI(value, id)

Событие для установки или обновления URI метаданных для определённого id.

Благодаря этим событиям блок-обозреватели и маркетплейсы могут корректно отображать историю операций по всем токенам внутри одного контракта.

Метаданные и идентификаторы токенов

Для каждого id контракт может задавать свои метаданные:

  • URI может включать шаблон, например:

https://example.com/metadata/{id}.json или ipfs://...;

  • поле {id} подставляется в шестнадцатеричном формате по стандартным правилам.

За счёт этого:

  • один контракт может описывать целую коллекцию предметов;
  • часть из них ведёт себя как NFT (1 экземпляр или несколько уникальных);
  • часть — как взаимозаменяемые «фишки» (например, внутриигровое золото или ресурсы).

Отображение в кошельках и на маркетплейсах зависит от того, как они интерпретируют id и связанные с ним метаданные.

Почему ERC-1155 популярен в играх и NFT-инфраструктуре

У стандарта есть несколько практических преимуществ:

  • Экономия газа.

Массовые переводы и операции с несколькими токенами внутри контракта обходятся дешевле, чем взаимодействие с десятками отдельных контрактов ERC-20/ERC-721.

  • Удобство для разработчиков игр.

В играх есть:

  • валюты (fungible);
  • предметы (NFT);
  • расходники и ресурсы (fungible, но в разных видах).

Всё это удобно представить как «мульти-токены» одного контракта.

  • Гибкость логики.

Легко создавать новые id с разной логикой дропа, крафта, сжигания и апгрейда, не деплоив новые контракты.

  • Масштабируемость интерфейсов.

Биржи, маркетплейсы и dApp могут взаимодействовать с одной коллекцией через единый контракт, вместо множества адресов.

Типичные риски и особенности ERC-1155

  • Сложность для новичков.

В отличие от «однозначного» ERC-20 или ERC-721, здесь нужно учитывать:

  • id и amount одновременно;
  • batch-операции;
  • шаблонные URI.

Это усложняет ручной аудит и интеракцию с контрактом через низкоуровневые интерфейсы.

  • Единый контракт — единая точка риска.

Ошибка в логике одного ERC-1155-контракта может затронуть все токены в нём.

Поэтому особенно важно использовать проверенные реализации библиотек.

  • UX-зависимость от кошельков.

Не все кошельки одинаково удобно показывают ERC-1155:

  • иногда NFT и предметы скрыты во вкладке «коллекции»;
  • не всегда есть удобный просмотр всех id и их свойств.
  • Разделение fungible / NFT на уровне интерфейса, а не стандарта.

Стандарт не «знает», является ли конкретный id NFT или взаимозаменяемым токеном — это логика уровня приложения.

Когда выбирать ERC-1155 вместо ERC-20/721

ERC-1155 оправдан, если:

  • у проекта много типов активов, особенно в играх и коллекционных системах;
  • важны массовые операции: аирдропы, раздачи наград, массовые трейды;
  • хочется комбинировать:
    • игровые валюты;
    • предметы;
    • ограниченные серии;
  • важно сократить расходы на gas и упростить управление контрактами.

Если нужен один простой токен (стейблкоин, governance-токен) — достаточно классического ERC-20. Если выпускается узкая коллекция уникальных NFT без сложной структуры — подойдёт ERC-721.

Частые вопросы (FAQ) про ERC-1155

ERC-1155 — это NFT или нет? И да, и нет. ERC-1155 — каркас для мульти-токенов. Отдельные id могут вести себя как NFT (1 экземпляр) или как взаимозаменяемые токены (много одинаковых единиц). Всё зависит от логики контракта.

Можно ли в одном ERC-1155 контракте сделать и валюту, и предметы? Да, это типичный кейс:

  • одна группа id — игровые валюты;
  • другая — редкие предметы;
  • третья — билеты/доступы и т.п.

Чем отличается safeBatchTransferFrom от нескольких safeTransferFrom? Пакетный метод:

  • отправляет несколько токенов разных типов в одной транзакции;
  • уменьшает суммарные комиссии за gas;
  • логируется в одном событии TransferBatch, что упрощает анализ.

Поддерживают ли все кошельки ERC-1155? Современные кошельки и маркетплейсы — да, но качество поддержки разное. В старых или минималистичных интерфейсах ERC-1155-активы могут отображаться ограниченно.

См. также

Task Runner