Solidity

函式“abi.encodeWithSelector(bytes4 selector, …) returns (bytes memory)”到底是做什麼的?

  • October 5, 2020

我嘗試根據我的智能合約編輯此功能,但我無法理解此功能。我已經閱讀了文件。有人可以用更多細節和例子向我解釋一下嗎?謝謝你。

函式選擇器是函式原型散列中的前 4 個字節。

函式原型按順序定義為函式的名稱及其參數類型。

例如,它允許您在不知道其確切返回值類型的情況下呼叫函式:

bytes4 private constant FUNC_SELECTOR = bytes4(keccak256("someFunc(address,uint256)"));

function func(address _contract, address _param1, uint256 _param2) view returns (uint256, uint256) {
   bytes memory data = abi.encodeWithSelector(FUNC_SELECTOR, _param1, _param2);
   (bool success, bytes memory returnData) = address(_contract).staticcall(data);
   if (success) {
       if (returnData.length == 64)
           return abi.decode(returnData, (uint256, uint256));
       if (returnData.length == 32)
           return (abi.decode(returnData, (uint256)), 0);
   }
   return (0, 0);
}

更一般地說,它允許您通過字元串名稱呼叫函式(類似於Java 中的反射)。

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