3分钟Solidity: 5.6 函数选择器

35 阅读1分钟

欢迎订阅专栏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 尝试一下

solidity-function_selector


END