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)
);