ERC-1155 是为了解决多资产管理、批量转账、性能瓶颈等问题而提出的新一代资产标准。它融合了 FT(同质化)与 NFT(非同质化)两种资产类型,并通过安全钩子、batch 操作机制、大幅优化合约性能。
📚 作者:Henry 🧱 系列:《ERC 系列标准全景图解》 · 第 8 篇 👨💻 受众:Web3 前端工程师 / 区块链开发者 / Web3入门者 👉 系列持续更新中,建议收藏专栏或关注作者
在真实的链上场景中,很多资产既不是像 ERC-20 那样可分、同质化的代币,也不是像 ERC-721 那样独一无二、完全非同质的 NFT。
它们属于一种更具实际意义的中间态:
| 场景 | 典型资产 | 问题 | 
|---|---|---|
| GameFi 链游 | 玩家拥有多个「铁剑」「药水」「盾牌」 | 一类资产有多个,需批量持有、转移 | 
| NFT 徽章 | 一次发放 1000 个 OG 徽章 | 使用 ERC-721 会产生上千个 tokenId,处理低效 | 
| 营销空投 | 空投多个不同类别的奖励资产 | 多标准部署与管理成本高 | 
假如你用 ERC-721 表示上述资产,会遇到:
ERC-1155 提供一种统一的多资产表示方式:
safeBatchTransferFrom、mintBatch 等批量操作;onERC1155Received 与 onERC1155BatchReceived 保证合约安全性;ERC-1155 最大特点:同一合约中管理多种资产,每个 id 表示一种资产类型,amount 表示数量。
ERC-1155 采用一种全新的建模方式,不再以“每个 Token 是一个对象”的方式思考,而是构建了一种三维表结构:
资产种类(ID) × 拥有者(address) → 数量(uint256)这意味着可以在 一个合约中定义多个资产,通过 id 来区分每种资产,而不是像 ERC-721 那样每个都用独立 tokenId 来表示

| 函数 | 功能 | 
|---|---|
| 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;
优势:
🔍 示例场景:
| 场景 | 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
优点:
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 最早推动了 ERC-1155 的诞生。其 NFT 用于游戏道具,如剑、盾牌、药水等,其中:
tokenId,节省资源;RMRK 是一套用于构建复杂 NFT 的协议栈,其实现中大量使用类似 ERC-1155 的批量组合方式:
这推动了 ERC-1155 的进一步实用化与创新。
在很多 NFT 发售场景中,ERC-721 存在如下限制:
tokenId 数据ERC-1155 则支持:
tokenId 表示 1 类商品(如门票 A 区)这使其在 DTC(Direct to Consumer)电商类 NFT 项目中成为主流选择。
不少项目会将 稀有藏品 用 ERC-721 实现,将 基础道具或材料 用 ERC-1155 实现,以构建完整的经济系统:
ERC-721: 唯一角色、核心角色NFT
ERC-1155: 通用道具、消耗品、活动奖励这一组合设计,使链上资产具备更强的层级感和分类能力。
ERC-1155 是多资产管理的现代标准,适用于多样化 NFT 和 GameFi 业务场景。
它将 FT/NFT 融合统一管理,提升链上操作效率,是构建大型资产系统(如道具、卡片、代币混合模型)不可或缺的基础设施。
下一篇将基于本章内容,与 ERC-721 做全方位对比,帮助读者在实际项目中做出最优标准选择。
 
                如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!