仅供教育参考,不构成投资建议;投资可能产生损失。
直接答案
ERC-1155 是以太坊的多代币标准。单个合约可以维护多种代币类型,每个 token ID 都可代表同质化余额、非同质化物品,或由具体实现选择的其他供应量设计。因此,资产的标识键是 contract address + token ID,而不是只有代币 ID。
该标准定义了单项和批量余额查询、单项和批量安全转账、操作员全局授权、接收方回调、转账事件,以及可选的元数据 URI 行为。它不规定谁可以铸造、供应量是否设有上限、元数据是否永久不变、代币赋予何种法律权利,也不规定任何代币的价值。这些属性必须结合具体合约、角色权限及其外部依赖逐一核实。
运作方式
- 识别余额。
balanceOf(account, id)返回某账户持有一个 ID 的数量。balanceOfBatch(accounts, ids)查询成对的账户与 ID 条目。两个合约都可能用 ID1表示彼此无关的资产,因此完整身份仍由链、合约地址和 ID 共同确定。 - 授权调用方。 持有人可以转移自己的余额,也可以调用
setApprovalForAll(operator, true)。该授权涵盖持有人在该合约内拥有的全部 ERC-1155 ID;isApprovedForAll(owner, operator)返回授权状态。ERC-1155 没有提供仅限一个 ID 或一个数量的原生授权方式。 - 执行单项或批量转账。
safeTransferFrom转移一个 ID 及其数量。safeBatchTransferFrom转移并行的ids与values数组,两者的长度和顺序必须对应。批处理可以减少重复的交易开销,但不能保证对每种实现或工作负载都更便宜。 - 检查合约接收方。 更新余额并发出相关事件后,向合约进行的合规转账会调用
onERC1155Received或onERC1155BatchReceived。不支持回调、返回值错误或拒绝接收通常会使转账回滚。这项接收检查可降低资产意外锁死的风险,但不能证明接收合约值得信任或提供了取回路径。 - 根据事件重建状态。 每次铸造、转账和销毁都必须通过
TransferSingle或TransferBatch体现。铸造以零地址作为from,销毁则以零地址作为to。索引器可以从这些日志推导余额及每个 ID 的净铸造供应量,但必须正确处理完整历史、链重组和合约迁移。 - 解析元数据。 可选的 URI 扩展可以返回包含
{id}的共用模板。客户端会将其替换为小写、左侧补零至 64 个字符且不带0x前缀的十六进制代币 ID。除非具体实现和存储保证另有说明,否则元数据仍可能被修改、无法访问或具有误导性。
实例
某游戏合约将 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 本身并不强制这一规则。同一合约之后仍可根据自身访问控制增发 ID1。
风险与控制
- 操作员权限范围广。 通过
setApprovalForAll获得授权的恶意或已遭入侵操作员,可以转移持有人在该合约内拥有的每一个 ID。核对操作员地址和合约,适当时使用独立钱包,并撤销陈旧授权。 - 铸造、暂停和升级权限。 这些是具体实现的功能,而不是标准保证。检查角色持有人、代理管理员、时间锁、供应量扩展,以及升级能否改变余额或转账规则。
- 元数据与资产不一致。 URI 或托管的 JSON 可以变化,而链上 ID 保持不变。核实内容哈希、存储持久性、发行方承诺,以及代币合约之外所代表的权利。
- 集成错误。 钱包和索引器可能错误配对批量数组、遗漏历史事件、错误处理链重组,或混淆不同合约及链上的相同 ID。应对照合约调用、日志和最终余额进行核验。
- 接收方与重入风险。 接收方回调会在转账流程中执行外部代码。具体实现和集成协议需要采用恰当的状态更新顺序与重入防护;支持回调本身不等于已经通过安全审查。
- 成本与流动性风险。 批量转账仍会消耗 Gas,而且只要一个必要条件失败就会整体回滚。市场流动性、定价、版税、跨链桥接、赎回和链下执行均不属于 ERC-1155 的规范范围。
常见误区
- “每个 ID 都是 NFT。” 一个 ID 可以有任意数量;是否具有非同质化属性取决于具体实现的供应量与语义。
- “一个合约就代表一个系列。” 一个合约可以容纳许多彼此无关的代币类型,而另一个合约中的相同数字 ID 标识的是不同资产。
- “安全转账意味着资产安全。” 回调只检查接收方兼容性,不检查合约质量、价格、元数据或资产能否取回。
- “批处理总能节省 Gas。” 它通常能避免重复开销,但实际结果取决于具体实现、ID 数量、存储变化、调用数据和网络费用模型。