為什麼LINK使用ERC-677標準發行token

買賣虛擬貨幣
等等,LINK不是ERC20嗎,怎麼又成了ERC677了?別急,我們先從ERC20開始說起。ERC20是一套協議標準,程式碼角度來說就是一套介面API。在這個協議標準下,只要實現了協議標準所規定的方法,都可以作為ERC20代幣的實現。協議規定必須實現的方法有:// 1. 代幣發行總量function totalSupply() public view returns (uint256)// 2. _owner賬戶的代幣餘額
function balanceOf(address _owner) public view returns (uint256 balance)// 3. 轉移_value數量的代幣到_to地址function transfer(address _to, uint256 _value) public returns (bool success)// 4. 從_address地址轉移_value數量的代幣到_to地址function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)// 5. 允許_spender可以提取總額為_value數量的代幣,提取不限次數
function approve(address _spender, uint256 _value) public returns (bool success)// 6. 返回_spender還可以從_owner提取的代幣數量function allowance(address _owner, address _spender) public view returns (uint256 remaining)除了這幾個方法,ERC20還規定了兩個事件:// 當成功轉移token時,觸發Transfer事件,記錄轉賬的傳送方、接收方和轉賬金額event Transfer(address indexed _from, address indexed _to, uint256 _value)
// 當呼叫approval函式成功時,觸發Approval事件,記錄批准的所有方、獲取方和批准金額event Approval(address indexed _owner, address indexed _spender, uint256 _value)以上基本上就是ERC20代幣的全部內容了。由於LINK代幣不僅僅是代幣,還承擔了鏈上與鏈下資料傳遞的功能,所以如果使用ERC20代幣的標準無法滿足這個需求,於是LINK選擇了ERC677協議標準來實現。ERC677標準是ERC20的一個擴充套件,它繼承了ERC20的所有方法和事件,由Chainlink的CTO Steve Ellis首次提出。ERC677除了包含了ERC20的所有方法和事件之外,增加了一個transferAndCall 方法:function transferAndCall(address receiver, uint amount, bytes data) returns (bool success)可以看到,這個方法比ERC20中的transfer方法多了一個data欄位,這個欄位用於在轉賬的同時,攜帶使用者自定義的資料。在方法呼叫的時候,還會觸發Transfer(address,address,uint256,bytes) 事件,記錄下傳送方、接收方、轉賬金額以及附帶資料。完成轉賬和記錄日誌之後,代幣合約還會呼叫接收合約的onTokenTransfer方法,用來觸發接收合約的邏輯。這就要就接收ERC677代幣的合約必須實現onTokenTransfer方法,用來給代幣合約呼叫。onTokenTransfer方法定義如下:
function onTokenTransfer(address from, uint256 amount, bytes data) returns (bool success)接收合約就可以在這個方法中定義自己的業務邏輯,可以在發生轉賬的時候自動觸發。換句話說,智慧合約中的業務邏輯,可以透過代幣轉賬的方式來觸發自動執行。這就給了智慧合約的應用場景有了很大的想象空間。比如LINK的token合約就是一個ERC677合約,而Chainlink的Oracle合約,是一個可以接收ERC677的合約,它含有onTokenTransfer方法,可以在收到LINK的轉賬的時候執行預言機相關的業務邏輯。LINK token contract:... /**  * @dev 轉移token到合約地址,並攜帶額外資料
  * @param _to 轉到的地址  * @param _value 轉賬金額  * @param _data 傳遞給接受合約的額外資料  */  function transferAndCall(address _to, uint _value, bytes _data)    public
    returns (bool success)  {    super.transfer(_to, _value);    Transfer(msg.sender, _to, _value, _data);    if (isContract(_to)) {      contractFallback(_to, _value, _data);
    }    return true;  }...Oracle 合約:...
 /**   * @notice 在LINK透過`transferAndCall`方法傳送到合約時被呼叫   * @dev 負載資料的前兩個位元組會被`_sender`和 `_amount`的值覆蓋來保證正確性。並會呼叫oracleRequest方法   * @param _sender 傳送方地址   * @param _amount 傳送的LINK數量(單位是wei)   * @param _data 交易的負載資料
   */  function onTokenTransfer(    address _sender,    uint256 _amount,    bytes _data  )
    public    onlyLINK    validRequestLength(_data)    permittedFunctionsForLINK(_data)  {    assembly {
      // solium-disable-next-line security/no-low-level-calls      mstore(add(_data, 36), _sender) // ensure correct sender is passed      // solium-disable-next-line security/no-low-level-calls      mstore(add(_data, 68), _amount)    // ensure correct amount is passed    }    // solium-disable-next-line security/no-low-level-calls
    require(address(this).delegatecall(_data), "Unable to create request"); // calls oracleRequest  }...總結:LINK代幣合約是ERC677合約,它是ERC20合約的一個擴充套件,相容ERC20協議標準。它可以在轉賬時攜帶資料,並觸發接收合約的業務邏輯,這一特點可以幫助智慧合約擴大應用場景。參考:
https://eips.ethereum.org/EIPS/eip-20http://blockchainers.org/index.php/2018/02/08/token-erc-comparison-for-fungible-tokens/https://github.com/ethereum/EIPs/issues/677https://etherscan.io/address/0x514910771af9ca656af840dff83e8264ecf986ca#codehttps://etherscan.io/address/0x64fe692be4b42f4ac9d4617ab824e088350c11c2#code

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;