﻿---
title: "ERC-1155"
description: "ERC-1155 是以太坊的多代币标准：一个合约可按 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 是以太坊的多代币标准。单个合约可以维护多种代币类型，每个 `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)`。该授权涵盖持有人在该合约内拥有的全部 ERC-1155 ID；`isApprovedForAll(owner, operator)` 返回授权状态。ERC-1155 没有提供仅限一个 ID 或一个数量的原生授权方式。
3. **执行单项或批量转账。** `safeTransferFrom` 转移一个 ID 及其数量。`safeBatchTransferFrom` 转移并行的 `ids` 与 `values` 数组，两者的长度和顺序必须对应。批处理可以减少重复的交易开销，但不能保证对每种实现或工作负载都更便宜。
4. **检查合约接收方。** 更新余额并发出相关事件后，向合约进行的合规转账会调用 `onERC1155Received` 或 `onERC1155BatchReceived`。不支持回调、返回值错误或拒绝接收通常会使转账回滚。这项接收检查可降低资产意外锁死的风险，但不能证明接收合约值得信任或提供了取回路径。
5. **根据事件重建状态。** 每次铸造、转账和销毁都必须通过 `TransferSingle` 或 `TransferBatch` 体现。铸造以零地址作为 `from`，销毁则以零地址作为 `to`。索引器可以从这些日志推导余额及每个 ID 的净铸造供应量，但必须正确处理完整历史、链重组和合约迁移。
6. **解析元数据。** 可选的 URI 扩展可以返回包含 `{id}` 的共用模板。客户端会将其替换为小写、左侧补零至 64 个字符且不带 `0x` 前缀的十六进制代币 ID。除非具体实现和存储保证另有说明，否则元数据仍可能被修改、无法访问或具有误导性。

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

## 实例

某游戏合约将 ID `1` 分配给金币，将 ID `7` 分配给通行证，将 ID `42` 分配给一把独一无二的宝剑。Alice 持有 `balanceOf(Alice, 1) = 500`、`balanceOf(Alice, 7) = 3` 和 `balanceOf(Alice, 42) = 1`。

- Alice 调用 `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。应对照合约调用、日志和最终余额进行核验。
- **接收方与重入风险。** 接收方回调会在转账流程中执行外部代码。具体实现和集成协议需要采用恰当的状态更新顺序与重入防护；支持回调本身不等于已经通过安全审查。
- **成本与流动性风险。** 批量转账仍会消耗 Gas，而且只要一个必要条件失败就会整体回滚。市场流动性、定价、版税、跨链桥接、赎回和链下执行均不属于 ERC-1155 的规范范围。

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

## 常见误区

- **“每个 ID 都是 NFT。”** 一个 ID 可以有任意数量；是否具有非同质化属性取决于具体实现的供应量与语义。
- **“一个合约就代表一个系列。”** 一个合约可以容纳许多彼此无关的代币类型，而另一个合约中的相同数字 ID 标识的是不同资产。
- **“安全转账意味着资产安全。”** 回调只检查接收方兼容性，不检查合约质量、价格、元数据或资产能否取回。
- **“批处理总能节省 Gas。”** 它通常能避免重复开销，但实际结果取决于具体实现、ID 数量、存储变化、调用数据和网络费用模型。

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

## 相关主题

- [ERC-20](/zh-cn/crypto/erc20/)
- [ERC-721](/zh-cn/crypto/erc721/)
- [NFT](/zh-cn/crypto/nft/)
- [代币标准](/zh-cn/crypto/token-standard/)

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

## 来源

- [ERC-1155：多代币标准](https://eips.ethereum.org/EIPS/eip-1155)
- [ERC1155 API](https://docs.openzeppelin.com/contracts/5.x/api/token/erc1155)

Source: https://wiki.fcontext.com/zh-cn/crypto/erc1155/index.mdx
