為什麼LINK使用ERC-677標準發行token
By Chainlink資訊·
等等,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#Chainlink#ERC-677#LINK
免責聲明:
- 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
- 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
- 鏈報僅提供相關項目信息,不構成任何投資建議。
推荐阅读