为何手动计算的Solidity函数选择器与合约内置选择器不一致?
问题原因分析
函数选择器的核心计算规则是:对函数签名(格式为函数名(参数类型列表),无多余关键字、参数名、修饰符)做keccak256哈希,取前4字节。你的三种结果不一致,问题出在签名格式错误:
- 第一种手动计算用了
"function foo2(uint b) external",包含了function关键字、参数名b、external修饰符,完全不符合函数签名的规范,属于无效输入。 - 第二种
abi.encodeWithSignature("foo2(uint)")里的uint是Solidity的简写类型,函数签名要求用完整的类型名uint256,简写会导致签名不匹配。 - 第三种
Token2.foo2.selector是Solidity编译器自动生成的,它使用的是正确的函数签名foo2(uint256),所以计算结果准确。
修正后的正确计算方式
- 手动计算:
bytes4(keccak256(bytes("foo2(uint256)"))),结果会和Token2.foo2.selector一致,为0x7d5f3b35。 - 使用
abi.encodeWithSignature:abi.encodeWithSignature("foo2(uint256)"),同样会得到0x7d5f3b35。
内容的提问来源于stack exchange,提问作者user3102158
相关产品推荐
相关产品推荐

