Solidity

如何製作函式簽名?ERC223 合約接收器

  • January 13, 2018

嗨,這些線是什麼意思?

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]) &lt;&lt; 8) + (uint32(_data[1]) &lt;&lt; 16) + (uint32(_data[0]) &lt;&lt; 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處理入站事務的函式一樣。

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