33 Function Selector
関数が呼ばれるときに、calldata の一番最初の 4 bytes がどの関数を呼ばれるかを決める。この 4 bytes は関数のセレクタと呼ばれたりする。
例えば、以下の関数はとあるコントラクトアドレス addr
にある transfer
関数を呼ぶためのもの。
addr.call(abi.encodeWithSignature("transfer(address,uint256)", 0xSomeAddress, 123))
最初の 4 bytes がabi.encodeWithSignature(...)
から返り値として得られて、これが関数セレクタになる。
もしこのセレクタの計算をあなたのローカルで実施すれば、多少ガス代の節約できるのではと思う。
次に、セレクタの計算方法を示す。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract FunctionSelector {
/*
"transfer(address,uint256)"
0xa9059cbb
"transferFrom(address,address,uint256)"
0x23b872dd
*/
function getSelector(string calldata _func) external pure returns (bytes4) {
return bytes4(keccak256(bytes(_func)));
}
}
Remixで試す