來自 ERC223 標準實現的程式碼如何工作?
這是來自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 函式,您也可以將這些值一起發送,因為它們作為函式參數傳入.