Перейти к основному контенту

ERC-1155 и унификация активов: полувзаимозаменяемые токены и объединение нескольких ресурсов

Продолжим наше путешествие по стандартам активов Ethereum. Изучив ERC-20, представляющий «деньги», и ERC-721, обозначающий «коллекционные предметы», пришло время погрузиться в стандарт, который объединяет лучшее из обоих миров и разработан для эффективности: ERC-1155.


3.4 ERC-1155 и унификация активов: полувзаимозаменяемые токены и объединение нескольких ресурсов​

ERC-1155 позволяет одному контракту одновременно размещать взаимозаменяемые токены (FT), невзаимозаменяемые токены (NFT) и «полувзаимозаменяемые» активы, поддерживая пакетные операции, которые могут сократить стоимость газа для экономик с несколькими активами примерно до одной десятой от традиционных стандартов.


Зачем нам нужен ERC-1155?​

До появления ERC-1155 разработчики сталкивались со сложной проблемой. Представьте, что вы создаете ончейн-игру:

  • Вам нужна «монета», которая полностью взаимозаменяема, идеально подходящая для стандарта ERC-20.
  • Вам также нужно различное уникальное «эпическое оружие», каждое с разными атрибутами, подходящее для стандарта ERC-721.

Эта настройка требует от вашей игры развертывания и поддержки как минимум двух отдельных смарт-контрактов, что приводит к нескольким проблемам:

  • Фрагментация нескольких контрактов: Логика кода дублируется, что увеличивает сложность и стоимость разработки, тестирования и аудита.
  • Дорогие пакетные переводы: Если игрок хочет обменять 1000 монет и 5 различных видов оружия одновременно, ему необходимо инициировать несколько независимых транзакций, что приводит к высоким комиссиям за газ.
  • Сложное объединение активов: Объединение билетов, сувениров и игровых предметов в «стартовый набор» для продажи часто требует использования дополнительных централизованных баз данных или сложных ончейн-контрактов «обертывания».

ERC-1155 был разработан для решения этих проблем неэффективности и фрагментированного опыта.


Ключевая концепция: Один контракт, всеобъемлющий​

Основная концепция ERC-1155 заключается в создании мультитокенового контейнера. Он устраняет различие между контрактами токенов и контрактами NFT, используя унифицированную структуру для управления всеми типами активов.

  • Единый контракт с несколькими ресурсами: Внутри контракта больше нет только одного баланса, а есть сопоставление (ID -> Account -> Balance). Здесь ID представляет тип актива.
  • Когда ID=0, это могут быть «монеты», взаимозаменяемый токен (FT).
  • Когда ID=1, это может быть «эпический посох» с предложением в 1 единицу, фактически невзаимозаменяемый токен (NFT).
  • Полувзаимозаменяемый токен (SFT): Это мощная концепция, представленная ERC-1155. Актив может иметь разные состояния на разных этапах своего жизненного цикла. Например, «билет на мероприятие» с ID 2 изначально имеет предложение в 5000 единиц, что делает их взаимозаменяемыми (FT); как только пользователь входит на место проведения, билет может быть «сожжен» в уникальный памятный NFT с вашим номером места и временем входа (Ссылка: blog.chainsafe.io).
  • Пакетный интерфейс: Это «убойная функция» ERC-1155. Он предоставляет ряд функций для пакетных операций:
  • safeBatchTransferFrom: Позволяет переводить несколько активов с разными ID на несколько разных адресов за одну транзакцию.
  • balanceOfBatch: Позволяет запрашивать балансы нескольких активов для нескольких адресов одновременно.
  • Соответствующее событие TransferBatch также позволяет офчейн-приложениям эффективно индексировать пакетные операции.
  • Унифицированные метаданные: Функция uri(id) возвращает строку шаблона URI, например https://myapi.com/metadata/{id}. Как только фронтенд-приложение получает ее, ему нужно только заменить заполнитель {id} на конкретный ID актива, чтобы запросить соответствующий файл метаданных JSON.
  • Обязательное подтверждение получателя: Чтобы предотвратить ошибочную передачу активов контрактам, которые не могут их обрабатывать (т.е. «черным дырам»), ERC-1155 требует, чтобы любой контракт, получающий активы, реализовывал интерфейс IERC1155Receiver; в противном случае транзакция завершится неудачей. Это значительно повышает безопасность активов (Ссылка: docs.openzeppelin.com).

Скачок в эффективности использования газа​

Возможность пакетной обработки ERC-1155 обеспечивает невероятную экономию газа. Согласно тестам, при одновременной передаче 100 различных активов использование safeBatchTransferFrom может сэкономить от 70% до 90% комиссий за газ по сравнению с индивидуальным вызовом функции transfer ERC-20 или ERC-721. (Ссылка: nftnewstoday.com)

Это преимущество в эффективности особенно важно в следующих сценариях:

  • Массовые аирдропы: Команды проектов могут распространять различные токены вознаграждений тысячам адресов за один раз.
  • Выпадение игровых предметов: После победы над Боссом вы можете «выбросить» монеты, зелья и снаряжение в рюкзак игрока за одну транзакцию.
  • Сопоставление на рынке блокчейн-игр: На рынке NFT покупатели могут «сметать» несколько различных серий активов за один раз, оплачивая комиссию за газ только одной транзакции.

Основные варианты использования​

ERC-1155 стал предпочтительным стандартом для создания сложных ончейн-экономических систем.

  • Экономика блокчейн-игр: Единый контракт может управлять всеми экономическими ресурсами в игровом мире: монетами (FT), деревом (FT), обычными мечами (SFT), эпическими ограниченными скинами (NFT). Платформа блокчейн-игр Enjin была первоначальным инициатором этого стандарта, а Immutable X и другие решения Layer 2 широко приняли его в качестве основного стандарта активов (Ссылка: research.aimultiple.com).
  • Билеты и членские карты: Обычные билеты на один и тот же концерт принадлежат к одному и тому же ID актива и могут продаваться оптом; после выступления билеты могут быть преобразованы в уникальные цифровые памятные NFT-заглушки.
  • RWA и индексные фонды: Различные доли владения собственностью или различные компоненты акций в индексном фонде могут быть сопоставлены как несколько ID активов в одном контракте ERC-1155, что облегчает массовые подписки и погашения для пользователей.
  • Пакетные аирдропы / Игровые лутбоксы: Одна транзакция может распределять различные типы активов на большое количество адресов, сохраняя затраты на газ в экономически приемлемом диапазоне.

Риски и лучшие практики​

  • Постоянство URI: Если шаблон URI метаданных указывает на централизованный сервер, то при его отключении все активы могут стать «безымянными» оболочками. Лучшая практика — использовать адреса IPFS или Arweave в качестве URI для обеспечения постоянной доступности метаданных.
  • Область авторизации: Пакетная авторизация (setApprovalForAll) дает оператору большие полномочия по управлению всеми вашими активами в рамках этого контракта. Обязательно авторизуйте только те контракты, которым вы полностью доверяете, и регулярно проверяйте и отзывайте авторизации.
  • Реентрантность в функциях обратного вызова: При реализации функций обратного вызова onERC1155Received и onERC1155BatchReceived остерегайтесь атак реентрантности и избегайте вызова ненадежных внешних контрактов внутри функций.
  • Шаблоны контрактов: Настоятельно рекомендуется использовать полностью проверенные шаблоны контрактов ERC1155 от OpenZeppelin в сочетании с расширениями, такими как ERC1155Supply и AccessControl, для управления предложением и разрешениями, минимизируя риск внесения уязвимостей при самостоятельном написании кода.

Упражнения для читателя​

  1. Откройте Remix и импортируйте шаблон контракта ERC1155PresetMinterPauser от OpenZeppelin:
  • Введите базовый URI (например, https://my-api.com/) во время развертывания.
  • Вызовите функцию mint, чтобы отчеканить 1000 монет (ID=0) и 1 меч (ID=1) для себя.
  • Используйте функцию safeBatchTransferFrom для перевода 100 монет и 1 меча вашему другу за одну транзакцию. Проверьте потребление газа этой транзакцией на Etherscan (тестовая сеть) и сравните его с общим газом двух отдельных переводов.
  1. Концептуальный дизайн: Представьте «полувзаимозаменяемый» билет на мероприятие. Опишите основную логику, которую должен включать его контракт ERC-1155:
  • Как разрешить свободную торговлю всеми билетами (с одинаковым ID) до начала мероприятия?
  • Как разработать функцию expire(), которая уничтожает все неиспользованные билеты после мероприятия и отправляет уникальный памятный NFT (новый ID) держателям использованных билетов?

Дополнительное чтение​

  • EIP-1155: Стандарт нескольких токенов: Прочитайте оригинальный текст предложения по улучшению Ethereum, чтобы понять его мотивы дизайна и полные спецификации интерфейса.
  • Документация OpenZeppelin: ERC-1155: Узнайте, как использовать стандартные библиотеки контрактов для реализации ERC-1155 и практические модули расширения, такие как ERC1155Supply и ERC1155Pausable.
  • MetaMask «Простое руководство по токенам ERC-1155»: Краткое руководство для начинающих с понятными примерами.
  • NFT News Today «Освоение ERC-1155»: Углубленное обсуждение концепции полувзаимозаменяемых токенов (SFT) и их реальных примеров применения.

В следующем разделе (3.5) мы переключим наше внимание с самого стандарта активов на главное узкое место пользовательского опыта и рассмотрим решения: «Layer 2 и ERC-4337: Вывод пользовательского опыта на уровень Web2».