注意:
- 當要實作一個滿足 ERC-20 接口标準的 Token 智能合約時,該合約必須滿足以下内容實作
- API 規範使用 Solidity 0.4.17(或以上版本)的文法
- 調用者必須處理 returns (bool success) 傳回false , 不能假定false不會傳回。
一、可選函數
- 可選函數: name
函數傳回代币的名稱 - 如 “MyToken” 或 “我的代币”
此函數是可選函數,但是這個函數可以提高代币可用性,不過調用者不能假定這個函數存在。
function name() public view returns (string)
- 可選函數: symbol
函數傳回代币的代号(通常為字母縮寫),如 “HIX”,“UPT”。
此函數是可選函數,但是這個函數可以提高代币可用性,不過調用者不能假定這個函數存在。
function symbol() public view returns (string)
- 可選函數: decimals
傳回令牌使用的小數位數 - 例如"8",意味着将令牌量除以"100000000"以擷取其使用者表示形式。
此函數是可選函數,但是這個函數可以提高代币可用性,不過調用者不能假定這個函數存在。
function decimals() public view returns (uint8)
二、必須函數
函數: totalSupply
傳回總令牌供應量。
function totalSupply() public view returns (uint256)
函數: balanceOf
傳回帳戶(通過參數"_owner")的餘額。
function balanceOf(address _owner) public view returns (uint256 balance)
函數: transfer
向 _to 位址轉移 _value 數量的代币,函數必須觸發事件 Transfer 。
如果調用方的帳戶餘額沒有足夠的令牌,則該函數需要抛出異常。
注意 轉移0個代币也是正常轉移動作,同樣需要觸發 Transfer 事件。
function transfer(address _to, uint256 _value) public returns (bool success)
函數: transferFrom
從 _from 向 _to 位址轉移 _value 數量的代币,函數必須觸發事件 Transfer 。
transferFrom 函數,可以允許第三方代表我們轉移代币。
如果 _from 賬号沒有授權調用帳戶轉移代币,則該函數需要抛出異常。
注意 轉移0個代币也是正常轉移動作,同樣需要觸發 Transfer 事件。
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
函數: approve
授權 _spender 可以從我們賬戶最多轉移代币的數量 _value,可以多次轉移,總量不超過 _value 。
這個函數可以再次調用,以覆寫授權額度 _value 。
注意: 為了阻止向量攻擊(這裡有描述和讨論),調用者可以在調整授權額度時,先設定為0,然後在設定為一個其他額度。
簡單描述下:向量攻擊, 假如 Alice 開始時給Bob授權了 N, 現在 Alice 想調整為 M ,于是發起了一筆調整授權的交易,這時Bob觀察到了這筆交易, 迅速通過 transferFrom 交易(用更高的手續費,礦工優先打包)把 N 個币轉移走,待 Alice 調整授權的交易打包後,Bob 又獲得了 M 個授權。 這就相當于Bob 獲得了 N + M個授權, 而不是 Alice 想要的 M個授權。
function approve(address _spender, uint256 _value) public returns (bool success)
函數: allowance
查詢 _owner 授權給 _spender 的額度。
function allowance(address _owner, address _spender) public view returns (uint256 remaining)
三、事件Events
- 事件:Transfer
當有代币轉移時(包括轉移0),必須觸發 Transfer 事件。
event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)