如何製作函式簽名?ERC223 合約接收器
嗨,這些線是什麼意思?
function tokenFallback(address _from, uint _value, bytes _data) { ... uint32 u = uint32(_data[3]) + (uint32(_data[2]) << 8) + (uint32(_data[1]) << 16) + (uint32(_data[0]) << 24); tkn.sig = bytes4(u); }
我知道 tkn.sig 是函式的 4 字節簽名。但是有人可以解釋這兩條線是如何工作的嗎?
http://solidity.readthedocs.io/en/develop/types.html#fixed-size-byte-arrays
固定大小的字節數組
bytes1, bytes2, bytes3, …, bytes32。byte 是 bytes1 的別名。
—————-==
http://solidity.readthedocs.io/en/develop/types.html#dynamically-sized-byte-array
動態大小的字節數組字節:動態大小的字節數組,請參閱數組。不是價值類型!
—————-==
http://solidity.readthedocs.io/en/develop/types.html#arrays
字節和字元串類型的變數是特殊的數組。一個字節類似於字節
$$ $$,但它緊緊地包裝在 calldata 中。string 等於 bytes 但不允許長度或索引訪問(目前)。所以字節應該總是優先於字節$$ $$因為它更便宜。
—————-==
所以參數 bytes _data 的意思是:_data 是一個動態大小的字節數組,每個元素的類型都是 byte1
_data$$ 3 $$, _數據$$ 2 $$, _數據$$ 1 $$, _數據$$ 0 $$是 _data 的前 4 個元素uint32(_data$$ 3 $$) 是轉換_data$$ 3 $$轉換成多個 uint32
—————-==
http://solidity.readthedocs.io/en/develop/types.html#integers
** (exponentiation), << (左移), >> (右移)
表達式 x << y 等價於 x * 2y, x >> y 等價於 x / 2y
——— ——-==
所以 uint32(_data$$ 2 $$) << 8 等價於 uint32(_data$$ 2 $$) * 2**8與 _data 相同$$ 1 $$和_data$$ 0 $$
然後將它們加在一起以製作 uint32 u
然後通過 bytes4(u) 將 u 轉換為 bytes4
哇,這很複雜……我希望我沒有犯任何錯誤:)
tokenFallback
接收第三個參數 ,_data
它可以是任意數據。契約如何解釋它在很大程度上是特定於契約的。您粘貼的程式碼似乎只是將前四個字節_data
轉換為 abytes4
以儲存在tkn.sig
. 如果沒有看到其餘的程式碼,我無法推測為什麼。(例如,看看如何tkn
使用會很有趣。)編輯
看起來程式碼來自https://github.com/Dexaran/ERC223-token-standard/blob/Recommended/Receiver_Interface.sol#L17。該功能的其餘部分,包括評論,是有啟發性的:
function tokenFallback(address _from, uint _value, bytes _data){ TKN memory tkn; tkn.sender = _from; tkn.value = _value; tkn.data = _data; uint32 u = uint32(_data[3]) + (uint32(_data[2]) << 8) + (uint32(_data[1]) << 16) + (uint32(_data[0]) << 24); tkn.sig = bytes4(u); /* tkn variable is analogue of msg variable of Ether transaction * tkn.sender is person who initiated this token transaction (analogue of msg.sender) * tkn.value the number of tokens that were sent (analogue of msg.value) * tkn.data is data of token transaction (analogue of msg.data) * tkn.sig is 4 bytes signature of function * if data of token transaction is a function execution */ }
我推測
_data
這裡被視為非令牌場景,其中前四個字節是函式選擇器(函式簽名的 keccak256 散列的前四個字節)。大概這是為了讓令牌接收者可以呼叫一個函式來處理入站令牌,就像payable
處理入站事務的函式一樣。