本文介绍了 ERC-6909 提案,该提案旨在通过移除批量操作和回调函数来降低 Gas 成本和复杂性,同时保留了类似于 ERC-1155 的多代币标准。文章还提供了一个使用 ERC-6909 创建游戏物品代币合约的例子,展示了如何利用扩展来添加小数位数以及如何进行代币的铸造和转移。
ERC-6909 是一个 EIP 草案,它借鉴了自 2018 年发布以来 ERC-1155 的经验。ERC-6909 的主要目标是降低 gas 成本和复杂性——这主要是通过移除批量操作和回调来实现的。
要理解多代币标准的灵感,请参阅 EIP-1155 文档中的多代币标准部分。 |
与 ERC-1155 相比,主要有三个变化,如下所示:
移除批量操作。
移除转移回调。
细化的授权——授权可以设置为全局的(作为 operators),也可以设置为每个代币的数量(受 ERC20 的启发)。
我们将使用 ERC-6909 来追踪游戏中的多个物品,每个物品都有自己独特的属性。所有物品类型都将 mint 给合约的部署者,我们可以稍后将其转移给玩家。我们还将使用 ERC6909Metadata
扩展来为我们的可替代物品添加小数位(vanilla ERC-6909 实现没有小数位)。
为简单起见,我们将在构造函数中 mint 所有物品——但是,可以将 mint 功能添加到合约中,以便根据玩家的需求进行 mint。
有关 mint 机制的概述,请查看 创建 ERC-20 供应。 |
以下是 tokenized 物品的合约示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {ERC6909Metadata} from "@openzeppelin/contracts/token/ERC6909/extensions/draft-ERC6909Metadata.sol";
contract ERC6909GameItems is ERC6909Metadata {
uint256 public constant GOLD = 0;
uint256 public constant SILVER = 1;
uint256 public constant THORS_HAMMER = 2;
uint256 public constant SWORD = 3;
uint256 public constant SHIELD = 4;
constructor() {
_setDecimals(GOLD, 18);
_setDecimals(SILVER, 18);
// Default decimals is 0
// 默认的小数位是 0
_setDecimals(SWORD, 9);
_setDecimals(SHIELD, 9);
_mint(msg.sender, GOLD, 10 ** 18);
_mint(msg.sender, SILVER, 10_000 ** 18);
_mint(msg.sender, THORS_HAMMER, 1);
_mint(msg.sender, SWORD, 10 ** 9);
_mint(msg.sender, SHIELD, 10 ** 9);
}
}
请注意,基本实现中没有 content URI 功能,但是 ERC6909ContentURI
扩展添加了它。此外,基本实现不跟踪总供应量,但是 ERC6909TokenSupply
扩展跟踪每个 token id 的总供应量。
合约部署后,我们将能够查询部署者的余额:
> gameItems.balanceOf(deployerAddress, 3)
1000000000
我们可以将物品转移到玩家帐户:
> gameItems.transfer(playerAddress, 2, 1)
> gameItems.balanceOf(playerAddress, 2)
1
> gameItems.balanceOf(deployerAddress, 2)
0
- 原文链接: docs.openzeppelin.com/co...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!