Только в образовательных целях; не является инвестиционным советом или инвестиционной рекомендацией. Инвестиции могут привести к убыткам.
Краткий ответ
ERC-1155 — мультитокенный стандарт Ethereum. Один контракт может поддерживать множество типов токенов, а каждый token ID может обозначать взаимозаменяемый баланс, невзаимозаменяемый предмет или иную модель предложения, выбранную в реализации. Поэтому ключ актива — это contract address + token ID, а не только ID токена.
Стандарт определяет одиночные и пакетные запросы балансов, одиночные и пакетные безопасные передачи, разрешение оператору на все токены, обратные вызовы получателя, события передачи и необязательное поведение URI метаданных. Он не определяет, кто вправе выпускать токены, ограничено ли предложение, постоянны ли метаданные, какие юридические права дает токен и сколько он стоит. Эти свойства нужно проверять в конкретном контракте, его ролях и внешних зависимостях.
Как это работает
- Определите баланс.
balanceOf(account, id)возвращает количество токенов одного ID на счете.balanceOfBatch(accounts, ids)запрашивает соответствующие пары «счет — ID». Два контракта могут использовать ID1для никак не связанных активов, поэтому полная идентификация по-прежнему включает сеть, адрес контракта и ID. - Авторизуйте вызывающую сторону. Владелец может передать собственный баланс либо вызвать
setApprovalForAll(operator, true). Такое разрешение охватывает все ID ERC-1155, принадлежащие владельцу в данном контракте;isApprovedForAll(owner, operator)показывает его статус. В ERC-1155 нет встроенного разрешения, ограниченного одним ID или определенным количеством. - Выполните одиночную или пакетную передачу.
safeTransferFromперемещает один ID и одно количество.safeBatchTransferFromперемещает параллельные массивыidsиvalues, длина и порядок которых должны совпадать. Пакетная операция может сократить повторяющиеся накладные расходы, но не обязана быть дешевле при любой реализации или нагрузке. - Проверьте контракт-получатель. После обновления балансов и регистрации соответствующего события совместимая передача контракту вызывает
onERC1155ReceivedилиonERC1155BatchReceived. Неподдерживаемый обратный вызов, неверное возвращаемое значение или отказ обычно отменяют передачу. Эта проверка снижает риск случайной блокировки активов, но не доказывает надежность контракта-получателя и наличие в нем способа вывода. - Восстановите состояние по событиям. Каждый выпуск, передача и сжигание должны отражаться в
TransferSingleилиTransferBatch. При выпуске нулевой адрес указывается какfrom, а при сжигании — какto. Индексаторы могут вывести из этих журналов балансы и чистый объем выпуска по каждому ID, но должны правильно обработать всю историю, реорганизации сети и миграции контрактов. - Получите метаданные. Необязательное расширение URI может возвращать общий шаблон с
{id}. Клиент заменяет его записанным строчными буквами шестнадцатеричным ID токена, дополненным ведущими нулями до 64 символов, без префикса0x. При этом метаданные могут изменяться, быть недоступными или вводить в заблуждение, если реализация и гарантии хранения не предусматривают иного.
Практический пример
Игровой контракт назначает ID 1 золотым монетам, ID 7 пропускам, а ID 42 уникальному мечу. Балансы Алисы: balanceOf(Alice, 1) = 500, balanceOf(Alice, 7) = 3 и balanceOf(Alice, 42) = 1.
- Алиса вызывает
safeBatchTransferFromсids = [1, 7, 42]иvalues = [120, 1, 1]. Если проверка проходит успешно, ее новые балансы равны500 - 120 = 380,3 - 1 = 2и1 - 1 = 0; получателю зачисляются соответствующие количества. - Контракт регистрирует
TransferBatch. Если получатель является контрактом, он должен принять пакет черезonERC1155BatchReceived; иначе вся транзакция отменяется и ни одно из трех изменений баланса не сохраняется. - ID
42ведет себя как невзаимозаменяемый токен только потому, что логика его выпуска и передачи сохраняет предложение на уровне1. Сам ERC-1155 этого правила не требует. Позже тот же контракт может выпустить дополнительные единицы ID1в соответствии с собственным контролем доступа.
Риски и меры контроля
- Широкие полномочия оператора. Злонамеренный или скомпрометированный оператор, одобренный через
setApprovalForAll, может переместить все ID владельца в этом контракте. Проверяйте адрес оператора и контракт, при необходимости используйте отдельный кошелек и отзывайте устаревшие разрешения. - Полномочия на выпуск, приостановку и обновление. Это свойства реализации, а не гарантии стандарта. Изучите держателей ролей, администраторов прокси, временные блокировки, расширения предложения и возможность обновления изменить балансы или правила передачи.
- Несоответствие метаданных активу. URI или размещенный на сервере JSON может измениться, хотя ID в блокчейне останется прежним. Проверяйте хеши содержимого, надежность хранения, обязательства эмитента и права, существующие за пределами токен-контракта.
- Ошибки интеграции. Кошельки и индексаторы могут неверно сопоставлять пакетные массивы, пропускать исторические события, ошибочно обрабатывать реорганизации или путать одинаковые ID в разных контрактах и сетях. Сверяйте вызовы контракта, журналы и итоговые балансы.
- Риск получателя и повторного входа. Обратные вызовы получателя исполняют внешний код во время передачи. Реализациям и интегрирующим протоколам нужны правильный порядок обновления состояния и защита от повторного входа; одна лишь поддержка обратного вызова не заменяет аудит безопасности.
- Риск затрат и ликвидности. Пакетные передачи все равно расходуют газ и атомарно отменяются, если не выполнено хотя бы одно обязательное условие. Рыночная ликвидность, ценообразование, роялти, мосты, погашение и внесетевое исполнение прав не регулируются ERC-1155.
Распространенные заблуждения
- «Каждый ID — это NFT». У ID может быть любое количество единиц; невзаимозаменяемость зависит от предложения и смысла, заданных реализацией.
- «Один контракт означает одну коллекцию». Контракт может содержать много не связанных друг с другом типов токенов, а тот же числовой ID в другом контракте обозначает иной актив.
- «Безопасная передача означает, что актив безопасен». Обратный вызов проверяет совместимость получателя, а не качество контракта, цену, метаданные или возможность вернуть актив.
- «Пакетная операция всегда экономит газ». Она часто устраняет повторные накладные расходы, но фактический результат зависит от реализации, числа ID, изменений хранилища, calldata и модели сетевых комиссий.