Solidity

ERC20介面

  • November 29, 2020

做代幣時,一定要有ERC20介面(如下圖)嗎?它的目的是什麼?

pragma solidity 0.6.6;

/// @notice ERC20 https://eips.ethereum.org/EIPS/eip-20 with optional symbol, name and decimals

interface ERC20 {
   function totalSupply() external view returns (uint);
   function balanceOf(address tokenOwner) external view returns (uint balance);
   function allowance(address tokenOwner, address spender) external view returns (uint remaining);
   function transfer(address to, uint tokens) external returns (bool success);
   function approve(address spender, uint tokens) external returns (bool success);
   function transferFrom(address from, address to, uint tokens) external returns (bool success);

   function symbol() external view returns (string memory);
   function name() external view returns (string memory);
   function decimals() external view returns (uint8);

   event Transfer(address indexed from, address indexed to, uint tokens);
   event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
} 

我想知道,不是為 totalSupply 製作一個函式,我不能只製作uint256 totalSupply;,uint256 public totalSupply;嗎?

做代幣,一定要有ERC20介面嗎?

不,您必須實現ERC20 介面。

在 an 中聲明這些函式interface只是一種很好的程式實踐,因為它允許您使用該介面而不是程式碼中其他地方的實際合約。

而不是function totalSupply,我不能只使用uint256 public totalSupply嗎?

當然可以,這就是“實現介面”的意思。

沒有人強迫您顯式實現function totalSupply,但您知道,當您聲明 時uint256 public totalSupply,您會隱式實現相同的功能(即編譯器會為您自動生成它)。所以從技術上講,沒有區別。

一些(例如,Open-Zeppelin)顯式聲明uint256 private totalSupply然後實現的function totalSupply原因再次是為了良好的程式習慣。

例如,當您聲明時uint256 public totalSupply,任何從您的契約繼承的契約都可以在內部更改此變數,這很可能是不可取的。當然,如果您在系統中沒有這樣的契約,那麼這應該不是問題,但是良好的程式習慣也意味著您提前計劃並以“正確的方式”去做,即使沒有“迫在眉睫的威脅” ”。

引用自:https://ethereum.stackexchange.com/questions/90591