You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何手动计算的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:50:38