原文:https://docs.openzeppelin.com/contracts/5.x/tokens

代币

在区块链领域,"代币"(token)是一个强大但常被误解的工具。代币是在区块链上对某种事物的表示,这种事物可以是货币、时间、服务、公司股份、虚拟宠物等。通过将事物表示为代币,我们可以让智能合约与它们交互、交换、创建或销毁它们。

代币合约简介

围绕代币的许多困惑源于两个概念的混淆:代币合约和实际的代币。代币合约只是一个以太坊智能合约。"发送代币"实际上意味着"调用某人编写并部署的智能合约中的一个方法"。归根结底,代币合约主要是一个地址到余额的映射,加上一些用于增加和减少这些余额的方法。

这些余额代表了代币。当某人在代币合约中的余额非零时,他们就"拥有代币"。这些余额可以被视为货币、游戏中的经验值、所有权契约或投票权,每种代币都存储在不同的代币合约中。

不同类型的代币

需要注意的是,拥有两个投票权和两份所有权契约之间存在很大差异:每个投票权都是等同且可互换的,但房屋通常不是!这就是所谓的可替代性。可替代物是等同且可互换的,如以太币、法定货币和投票权。不可替代物是独特且不同的,如所有权契约或收藏品。

简而言之,当处理不可替代物(如您的房屋)时,您关心的是您拥有哪些;而在处理可替代资产(如您的银行账户余额)时,重要的是您拥有多少。

标准

尽管代币的概念很简单,但在实现中存在各种复杂性。由于以太坊中的一切都是智能合约,并且对智能合约的功能没有硬性规定,社区制定了各种标准(称为 EIP 或 ERC),用于记录合约如何与其他合约互操作。

您可能听说过 ERC-20 或 ERC-721 代币标准。以下是一些主要的代币标准:

  • ERC-20:最广泛使用的可替代资产代币标准,尽管其简单性带来了一些限制。

  • ERC-721:用于不可替代代币的事实上的解决方案,常用于收藏品和游戏。

  • ERC-1155:一种新颖的多代币标准,允许单个合约表示多个可替代和不可替代代币,并提供批量操作以提高 Gas 效率。

要深入了解这些标准,您可以参考 OpenZeppelin 的官方文档:

通过遵循这些标准,开发者可以确保他们的代币合约能够与其他合约和应用程序互操作,从而促进以太坊生态系统的统一性和兼容性。


ERC-20 标准

ERC-20 是以太坊上一种广泛使用的代币标准,用于创建可替代(fungible)代币,即每个代币都是相同且可互换的。OpenZeppelin 提供了安全的 ERC-20 实现,允许开发者轻松创建符合该标准的代币合约。

主要功能:

  • 代币名称和符号:可以为代币设置名称(name)和符号(symbol)。

  • 小数位数:定义代币的最小单位,默认值为 18。

  • 总供应量:跟踪代币的总发行量。

  • 余额查询:允许用户查询特定地址的代币余额。

  • 转账功能:支持代币在地址之间的转移。

  • 授权与转移:允许地址授权第三方代表其转移代币。

示例代码:

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {
    constructor() ERC20("MyToken", "MTK") {
        _mint(msg.sender, 1000000 * 10 ** decimals());
    }
}

在上述代码中,MyToken 合约继承自 OpenZeppelin 的 ERC-20 实现,设置了代币名称为 "MyToken",符号为 "MTK",并在部署时向合约创建者铸造了 100 万个代币。


ERC-721 标准

ERC-721 是用于创建不可替代(non-fungible)代币(NFT)的标准,每个代币都是独特的,常用于数字收藏品、游戏资产等。OpenZeppelin 提供了符合 ERC-721 标准的安全实现,帮助开发者构建 NFT 应用。

主要功能:

  • 唯一标识:每个代币都有唯一的标识符(tokenId)。

  • 所有权管理:跟踪每个代币的所有者。

  • 安全转移:提供安全的代币转移功能,防止代币丢失。

  • 元数据扩展:支持为每个代币关联元数据(如名称、描述、图像等)。

  • 批准与授权:允许所有者授权第三方管理其代币。

示例代码:

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract MyNFT is ERC721 {
    uint256 public nextTokenId;
    address public admin;

    constructor() ERC721("MyNFT", "MNFT") {
        admin = msg.sender;
    }

    function mint(address to) external {
        require(msg.sender == admin, "only admin can mint");
        _safeMint(to, nextTokenId);
        nextTokenId++;
    }
}

在上述代码中,MyNFT 合约继承自 OpenZeppelin 的 ERC-721 实现,设置了 NFT 的名称为 "MyNFT",符号为 "MNFT"。合约管理员可以调用 mint 函数为指定地址铸造新的 NFT,每个 NFT 都有唯一的 tokenId


ERC-1155 标准

ERC-1155 是一种多代币标准,允许单个合约同时管理多种类型的代币,包括可替代和不可替代代币。这种设计提高了效率,特别适用于需要管理多种代币的应用,如游戏中的多种物品。

主要功能:

  • 多代币管理:单个合约可以管理多种代币类型。

  • 批量操作:支持批量转移和查询,减少操作成本。

  • 统一接口:为不同类型的代币提供统一的接口。

示例代码:

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";

contract GameItems is ERC1155 {
    uint256 public constant GOLD = 0;
    uint256 public constant SILVER = 1;
    uint256 public constant SWORD = 2;

    constructor() ERC1155("https://game.example/api/item/{id}.json") {
        _mint(msg.sender, GOLD, 1000, "");
        _mint(msg.sender, SILVER, 500, "");
        _mint(msg.sender, SWORD, 10, "");
    }
}

在上述代码中,GameItems 合约继承自 OpenZeppelin 的 ERC-1155 实现,定义了三种游戏物品:黄金、白银和剑。合约在部署时为创建者铸造了相应数量的每种物品。


ERC-4626 标准

ERC-4626 是 ERC-20 的扩展,提出了代币金库(Token Vault)的标准接口。该标准旨在为各种合约(如借贷市场、聚合器和内生的生息代币)提供统一的接口,提升互操作性。

主要功能:

  • 存款与取款:用户可以存入基础资产并获得相应的份额代币,或赎回份额代币以取回基础资产。

  • 收益分配:金库中的收益按持有份额的比例分配给用户。

  • 统一接口:为不同类型的金库提供标准化的交互