功能选择器
调用函数时,前 4 个字节calldata
指定调用哪个函数。
这 4 个字节称为函数选择器。
例如,下面的这段代码。它用于在地址上call
执行transfer
合约addr
:
addr.call(abi.encodeWithSignature("transfer(address,uint256)", 0xSomeAddress, 123))
返回的前 4 个字节abi.encodeWithSignature(....)
是函数选择器;
如果您在代码中预先计算并内联函数选择器,也许可以减少一些gas;
以下是函数签名的计算方式。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;
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)));
}
}