ERC20代币的实现

本文深入探讨了ERC20代币标准的实现。ERC20是指导以太坊网络上代币创建的技术标准,定义了一套规则,包括参数和方法,用于设置和获取有关代币的不同参数以及执行某些操作。文章还介绍了ERC20代币的基本参数、函数以及事件,并推荐使用Openzeppelin快速实现ERC-20代币。

实现一个ERC20代币

深入了解 ERC20 代币标准的实现。

什么是 ERC 20?

ERC (Ethereum Request for Comment)-20 是一个技术标准,指导创建在以太坊网络上使用的代币。它的创建是为了解决不同的开发者以自己的方式创建代币的问题,而所有这些代币彼此不兼容。ERC 20 代币标准指导开发者定义代币,以在 EVM 上的智能合约和 web3 应用程序中表示资产、所有权、权利、访问权限和加密货币。还有其他代币标准,如 ERC-721(NFT) 和 ERC-1155。

实现一个 ERC 20 代币

如前所述,ERC 20 定义了一组规则,所有开发者在实现他们的代币时都必须遵守。这些规则包括参数和方法(函数),允许我们设置和获取关于代币的不同参数,并执行某些操作。

所有 ERC20 代币都有一些基本参数,包括 —

  1. name:代币的名称。
  2. symbol:代币的符号,可以是任何有助于记住代币名称的东西,例如 ETH、USDT、BTC,totalSupply — 代币的最大供应量。
  3. decimals:代币的小数位数,默认为 18,但可以通过在合约构造函数中使用 _setupDecimals 来更改。
  4. balances:一个映射,保存拥有部分代币的地址和拥有的数量。
  5. allowances:一个映射,保存关于任何代币所有者允许另一个地址(通常称为 spender)提取/转移一定数量的代币的信息。

这是使用名为 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 代币标准中定义的函数,我们将在我们的代币中实现它们:

  1. name:我们的代币必须有一个名称。此函数允许我们获取代币的名称。

    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 代币标准中也定义了事件。以下是你应该与你的代币一起使用的事件:

  1. Transfer:

此事件在调用 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
blockmagnates
blockmagnates
The New Crypto Publication on The Block