Solidity

在solidity智能合約中附加.selector的解釋

  • October 11, 2021

我試圖理解 .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"
}

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