# 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)。

要留意的是,當 _value0 時,也是個合法的轉帳,只是他轉了個寂寞。

// 從 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)
Last Updated: 2023/1/12 上午6:20:49