本文深入探讨了ERC20代币标准的实现。ERC20是指导以太坊网络上代币创建的技术标准,定义了一套规则,包括参数和方法,用于设置和获取有关代币的不同参数以及执行某些操作。文章还介绍了ERC20代币的基本参数、函数以及事件,并推荐使用Openzeppelin快速实现ERC-20代币。
深入了解 ERC20 代币标准的实现。
什么是 ERC 20?
ERC (Ethereum Request for Comment)-20 是一个技术标准,指导创建在以太坊网络上使用的代币。它的创建是为了解决不同的开发者以自己的方式创建代币的问题,而所有这些代币彼此不兼容。ERC 20 代币标准指导开发者定义代币,以在 EVM 上的智能合约和 web3 应用程序中表示资产、所有权、权利、访问权限和加密货币。还有其他代币标准,如 ERC-721(NFT) 和 ERC-1155。
实现一个 ERC 20 代币
如前所述,ERC 20 定义了一组规则,所有开发者在实现他们的代币时都必须遵守。这些规则包括参数和方法(函数),允许我们设置和获取关于代币的不同参数,并执行某些操作。
所有 ERC20 代币都有一些基本参数,包括 —
这是使用名为 TokenX 的示例代币的 ERC -20 代币的基本结构:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract MyToken {
string public name = "TokenX";
string public symbol = "TKX";
uint8 public decimals = 18;
uint256 private _totalSupply;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
constructor(uint256 initialSupply) {
_totalSupply = initialSupply * 10 ** uint256(decimals);
_balances[msg.sender] = _totalSupply;
}
}
以下是在 ERC 20 代币标准中定义的函数,我们将在我们的代币中实现它们:
function name() public view returns (string) {
return name;
}
2. symbol:此函数允许我们获取代币的符号。
function symbol() public view returns (string) {
return symbol;
}
3. decimals:此函数返回代币的小数位数。
function decimals() public view returns (uint8) {
return decimals;
}
4. totalSupply:在创建我们的代币时,我们必须定义其最大供应量。所有 ERC20 代币都有一个固定的供应量,这是通过在构造函数中传递 _totalSupply 来设置的。一旦达到这个供应量,合约将不再产生任何代币。
function totalSupply() public view returns (uint256) {
return totalSupply;
}
5. balanceOf:此函数返回特定地址的代币余额。该函数将我们想要获取余额的地址作为参数。如上所述,余额映射到每个地址。
function balanceOf(address _owner) public view returns (uint256 balance) {
return balance[_owner];
}
6. transfer:transfer 函数允许我们将一定数量的代币从一个地址(调用者)转移到另一个地址。此函数会发出一个 Transfer 事件(更多关于此事件的细节如下),如果调用者没有足够的代币要转移,则会抛出一个错误。该函数采用参数 _to,即我们要转移到的地址,以及 _value,即要转移的代币的价值。下面的实现使用了 call 函数。
function transfer(address _to, uint256 _value) public returns (bool success) {}
7. transferFrom:此函数允许我们从另一个地址转移代币,该地址不必是调用者,转移到另一个地址。如果调用者未获得代币所有者的授权,则此函数会抛出一个错误。它接受 3 个参数,_from 是要从中转移代币的地址,_to — 接收代币的地址,以及 _value — 要发送的数量,并发出 Transfer 事件。
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {}
8. approve:此函数批准一个“spender”——除了所有者之外的另一个地址,从一个地址提取和转移代币。该函数采用参数 _spender — 要批准的地址,以及 _value — 允许 spender 花费的金额。会发出一个 approval 事件。
function approve(address _spender, uint256 _value) public returns (bool success) {}
9. allowance:此函数返回 spender 被批准从所有者的代币中取用的代币数量。该函数采用参数 _owner,即代币所有者的地址,以及 _spender,即 spender 的地址。
function allowance(address _owner, address _spender) public view returns (uint256 remaining) {}
如果你注意到了,我在定义函数时发出了一些事件。为了使我们的代币更可用并与其他程序通信,ERC 20 代币标准中也定义了事件。以下是你应该与你的代币一起使用的事件:
此事件在调用 transfer 和 transferFrom 之后触发,它提供了关于事务的更多信息,包括 _from — 发送者的地址,_to — 接收者的地址,以及 _value- 发送的数量。
event Transfer(address indexed _from, address indexed _to, uint256 _value)
2. Approval:
此事件在调用 approve 函数后触发,它发出这些详细信息 — _owner(代币所有者的地址),_spender(被批准提取代币的地址),以及 value(允许 spender 花费的金额)。
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
为了帮助你快速开始实现你的 ERC-20 代币,并在你的智能合约中抽象出这些实现的大部分,你可以使用 Openzeppelin。
我希望这能帮助你理解 ERC20 代币以及如何实现你的代币。如有任何问题或咨询,请通过 obaloluwaolusoji@gmail.com 或 X: @Oba_dDev 与我联系。
- 原文链接: blog.blockmagnates.com/i...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!