ERC-1155 多资产标准全面解析

ERC-1155 是为了解决多资产管理、批量转账、性能瓶颈等问题而提出的新一代资产标准。它融合了 FT(同质化)与 NFT(非同质化)两种资产类型,并通过安全钩子、batch 操作机制、大幅优化合约性能。

📚 作者:Henry 🧱 系列:《ERC 系列标准全景图解》 · 第 8 篇 👨‍💻 受众:Web3 前端工程师 / 区块链开发者 / Web3入门者 👉 系列持续更新中,建议收藏专栏或关注作者

📦 为什么需要 ERC-1155?不是所有资产都非同质

在真实的链上场景中,很多资产既不是像 ERC-20 那样可分、同质化的代币,也不是像 ERC-721 那样独一无二、完全非同质的 NFT。

它们属于一种更具实际意义的中间态:

场景 典型资产 问题
GameFi 链游 玩家拥有多个「铁剑」「药水」「盾牌」 一类资产有多个,需批量持有、转移
NFT 徽章 一次发放 1000 个 OG 徽章 使用 ERC-721 会产生上千个 tokenId,处理低效
营销空投 空投多个不同类别的奖励资产 多标准部署与管理成本高

🚨 使用 ERC-721 的痛点

假如你用 ERC-721 表示上述资产,会遇到:

  • 每种资产都必须单独创建一个合约,或在合约中维护复杂的逻辑;
  • 每个 tokenId 必须独立 mint,链上记录混乱;
  • 无法进行 批量授权 / 批量转账 / 批量销毁,操作繁琐且 gas 成本高

✅ ERC-1155 如何解决?

ERC-1155 提供一种统一的多资产表示方式:

  • 同一个合约中支持多种 token 类型(FT / NFT / 自定义资产);
  • ID 区分资产种类balance 区分资产数量
  • 支持 safeBatchTransferFrommintBatch 等批量操作;
  • 配套接收钩子 onERC1155ReceivedonERC1155BatchReceived 保证合约安全性;

🔧 标准定位:统一资产表达模型

ERC-1155 最大特点:同一合约中管理多种资产,每个 id 表示一种资产类型,amount 表示数量

ERC-1155 采用一种全新的建模方式,不再以“每个 Token 是一个对象”的方式思考,而是构建了一种三维表结构:

资产种类(ID) × 拥有者(address) → 数量(uint256)

这意味着可以在 一个合约中定义多个资产,通过 id 来区分每种资产,而不是像 ERC-721 那样每个都用独立 tokenId 来表示

ERC1155资产表达模型

核心接口

函数 功能
balanceOf(address, id) 查询用户对某资产的持有数量
safeTransferFrom(...) 单个资产转移
safeBatchTransferFrom(...) 批量资产转移
setApprovalForAll(...) 批量授权(所有 ID)
isApprovedForAll(...) 查询授权状态

🔄 批量处理能力:性能极致优化

ERC-1155 强调批量处理(batch transfer),例如:

function safeBatchTransferFrom(
  address from,
  address to,
  uint256[] calldata ids,
  uint256[] calldata amounts,
  bytes calldata data
) external;

资产安全转移流程

优势:

  • ✅ 单笔交易批量转多个 id,节省 Gas;
  • ✅ 降低链上存储密度,减少事件数量;
  • ✅ 特别适合 GameFi / NFT 市场中道具系统。

🔍 示例场景:

场景 ERC-1155 表达方式
游戏玩家背包系统 id=1 为“剑”,amount=3 表示有三把剑
NFT 集卡系统 id=22 为某张卡,持有数量任意

🔒 安全钩子与合约交互防护

与 ERC-721 一样,ERC-1155 引入了合约接收钩子机制,避免资产误发送到不支持接收的合约地址:

单个资产接收钩子:

function onERC1155Received(
  address operator,
  address from,
  uint256 id,
  uint256 value,
  bytes calldata data
) external returns (bytes4);

批量资产接收钩子:

function onERC1155BatchReceived(
  address operator,
  address from,
  uint256[] calldata ids,
  uint256[] calldata values,
  bytes calldata data
) external returns (bytes4);

若实现正确,应返回以下选择器:

return this.onERC1155Received.selector;

否则会触发 revert

优点:

  • 合约必须返回特定 selector,否则交易 revert;
  • 兼容 safeTransfer/safeBatchTransfer 的行为规范;
  • 与 OpenSea 等市场平台交互更安全。

🧠 元信息设计与 URI 模板

ERC-1155 的元数据不使用 tokenURI(id),而是使用统一 URI:

function uri(uint256 id) external view returns (string memory);

支持 {id} 占位符替换,允许客户端替换路径获取元数据。

示例:

// URI: https://game.example/api/item/{id}.json

通过将 {id} 替换为 64 进制小写 hex 可获得:

https://game.example/api/item/0000000000000000000000000000000000000000000000000000000000000065.json

🧩 支持的扩展功能

虽然 ERC-1155 标准定义的是“最小可用接口”,但它天然为扩展留出空间。以下是常见的扩展方式:

扩展类型 描述
🔄 可铸造(Mintable) 允许特定角色创建新资产(如游戏关卡掉落)
🔥 可销毁(Burnable) 玩家可销毁多余的道具或装备换资源
🧑‍⚖️ 角色权限(Ownable/AccessControl) 控制 mint/burn 权限,防止滥用
🧩 Metadata 扩展 可支持 BaseURI 拼接或多语言元数据结构
💬 描述性事件扩展 自定义事件日志,便于链上索引与前端展示

OpenZeppelin 提供的 ERC1155PresetMinterPauser 模板,即是上述扩展的综合实现。


🌐 使用案例

🎮 Enjin 游戏平台

Enjin 最早推动了 ERC-1155 的诞生。其 NFT 用于游戏道具,如剑、盾牌、药水等,其中:

  • 同种道具只需一个 tokenId,节省资源;
  • 可对所有用户地址与其持有数量进行高效查询;
  • 支持批量发放空投,提高 Gas 使用效率。

🎨 RMRK 与 Multi-Asset NFTs

RMRK 是一套用于构建复杂 NFT 的协议栈,其实现中大量使用类似 ERC-1155 的批量组合方式:

  • 支持 NFT 挂载 NFT(如装备在角色上)
  • NFT 本身也可以包含 FT(如 NFT 钱包中有 ERC20)
  • 多语言、多分辨率、多媒介的 metadata 组合

这推动了 ERC-1155 的进一步实用化与创新。


🚀 ERC-1155 在链上商城与批量发售中的优势

在很多 NFT 发售场景中,ERC-721 存在如下限制:

  • 每次 mint 都要部署一个独立的 tokenId 数据
  • 无法高效发售同质商品(如演唱会票、数字周边)

ERC-1155 则支持:

  • 用一个 tokenId 表示 1 类商品(如门票 A 区)
  • 可一次性批量 mint,降低部署和交易成本
  • 批量转账 / 批量授权显著节省操作步骤

这使其在 DTC(Direct to Consumer)电商类 NFT 项目中成为主流选择。


🔧 与 ERC-721 的组合使用

不少项目会将 稀有藏品 用 ERC-721 实现,将 基础道具或材料 用 ERC-1155 实现,以构建完整的经济系统:

ERC-721: 唯一角色、核心角色NFT
ERC-1155: 通用道具、消耗品、活动奖励

这一组合设计,使链上资产具备更强的层级感和分类能力。


✅ 小结

ERC-1155 是多资产管理的现代标准,适用于多样化 NFT 和 GameFi 业务场景。

它将 FT/NFT 融合统一管理,提升链上操作效率,是构建大型资产系统(如道具、卡片、代币混合模型)不可或缺的基础设施。

下一篇将基于本章内容,与 ERC-721 做全方位对比,帮助读者在实际项目中做出最优标准选择。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论