由以太坊代幣(Token)的標準 — ERC20 Token來介紹代幣的撰寫及使用方式,和其周邊的附加功能。

原文:https://medium.com/taipei-ethereum-meetup/erc20-token%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8A-3d7871c58bea

ERC20

ERC20 Token的EIP約在兩年前就已經提出,經過歷時長久的社群討論,在九月的時候確定了最終版本。

以下是一個標準的ERC20合約所需要具備的函式及行為:

代幣的全名

function name() constant returns (string name)
回傳代幣的全名,例如 OutrichTrumpICOToken。注意,此函式目的為增加可讀性,非必要,使用者或合約請勿指望此函式一定會有回傳值。

代幣的縮寫

function symbol() constant returns (string symbol)
回傳代幣的縮寫,例如 OTICO,縮寫並無規定一定要為三個字元。同樣請勿指望此函式一定會有回傳值。

代幣的最小單位

function decimals() constant returns (uint8 decimals)
回傳使用者看到的最小單位,為一個數值,表示此代幣最多可細分到小數點後幾位數。例如假設數值為3,表示最後使用者看到的擁有代幣數量會是像這樣123.456。看代幣的用途,對應到現實世界中或現有的資產各會有不同的最小單位。沒特別需求可對應到以太幣的單位,設為18。同樣請勿指望此函式一定會有回傳值。

代幣的總量

function totalSupply() constant returns (uint256 totalSupply)
回傳代幣的發行總量。

查詢某帳戶的代幣餘額

function balanceOf(address _owner) constant returns (uint256 balance)
參數為欲查詢的帳戶地址,回傳值為一正整數。注意,代幣餘額皆會是正整數,要搭配 decimals函式來顯示單位給使用者。

移轉代幣給他人

function transfer(address _to, uint256 _value) returns (bool success)
參數1為接收代幣的地址,參數2為數量,回傳值為布林值 — 1表示成功,0表示失敗。

  1. 若成功移轉代幣,則一定要觸發Transfer event(見下一點)。如果送出代幣者的餘額不足,則應該要觸發throw,復原一切更動。
  2. 若是因為產生新代幣而呼叫此函式,則應該要將Transfer事件的_from設為0x0,表示為新產生的代幣。
  3. 若移轉代幣數量為零,仍視為正常的代幣移轉並照常觸發Transfer事件。

移轉代幣觸發事件

event Transfer(address indexed _from, address indexed _to, uint256 _value)
參數1為送出代幣的地址,參數2為接受代幣的地址,參數3為代幣的數量。

從A移轉代幣給B

function transferFrom(address _from, address _to, uint256 _value) returns (bool success)
參數1為送出代幣的地址,參數2為接受代幣的地址,參數3為數量。回傳值為布林值 — 1表示成功,0表示失敗。

  1. 如果沒有送出代幣者的授權(見下一點)或餘額不足,則應該要觸發throw,復原一切更動。若成功移轉代幣,則一定要觸發Transfer event。
  2. 若移轉代幣數量為零,仍視為正常的代幣移轉並照常觸發Transfer事件。

批准自己的代幣移轉

function approve(address _spender, uint256 _value) returns (bool success)
參數1為可以領走自己代幣的對象的地址,參數2為數量,回傳值為布林值 — 1表示成功,0表示失敗。透過呼叫這個函式來批准某對象可以藉由transferFrom函式領走自己最多_value數量的代幣。

  1. _value是自訂的,可以設為超過自己的餘額的值。
  2. 批准並不代表將代幣鎖住直到對方領走為止,使用者仍可在對方領走之前先領走代幣,這樣對方在呼叫函式時會因為餘額不足而失敗。若成功批准,則一定要觸發Approval事件。
  3. 為了避免Front Running而導致Double Spend的攻擊,使用者在更改一個批准的數量時,應該要先送出一個數量為零的批准再進行正常的批准。

A批准給B的代幣數量(必要)

function allowance(address _owner, address _spender) constant returns (uint256 remaining)
參數1為代幣擁有者的地址,參數2為可以領走代幣的地址,回傳值為一正整數。

代幣批准觸發事件(必要)

event Approval(address indexed _owner, address indexed _spender, uint256 _value)
參數1為代幣擁有者的地址,參數2為可以領走代幣的地址,參數3為代幣的數量。
transferFrom及approve兩個函式為一個組合,目的是提供用領取的方式來轉移代幣(相對於使用送出方式的transfer)。會使用領取模式是因為如果代幣接收方是一個合約,則在發生transfer時合約不會收到通知,即合約沒辦法知道代幣轉到它身上。

也因為這個原因,讓某些應用場景無法實現。例如一個合約C的某個功能需要收取某代幣才能執行,如果合約沒辦法知道transfer到底發生了沒,就沒辦法知道代幣是否成功移轉給它,也就沒辦法繼續執行它的功能。如果改用領取模式 — 使用者在使用合約C的功能前先批准一定量的代幣給C,合約C執行的時候用transferFrom領取代幣 ,領取成功就繼續執行它的功能,否則退出執行 — 這讓合約接受代幣做為報酬的方式得以實現。

标签: ethereum, contract, erc20

评论已关闭