﻿---
title: "ERC-1155"
description: "ERC-1155 — мультитокенный стандарт Ethereum: один контракт может учитывать множество взаимозаменяемых, невзаимозаменяемых или смешанных типов токенов по ID и передавать несколько ID одной пакетной операцией."
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ERC-1155

> Только в образовательных целях; не является инвестиционным советом или инвестиционной рекомендацией. Инвестиции могут привести к убыткам.

<a id="answer"></a>

## Краткий ответ

ERC-1155 — мультитокенный стандарт Ethereum. Один контракт может поддерживать множество типов токенов, а каждый `token ID` может обозначать взаимозаменяемый баланс, невзаимозаменяемый предмет или иную модель предложения, выбранную в реализации. Поэтому ключ актива — это `contract address + token ID`, а не только ID токена.

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

<a id="mechanism"></a>

## Как это работает

1. **Определите баланс.** `balanceOf(account, id)` возвращает количество токенов одного ID на счете. `balanceOfBatch(accounts, ids)` запрашивает соответствующие пары «счет — ID». Два контракта могут использовать ID `1` для никак не связанных активов, поэтому полная идентификация по-прежнему включает сеть, адрес контракта и ID.
2. **Авторизуйте вызывающую сторону.** Владелец может передать собственный баланс либо вызвать `setApprovalForAll(operator, true)`. Такое разрешение охватывает все ID ERC-1155, принадлежащие владельцу в данном контракте; `isApprovedForAll(owner, operator)` показывает его статус. В ERC-1155 нет встроенного разрешения, ограниченного одним ID или определенным количеством.
3. **Выполните одиночную или пакетную передачу.** `safeTransferFrom` перемещает один ID и одно количество. `safeBatchTransferFrom` перемещает параллельные массивы `ids` и `values`, длина и порядок которых должны совпадать. Пакетная операция может сократить повторяющиеся накладные расходы, но не обязана быть дешевле при любой реализации или нагрузке.
4. **Проверьте контракт-получатель.** После обновления балансов и регистрации соответствующего события совместимая передача контракту вызывает `onERC1155Received` или `onERC1155BatchReceived`. Неподдерживаемый обратный вызов, неверное возвращаемое значение или отказ обычно отменяют передачу. Эта проверка снижает риск случайной блокировки активов, но не доказывает надежность контракта-получателя и наличие в нем способа вывода.
5. **Восстановите состояние по событиям.** Каждый выпуск, передача и сжигание должны отражаться в `TransferSingle` или `TransferBatch`. При выпуске нулевой адрес указывается как `from`, а при сжигании — как `to`. Индексаторы могут вывести из этих журналов балансы и чистый объем выпуска по каждому ID, но должны правильно обработать всю историю, реорганизации сети и миграции контрактов.
6. **Получите метаданные.** Необязательное расширение URI может возвращать общий шаблон с `{id}`. Клиент заменяет его записанным строчными буквами шестнадцатеричным ID токена, дополненным ведущими нулями до 64 символов, без префикса `0x`. При этом метаданные могут изменяться, быть недоступными или вводить в заблуждение, если реализация и гарантии хранения не предусматривают иного.

<a id="example"></a>

## Практический пример

Игровой контракт назначает 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 этого правила не требует. Позже тот же контракт может выпустить дополнительные единицы ID `1` в соответствии с собственным контролем доступа.

<a id="risks"></a>

## Риски и меры контроля

- **Широкие полномочия оператора.** Злонамеренный или скомпрометированный оператор, одобренный через `setApprovalForAll`, может переместить все ID владельца в этом контракте. Проверяйте адрес оператора и контракт, при необходимости используйте отдельный кошелек и отзывайте устаревшие разрешения.
- **Полномочия на выпуск, приостановку и обновление.** Это свойства реализации, а не гарантии стандарта. Изучите держателей ролей, администраторов прокси, временные блокировки, расширения предложения и возможность обновления изменить балансы или правила передачи.
- **Несоответствие метаданных активу.** URI или размещенный на сервере JSON может измениться, хотя ID в блокчейне останется прежним. Проверяйте хеши содержимого, надежность хранения, обязательства эмитента и права, существующие за пределами токен-контракта.
- **Ошибки интеграции.** Кошельки и индексаторы могут неверно сопоставлять пакетные массивы, пропускать исторические события, ошибочно обрабатывать реорганизации или путать одинаковые ID в разных контрактах и сетях. Сверяйте вызовы контракта, журналы и итоговые балансы.
- **Риск получателя и повторного входа.** Обратные вызовы получателя исполняют внешний код во время передачи. Реализациям и интегрирующим протоколам нужны правильный порядок обновления состояния и защита от повторного входа; одна лишь поддержка обратного вызова не заменяет аудит безопасности.
- **Риск затрат и ликвидности.** Пакетные передачи все равно расходуют газ и атомарно отменяются, если не выполнено хотя бы одно обязательное условие. Рыночная ликвидность, ценообразование, роялти, мосты, погашение и внесетевое исполнение прав не регулируются ERC-1155.

<a id="misconceptions"></a>

## Распространенные заблуждения

- **«Каждый ID — это NFT».** У ID может быть любое количество единиц; невзаимозаменяемость зависит от предложения и смысла, заданных реализацией.
- **«Один контракт означает одну коллекцию».** Контракт может содержать много не связанных друг с другом типов токенов, а тот же числовой ID в другом контракте обозначает иной актив.
- **«Безопасная передача означает, что актив безопасен».** Обратный вызов проверяет совместимость получателя, а не качество контракта, цену, метаданные или возможность вернуть актив.
- **«Пакетная операция всегда экономит газ».** Она часто устраняет повторные накладные расходы, но фактический результат зависит от реализации, числа ID, изменений хранилища, calldata и модели сетевых комиссий.

<a id="related"></a>

## Связанные темы

- [ERC-20](/ru/crypto/erc20/)
- [ERC-721](/ru/crypto/erc721/)
- [NFT](/ru/crypto/nft/)
- [Стандарт токенов](/ru/crypto/token-standard/)

<a id="sources"></a>

## Источники

- [ERC-1155: мультитокенный стандарт](https://eips.ethereum.org/EIPS/eip-1155)
- [API ERC1155](https://docs.openzeppelin.com/contracts/5.x/api/token/erc1155)

Source: https://wiki.fcontext.com/ru/crypto/erc1155/index.mdx
