Abi

什麼是功能選擇器?

  • November 24, 2021

我正在閱讀一篇文章,它說:

為了在乙太坊平台上進行部署,合約函式被編譯成 EVM 字節碼,並添加了一段稱為函式選擇器的程式碼,作為合約程式碼的入口點。

有人可以告訴我什麼是功能選擇器嗎?

我嘗試了Google並發現:

函式呼叫的呼叫數據的前四個字節指定要呼叫的函式。它是函式簽名的 Keccak-256 (SHA-3) 散列的第一個(左,大端高位)四個字節。簽名被定義為沒有數據位置說明符的基本原型的規範表達式,即帶括號的參數類型列表的函式名稱。參數類型由單個逗號分隔 - 不使用空格。

我不明白什麼是呼叫數據?

一些身體請指導我。

祖爾菲。

函式選擇器允許您根據函式名稱和每個輸入參數的類型執行函式的動態呼叫。

例如,假設您有:

contract Contract1 {
   function func(uint256 x, uint8 y) public returns (uint32, uint32) {...}
}

contract Contract2 {
   Contract1 public contract1 = new Contract1();
   function func() public returns (uint32, uint32) {...}
}

然後您可以按以下方式呼叫Contract1.funcContract2.func

function func() public returns (uint32, uint32) {
   uint32[2] memory ret;

   address dest = address(contract1);

   bytes4 selector = contract1.func.selector;
   // Or bytes4 selector = bytes4(uint256(keccak256("func(uint256,uint8)") >> 224));

   bytes memory data = abi.encodeWithSelector(selector, uint256(789), uint8(123));

   assembly {
       let success := call(
           gas,           // pass the remaining gas to the function
           dest,          // the address of the contract1 instance
           0,             // pass 0 wei to the function
           add(data, 32), // the actual data starts after the length of 'data'
           mload(data),   // the length of 'data' appears at the first 32 bytes
           ret,           // the address of the output
           8              // the size of the output
       )
       if iszero(success) {
           revert(0, 0)
       }
   }

   return (ret[0], ret[1]);
}

如果呼叫的函式是常量(pure或者view),那麼您也可以使用staticcall.

上面的例子是在彙編中,但你也可以call直接在solidity中使用。

我認為這staticcall應該從solidity v0.5.0開始可用。

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