ERC20介紹

觸不可及`發表於2022-06-26

ERC 20

這套介面、合約和應用程式都與 ERC20 代幣標準相關。

有一些核心合約實現了 EIP 中指定的功能和定義:

  • IERC20:包含所有ERC20應該實現的介面
  • IERC20Metadata:對ERC20介面的擴充套件,包括Token名稱,符號,和精度。
  • ERC20:對ERC20介面的實現,將名稱,符號和精度這些可選的標準擴充套件引入到基本介面中。

另外還有一些自定義的擴充套件可以使用,包括以下內容:

  • ERC20Burnable:銷燬持有的token
  • ERC20Capped:發行Token時對總供應量指定上限
  • ERC20Pausable:能夠暫停Token的交易
  • ERC20Snapshot:有效儲存過去的Token餘額,以便以後隨時查詢
  • ERC20Permit:token的委託無需Gas(同ERC2612的標準)
  • ERC20FlashMint:透過臨時代幣的鑄造和銷燬對閃電貸的代幣級支援(同ERC3156標準)
  • ERC20Votes:支援投票和投票委託
  • ERC20VotesComp:支援投票和投票委託(相容Compound的Token,有uint96的限制)
  • ERC20Wrapper:用於建立由另一個 ERC20 支援的 ERC20 的包裝器,具有儲存Token和撤回Token的方法,通常用於ERC20Votes的裁決

最後,還有一些工具可以以多種方式與ERC20 合約互動:

  • SafeERC20:介面的包裝器,無需對布林型別的返回值進行處理。
  • TokenTimelock:凍結交易的Token一定時間,直到到達一個指定的時間後才可以持有Token
  • ERC20Permit

核心介面

IERC20

ERC20的核心介面大多同IERC20合約繼承過來的,IERC20中包含以下介面:
函式

//返回存在的Token的總數
totalSupply()
//返回賬戶持有的Token的總數
balanceOf(account)
//將指定數量的Token交易到其他賬戶
//如果交易結果返回一個布林值
//同時觸發Transfer事件
transfer(to, amount)
//返回owner持有的,且spender具有消費許可權的Token數量,預設為0
allowance(owner, spender)
//配置一定數量的允許spender消費的Token數量
approve(spender, amount)
//從from賬戶地址交易一定數量的Token到其他地址,該Token透過approve函式賦予消費許可權
transferFrom(from, to, amount)

事件

Transfer(from,to,value)
APproval(owner,spender,value)

IERC20Metadata

ERC20標準中可選的後設資料函式介面:

//返回Token的名稱
name()
//返回Token的符號
symbol()
//返回Token的精度
decimals()

ERC20 Token 合約 構建

使用合約,可以輕鬆建立自己的ERC20 Token合約,可以用於跟蹤虛擬遊戲中的內部貨幣黃金 (GLD)。
一個簡單的示例如下:

// contracts/GLDToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

contract GLDToken is ERC20 {
    constructor(uint256 initialSupply) ERC20("Gold", "GLD") {
        _mint(msg.sender, initialSupply);
    }
}

在該合約中透過內部介面,並使用ERC20合約實現了ERC20基本的介面和Token名稱、Token符號、Token精度這些可選的擴充套件,另外,透過initialSupply指定了初始Token數量,並將指定數量的Token賦予到部署合約的賬戶地址。
當合約部署完成,將能夠去查詢合約部署的賬戶的餘額:

> GLDToken.balanceOf(部署者賬戶地址)
1000000000000000000000

同樣,也可將Token交易到其他賬戶:

> GLDToken.transfer(otherAddress, 300000000000000000000)
> GLDToken.balanceOf(otherAddress)
300000000000000000000
> GLDToken.balanceOf(deployerAddress)
700000000000000000000