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

Solidity中call函数调用目标函数却触发fallback函数的问题

问题解决:call调用合约函数触发fallback而非目标函数bar

问题根源在于函数签名的参数类型不匹配。Solidity中uint是uint256的别名,但在ABI编码的函数签名里必须使用完整的类型名称uint256,不能用缩写uint。

修正后的代码

将do4函数中的abi.encodeWithSignature参数修改为完整类型即可正常触发bar函数:

function do4() external {
    (bool ok, bytes memory b) = address(receiver).call(abi.encodeWithSignature("bar(string,uint256)", "hello", 3));
    emit DoLog(msg.sender, ok, b);
}

原因说明

  • 使用abi.encodeWithSignature生成函数选择器时,必须严格遵循Solidity的ABI规范,整数类型需写完整位数(如uint256、uint128),不能用uint这类简写。
  • 之前用uint生成的函数选择器与bar函数实际的选择器不匹配,合约无法识别目标函数,因此触发了fallback函数。
  • 直接调用receiver.bar(...)时,编译器会自动处理正确的ABI编码,所以能正常执行目标函数。

内容的提问来源于stack exchange,提问作者frontgo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:09:59