Solidity
ERC20介面
做代幣時,一定要有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
,任何從您的契約繼承的契約都可以在內部更改此變數,這很可能是不可取的。當然,如果您在系統中沒有這樣的契約,那麼這應該不是問題,但是良好的程式習慣也意味著您提前計劃並以“正確的方式”去做,即使沒有“迫在眉睫的威脅” ”。