Solidity
在solidity智能合約中附加.selector的解釋
我試圖理解 .selector 附加到包含在函式定義中的邏輯時的含義。我試圖閱讀soliditydocs中的部分,但它似乎沒有回答我的問題?
從文件:
.selector
返回ABI 函式選擇器。函式呼叫的呼叫數據的前四個字節指定要呼叫的函式。它是函式簽名的 Keccak-256 (SHA-3) 散列的第一個(左,大端高位)四個字節。 簽名被定義為沒有數據位置說明符的基本原型的規範表達式,即帶括號的參數類型列表的函式名稱。參數類型由單個逗號分隔 -不使用空格。
因此,您可以通過將名稱與參數類型進行散列來辨識函式。
例子:
pragma solidity ^0.5.0; contract Contract { MyContract contract1 = new MyContract(); function getSelector() public view returns (bytes4, bytes4) { return (contract1.function1.selector, contract1.getBalance.selector); } function callGetValue(uint _x) public view returns (uint) { bytes4 selector = contract1.getValue.selector; bytes memory data = abi.encodeWithSelector(selector, _x); (bool success, bytes memory returnedData) = address(contract1).staticcall(data); require(success); return abi.decode(returnedData, (uint256)); } } contract MyContract { function function1() public {} function getBalance(address _address) public view returns (uint256){} function getValue (uint _value) public pure returns (uint) { return _value; } }
輸出
getSelector()
:decoded output { "0": "bytes4: 0x29a71964", "1": "bytes4: 0xf8b2cb4f" }
檢查
keccak256
功能:truffle(development)> web3.utils.keccak256("function1()") '0x29a7196481fcfcc8167dc71995324289246256364d7384313ac6b8432377ea3a' truffle(development)> web3.utils.keccak256("getBalance(address)") '0xf8b2cb4f3943230388faeee074f1503714bff212640051caba01411868d14ae3'
但是讓我們看看前四個字節:
0x29a71964 0xf8b2cb4f
您可以驗證是否可以
.selector
直接在 Solidity 中或使用該keccak256
函式獲取函式選擇器。
.selector
使用(參見:ABI 編碼和解碼函式)呼叫函式:在上面的合約中,函式
callGetValue(uint _x)
呼叫函式getValue(uint _value)
使用selector
:如果你傳遞一個值(例如:3),你會得到:
decoded input { "uint256 _x": "3" } decoded output { "0": "uint256: 3" }