Solidity

來自 ERC223 標準實現的程式碼如何工作?

  • January 10, 2018

這是來自ERC223-token-standard的程式碼片段。

function transfer(address _to, uint _value, bytes _data) {
   // Standard function transfer similar to ERC20 transfer with no _data .
   // Added due to backwards compatibility reasons .
   uint codeLength;

   assembly {
       // Retrieve the size of the code on target address, this needs assembly .
       codeLength := extcodesize(_to)
   }

   balances[msg.sender] = balances[msg.sender].sub(_value);
   balances[_to] = balances[_to].add(_value);
   if(codeLength>0) {
       ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
       receiver.tokenFallback(msg.sender, _value, _data);
   }
   Transfer(msg.sender, _to, _value, _data);
}

我不明白的是這兩行是如何工作的:

ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
receiver.tokenFallback(msg.sender, _value, _data);

這裡沒有創建新實例,但我們仍在呼叫該函式。我們怎麼能這樣呼叫合約函式呢?ERC223RecievingContract 中沒有構造,但這里地址已傳遞。這裡到底發生了什麼?

任何想要與 ERC223 代幣互動的智能合約都應該實現tokenFallback()處理傳入代幣轉移的功能。

這兩行在目標賬戶(如果它是智能合約)上呼叫該函式,因此,目標智能合約必須先前已實現 tokenFallback() 函式。

從範例實現中可以看出,tokenFallback() 函式可用於檢索由 transfer() 呼叫發送的所有數據,並在接收者合約中隨意使用它:

https://github.com/Dexaran/ERC223-token-standard/blob/Recommended/Receiver_Interface.sol

它與 Ether 的備份功能相同。

來自文件:

ERC223 代幣應該通過呼叫代幣合約上的 transfer 函式來發送,接收者是合約還是錢包地址沒有區別。如果接收方是錢包,ERC223 代幣轉賬將與 ERC20 轉賬相同。如果接收方是合約 ERC223 代幣合約將嘗試在接收方合約上呼叫 tokenFallback 函式。如果接收者合約沒有 tokenFallback 功能,交易將失敗。tokenFallback 功能類似於 Ether 交易的回退功能。它可用於處理傳入交易。

這可能不是那麼清楚,但它需要以下內容:

ERC223 代幣應通過發送轉賬使用。如果收件人是錢包,則不會有問題。如果接收方是合約,則 transfer 將嘗試呼叫 tokenFallback 函式。如果不存在 tokenFallback,則事務將失敗。

但是,您可以選擇實施 tokenFallback 來處理傳入合約的代幣交易。以下範例將拒絕所有傳入的代幣交易,除了由眾籌發行的代幣交易,它將添加回可用的眾籌餘額。

 function tokenFallback(address, uint _value, bytes)
     isToken
     public {
     _available = _available.add(_value);
 }

正如 Pabloruiz55 之前所說,它也可用於獲取交易資訊:msg.sender、msg.value 和 msg.data 如果您選擇實現 tokenFallback 函式,您也可以將這些值一起發送,因為它們作為函式參數傳入.

引用自:https://ethereum.stackexchange.com/questions/34452