ERC-6909 是一个 EIP 草案,它借鉴了自 2018 年发布以来 ERC-1155 的经验。ERC-6909 的主要目标是降低 Gas 成本和复杂度——这主要通过移除批量处理和回调来实现。

提示:要了解多代币标准的灵感来源,请参阅 多代币标准 部分在 EIP-1155 文档中。

从 ERC-1155 的更改

从 ERC-1155 主要有三个变化,如下所示:

  1. 移除批量操作。

  2. 移除转账回调。

  3. 更细粒度的授权—​授权可以全局设置(作为操作员),也可以按代币设置数量(受 ERC20 启发)。

构建一个 ERC-6909 代币合约

我们将使用 ERC-6909 来跟踪游戏中的多个物品,每个物品都有其独特的属性。所有的物品类型都将被铸造到合约的部署者,之后我们可以将其转移给玩家。我们还会使用 ERC6909Metadata 扩展来为我们的同质化物品添加小数位(原生的 ERC-6909 实现没有小数位)。

为了简单起见,我们将在构造函数中铸造所有物品——但是,可以将铸造功能添加到合约中,以便按需铸造给玩家。

提示:有关铸造机制的概述,请查看 创建 ERC-20 供应量

以下是代币化物品的合约可能的样子:

Unresolved include directive in modules/ROOT/pages/erc6909.adoc - include::api:example$token/ERC6909/ERC6909GameItems.sol[]

请注意,基本实现中没有内容 URI 功能,但 ERC6909ContentURI 扩展添加了它。此外,基本实现不跟踪总供应量,但 ERC6909TokenSupply 扩展跟踪每个代币 id 的总供应量。

合约部署后,我们将能够查询部署者的余额:

> gameItems.balanceOf(deployerAddress, 3)
1000000000

我们可以将物品转移到玩家账户:

> gameItems.transfer(playerAddress, 2, 1)
> gameItems.balanceOf(playerAddress, 2)
1
> gameItems.balanceOf(deployerAddress, 2)
0