跳到主要内容

selector

selector

当调用合约中的函数时会传入一段 calldata,其值说明了要调用的函数名以及传入的参数。例如调用 store(10) 时,其 calldata 如下所示

0x6057361d000000000000000000000000000000000000000000000000000000000000000a

前 4 个字节 0x6057361d 为函数选择器,也叫 selector,由 keccak256 计算得到

bytes4(keccak256("store(uint256)")); // 0x6057361d

selector 后面的值为函数参数。

当通过 call 调用时就可以使用 selector 指定方法

(bool success, bytes memory data) = _addr.call{value: msg.value}(
abi.encodeWithSelector(0x6057361d, 88)
);