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 做全方位对比,帮助读者在实际项目中做出最优标准选择。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!