跳到正文

ERC-1155

ERC-1155 是以太坊的多代币标准:一个合约可按 ID 记录多种同质化、非同质化或混合代币,并在一次批量转账中转移多个 ID。

更新于

仅供教育参考,不构成投资建议;投资可能产生损失。

直接答案

ERC-1155 是以太坊的多代币标准。单个合约可以维护多种代币类型,每个 token ID 都可代表同质化余额、非同质化物品,或由具体实现选择的其他供应量设计。因此,资产的标识键是 contract address + token ID,而不是只有代币 ID。

该标准定义了单项和批量余额查询、单项和批量安全转账、操作员全局授权、接收方回调、转账事件,以及可选的元数据 URI 行为。它不规定谁可以铸造、供应量是否设有上限、元数据是否永久不变、代币赋予何种法律权利,也不规定任何代币的价值。这些属性必须结合具体合约、角色权限及其外部依赖逐一核实。

运作方式

  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 转移并行的 idsvalues 数组,两者的长度和顺序必须对应。批处理可以减少重复的交易开销,但不能保证对每种实现或工作负载都更便宜。
  4. 检查合约接收方。 更新余额并发出相关事件后,向合约进行的合规转账会调用 onERC1155ReceivedonERC1155BatchReceived。不支持回调、返回值错误或拒绝接收通常会使转账回滚。这项接收检查可降低资产意外锁死的风险,但不能证明接收合约值得信任或提供了取回路径。
  5. 根据事件重建状态。 每次铸造、转账和销毁都必须通过 TransferSingleTransferBatch 体现。铸造以零地址作为 from,销毁则以零地址作为 to。索引器可以从这些日志推导余额及每个 ID 的净铸造供应量,但必须正确处理完整历史、链重组和合约迁移。
  6. 解析元数据。 可选的 URI 扩展可以返回包含 {id} 的共用模板。客户端会将其替换为小写、左侧补零至 64 个字符且不带 0x 前缀的十六进制代币 ID。除非具体实现和存储保证另有说明,否则元数据仍可能被修改、无法访问或具有误导性。

实例

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

  • Alice 调用 safeBatchTransferFrom,传入 ids = [1, 7, 42]values = [120, 1, 1]。如果验证成功,她的新余额分别为 500 - 120 = 3803 - 1 = 21 - 1 = 0;接收方取得对应数量。
  • 合约发出 TransferBatch。如果接收方是合约,就必须通过 onERC1155BatchReceived 接受该批次;否则整笔交易回滚,三项余额变化都不会保留。
  • ID 42 之所以表现为非同质化代币,只是因为其发行和转账逻辑将供应量维持在 1。ERC-1155 本身并不强制这一规则。同一合约之后仍可根据自身访问控制增发 ID 1

风险与控制

  • 操作员权限范围广。 通过 setApprovalForAll 获得授权的恶意或已遭入侵操作员,可以转移持有人在该合约内拥有的每一个 ID。核对操作员地址和合约,适当时使用独立钱包,并撤销陈旧授权。
  • 铸造、暂停和升级权限。 这些是具体实现的功能,而不是标准保证。检查角色持有人、代理管理员、时间锁、供应量扩展,以及升级能否改变余额或转账规则。
  • 元数据与资产不一致。 URI 或托管的 JSON 可以变化,而链上 ID 保持不变。核实内容哈希、存储持久性、发行方承诺,以及代币合约之外所代表的权利。
  • 集成错误。 钱包和索引器可能错误配对批量数组、遗漏历史事件、错误处理链重组,或混淆不同合约及链上的相同 ID。应对照合约调用、日志和最终余额进行核验。
  • 接收方与重入风险。 接收方回调会在转账流程中执行外部代码。具体实现和集成协议需要采用恰当的状态更新顺序与重入防护;支持回调本身不等于已经通过安全审查。
  • 成本与流动性风险。 批量转账仍会消耗 Gas,而且只要一个必要条件失败就会整体回滚。市场流动性、定价、版税、跨链桥接、赎回和链下执行均不属于 ERC-1155 的规范范围。

常见误区

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

相关主题

来源

导航

搜索知识库...