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
相关产品推荐
相关产品推荐

