学习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 定义了一种标准接口,支持以下功能:

  1. 代币创建:可以通过 mint 方法创建新的代币类型。

  2. 代币转移:支持单个或批量的代币转移。

  3. 事件通知:通过事件(如 TransferSingleTransferBatch)提供透明且高效的状态更新。

  4. 安全检测:增加了对智能合约接收代币的安全检测(如 onERC1155ReceivedonERC1155BatchReceived)。

ERC-1155 的核心方法:

  • safeTransferFrom:单个代币的安全转移。

  • safeBatchTransferFrom:批量代币的安全转移。

  • balanceOf:查询某个账户上的指定代币余额。

  • balanceOfBatch:批量查询多个账户的多个代币余额。

  • setApprovalForAll:授权某个地址管理所有代币。

  • isApprovedForAll:检查授权状态。


ERC-1155 的用法:代码示例

以下是一个简单的 ERC-1155 智能合约,基于 OpenZeppelin 提供的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// 引入 OpenZeppelin 的 ERC1155 实现
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyERC1155Token is ERC1155, Ownable {

// 定义代币的 ID
uint256 public constant GOLD = 1;
uint256 public constant SILVER = 2;
uint256 public constant DIAMOND = 3;

// 构造函数:设置代币URI
constructor() ERC1155("https://game.example/api/token/{id}.json") {
// 铸造初始代币
_mint(msg.sender, GOLD, 1000, ""); // 1000枚 GOLD 代币
_mint(msg.sender, SILVER, 5000, ""); // 5000枚 SILVER 代币
_mint(msg.sender, DIAMOND, 100, ""); // 100枚 DIAMOND 代币
}

// 自定义铸造函数
function mint(uint256 id, uint256 amount) public onlyOwner {
_mint(msg.sender, id, amount, "");
}

// 自定义批量铸造函数
function mintBatch(uint256[] memory ids, uint256[] memory amounts) public onlyOwner {
_mintBatch(msg.sender, ids, amounts, "");
}

// 自定义销毁函数
function burn(address account, uint256 id, uint256 amount) public {
require(msg.sender == account, "Only the token owner can burn tokens");
_burn(account, id, amount);
}

// 自定义批量销毁函数
function burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) public {
require(msg.sender == account, "Only the token owner can burn tokens");
_burnBatch(account, ids, amounts);
}
}

合约说明

  1. ERC1155 基础实现
  • 我们继承了 OpenZeppelin 的 ERC1155 实现,能够快速实现 ERC-1155 标准的功能。

  • ERC1155 构造函数中需要指定一个代币元数据的 URI,可以通过 id 动态替换。

  1. 代币 ID 和初始铸造
  • 定义了 3 种代币类型:GOLD(ID 为 1),SILVER(ID 为 2),DIAMOND(ID 为 3)。

  • 在合约部署时,分别铸造了 1000、5000 和 100 枚代币。

  1. 铸造与销毁
  • 提供了 mintmintBatch 方法供合约所有者调用,用于铸造新的代币。

  • 提供了 burnburnBatch 方法允许代币持有者销毁自己的代币。

  1. 批量操作
  • 我们可以通过 _mintBatch_burnBatch 一次性操作多个代币,极大减少了交易复杂度和成本。

部署与使用

  1. 部署
  • 使用 Remix 或 Hardhat 部署上面的合约。

  • 部署后,合约创建者会自动成为初始代币的持有者。

  1. 查询余额
  • 使用 balanceOf 方法查询某个账户的指定代币余额。

  • 示例:balanceOf(address, GOLD)

  1. 转移代币
  • 使用 safeTransferFrom 方法将代币发送给其他地址。

  • 示例:

    1
    2
    // 从 msg.sender 转移 10 枚 GOLD 给另一个地址
    safeTransferFrom(msg.sender, recipient, GOLD, 10, "");
  1. 批量转移代币
  • 使用 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 定制票)。