52-Solidity8.0-函数签名

876 阅读1分钟

功能选择器

调用函数时,前 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)));
    }
}