欢迎订阅专栏:3分钟Solidity--Web3区块链技术必学
如需获取本内容的最新版本,请参见 Cyfrin.io 上的函数选择器(代码示例)
当函数被调用时,调用数据的前4个字节用于指定要调用的函数。
这4个字节被称为函数选择器。
以以下代码为例,它使用call在地址为addr的合约上执行transfer函数。
addr.call(abi.encodeWithSignature("transfer(address,uint256)", 0xSomeAddress, 123))
从 abi.encodeWithSignature(....) 返回的前 4 个字节是函数选择器。
如果你预先计算并在代码中内联函数选择器,或许可以节省少量 gas?
以下是函数选择器的计算方式。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
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 Lite 尝试一下
END