智能合约编译正常但调用house时报BigNumber字符串无效错误如何解决
错误原因排查
- 调用
public数组的方式错误。Solidity会自动为public修饰的数组生成带索引参数的getter方法,你需要传入要查询的元素下标才能拿到对应值,比如调用house(0)才能拿到数组第一个元素1。如果直接调用house()不传参数,接口会返回空值,前端尝试把空字符串转为BigNumber类型时就会抛出你遇到的报错。 - 合约内
sugMa函数存在越界逻辑导致调用回滚。你写的循环条件为i <= house.length,当前house数组长度为10,数组的有效索引范围是0~9,当循环执行到i=10时就触发了越界访问。Solidity 0.8及以上版本默认开启越界检查,触发后会直接回滚调用返回空值,同样会导致前端转BigNumber失败。
修复方案
- 调用
house数组时传入合法的索引参数(0~9之间的整数)即可拿到对应值。 - 调整
sugMa函数的循环条件,将i <= house.length修改为i < house.length,修复后的完整代码如下:
pragma solidity ^0.8.4; contract Test { uint[] public house = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; function sugMa() public view returns (uint) { uint even = 0; for (uint i = 0; i < house.length; i++) { if (i % 2 == 0) { even += 1; } } return even; } }
内容的提问来源于stack exchange,提问作者jjreedv
相关产品推荐
相关产品推荐

