“代币”的简介,以及 ERC-20、ERC-721、ERC-1155 和 ERC-4626 标准的简要概述
代币
在区块链领域,"代币"(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)的标准接口。该标准旨在为各种合约(如借贷市场、聚合器和内生的生息代币)提供统一的接口,提升互操作性。
主要功能:
-
存款与取款:用户可以存入基础资产并获得相应的份额代币,或赎回份额代币以取回基础资产。
-
收益分配:金库中的收益按持有份额的比例分配给用户。
-
统一接口:为不同类型的金库提供标准化的交互
- 感谢你赐予我前进的力量