学习ERC-1155
ERC-1155:可多功能代币标准
什么是ERC-1155?
ERC-1155 是一种以太坊智能合约标准,专为实现多功能代币(Multi-Token Standard)而设计。与 ERC-20(同质化代币)和 ERC-721(非同质化代币)不同,ERC-1155 支持 同质化代币(Fungible Tokens) 和 非同质化代币(Non-Fungible Tokens) 的混合管理。该标准极大地提高了区块链代币管理的灵活性与效率,尤其适用于游戏、收藏品等对多种资产类型有需求的场景。
ERC-1155 的主要特点包括:
批量操作:可以同时转移或创建多个代币,降低了链上操作成本。
单一合约管理多种代币:一个合约中可以包含多种代币类型,而不需要单独部署多个合约。
灵活性:支持同质化代币(如游戏金币)、非同质化代币(如NFT角色)和半同质化代币(如门票)。
节约Gas费用:通过批量操作和共享逻辑减少链上交易成本。
ERC-1155 的工作原理
ERC-1155 定义了一种标准接口,支持以下功能:
代币创建:可以通过
mint
方法创建新的代币类型。代币转移:支持单个或批量的代币转移。
事件通知:通过事件(如
TransferSingle
和TransferBatch
)提供透明且高效的状态更新。安全检测:增加了对智能合约接收代币的安全检测(如
onERC1155Received
和onERC1155BatchReceived
)。
ERC-1155 的核心方法:
safeTransferFrom
:单个代币的安全转移。safeBatchTransferFrom
:批量代币的安全转移。balanceOf
:查询某个账户上的指定代币余额。balanceOfBatch
:批量查询多个账户的多个代币余额。setApprovalForAll
:授权某个地址管理所有代币。isApprovedForAll
:检查授权状态。
ERC-1155 的用法:代码示例
以下是一个简单的 ERC-1155 智能合约,基于 OpenZeppelin 提供的实现:
1 | // SPDX-License-Identifier: MIT |
合约说明
- ERC1155 基础实现:
我们继承了 OpenZeppelin 的
ERC1155
实现,能够快速实现 ERC-1155 标准的功能。ERC1155
构造函数中需要指定一个代币元数据的 URI,可以通过id
动态替换。
- 代币 ID 和初始铸造:
定义了 3 种代币类型:
GOLD
(ID 为 1),SILVER
(ID 为 2),DIAMOND
(ID 为 3)。在合约部署时,分别铸造了 1000、5000 和 100 枚代币。
- 铸造与销毁:
提供了
mint
和mintBatch
方法供合约所有者调用,用于铸造新的代币。提供了
burn
和burnBatch
方法允许代币持有者销毁自己的代币。
- 批量操作:
- 我们可以通过
_mintBatch
和_burnBatch
一次性操作多个代币,极大减少了交易复杂度和成本。
部署与使用
- 部署:
使用 Remix 或 Hardhat 部署上面的合约。
部署后,合约创建者会自动成为初始代币的持有者。
- 查询余额:
使用
balanceOf
方法查询某个账户的指定代币余额。示例:
balanceOf(address, GOLD)
。
- 转移代币:
使用
safeTransferFrom
方法将代币发送给其他地址。示例:
1
2// 从 msg.sender 转移 10 枚 GOLD 给另一个地址
safeTransferFrom(msg.sender, recipient, GOLD, 10, "");
- 批量转移代币:
使用
safeBatchTransferFrom
方法批量转移多个代币。示例:
1
2
3
4
5
6
7
8
9
10// 从 msg.sender 转移 GOLD 和 SILVER 给另一个地址
uint256[] memory ids = new uint256[](2);
ids[0] = GOLD;
ids[1] = SILVER;
uint256[] memory amounts = new uint256[](2);
amounts[0] = 10;
amounts[1] = 20;
safeBatchTransferFrom(msg.sender, recipient, ids, amounts, "");
ERC-1155 的应用场景
游戏资产:
- 游戏道具、金币、装备等可以用 ERC-1155 统一管理,并支持批量交易。
数字收藏品:
- 一个合约中可以包含多种类型的收藏品(如卡牌游戏中的不同稀有度卡片)。
门票系统:
- 支持活动门票的发行、转移和销毁,既可以是同质化的(如普通票),也可以是非同质化的(如 VIP 定制票)。