# ERC20 代幣標準
ERC20 標準: https://eips.ethereum.org/EIPS/eip-20
在很多應用場景下,開發者需要發行自己的代幣以提供服務,比如說:遊戲代幣、點數卡、或通用貨幣。因此,這個介面標準包含了如何發行代幣、代幣間如何轉移、授權給第三方使用等概念。
# 代幣規範
# 函式
請注意,呼叫者必須處理呼叫失敗的情況,比如說轉帳可能會失敗。千萬不能假設呼叫一定會成功而忽略了函式的回傳值。
# name(代幣名稱),可選用
回傳代幣的名稱,比如:"海帶作幣"
。
此函式只用來增加可用性,比如方便錢包或交易所查詢代幣名稱;由於是可選用的函式,因此不能預設每個 ERC20 的合約都實作了這個功能。
// 沒有任何輸入參數,直接回傳代幣名稱(字串型態)
function name() public view returns (string)
# symbol(簡稱),可選用
回傳代幣的簡稱,比如:"HDT"
此函式只用來增加可用性,比如方便錢包或交易所查詢代幣簡稱;由於是可選用的函式,因此不能預設每個 ERC20 的合約都實作了這個功能。
// 沒有任何輸入參數,直接回傳代幣簡稱(字串型態)
function symbol() public view returns (string)
# decimals(小數點),可選用
回傳該代幣的小數點位置。假設為 N
,則代表代幣數量除以 (10^N) 才是基本單位,低於 N 位數的為小數後數字。
此函式只用來增加可用性,比如方便錢包或交易所查詢代幣的小數點位置;由於是可選用的函式,因此不能預設每個 ERC20 的合約都實作了這個功能。
// 沒有任何輸入參數,直接回傳代幣小數點位置(uint8 型態)
function decimals() public view returns (uint8)
# totalSupply(發行總量)
回傳該代幣的發行總量。
// 沒有任何輸入參數,直接回傳代幣小數點位置(uint256 型態)
function totalSupply() public view returns (uint256)
# balanceOf(回傳某個帳戶的餘額)
回傳 _owner
的帳戶代幣餘額。
// 輸入查詢者的位址 _owner,回傳其代幣餘額 balance
function balanceOf(address _owner) public view returns (uint256 balance)
# transfer(轉帳)
轉移 _value
數量的代幣從「函式呼叫者」到「接收者 _to
」,且本函式必然觸發 Transfer
事件。
當「函式呼叫者」的餘額不足時,應丟出錯誤(throw
)。
要留意的是,當 _value
為 0
時,也是個合法的轉帳,只是他轉了個寂寞。
// 從 msg.sender 轉帳 _value 數量的代幣給 _to,如果成功回傳 true,失敗則回傳 false。
function transfer(address _to, uint256 _value) public returns (bool success)
# transferFrom(從他人處轉帳)
當有被授權的額度時,這個函式就是用來花掉別人的代幣的。
轉帳 _value
數量的代幣,從發送者 _from
,到接收者 _to
。並且觸發 Transfer
事件。
這個函式在授權(approve)第三方合約或帳戶後觸發,便能允許他人動用你的額度。
// 從授權者 _from 發送 _value 數量的代幣給接收者 _to,回傳值為成功與否(bool)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
# approve(授權)
呼叫者授權給花費者 _spender
可動用的額度 _value
。
若被再次呼叫,則新的額度 _value
會直接覆蓋掉舊的額度。
// 函式呼叫者 msg.sender 授權給花費者 _spender 額度 _value,回傳成功與否(bool)
function approve(address _spender, uint256 _value) public returns (bool success)
# allowance(授權的額度)
查詢授權者 _owner
授權給花費者 _spender
的剩餘使用額度。
// 查詢時需給定授權者 _owner 與花費者 _spender,回傳剩餘的額度(uint256)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)
# 事件(Events)
# 轉帳(Transfer)
當代幣發生轉移時,此事件必須被觸發,不論轉移的代幣數量有多少。
當一個代幣合約產生新的代幣時,需要觸發轉帳事件,其中發送者位址(_from
)被設定成(0x0
)
_from
:發送者位址,address
_to
:接收者位址,address
_value
:轉帳的數量,uint256
event Transfer(address indexed _from, address indexed _to, uint256 _value)
# 授權(Approval)
當成功呼叫 approve(address _spender, uint256 _value)
時,必須觸發授權事件。
_owner
:代幣擁有者,address
_spender
:被授權的花費者,address
_value
:被授權的可花費額度,uint256
event Approval(address indexed _owner, address indexed _spender, uint256 _value)