读取Solidity合约public数组people报invalid BigNumber错误如何解决
报错根因
call to SimpleStorage.people errored: Error encoding arguments: Error: invalid BigNumber string
这个报错是调用public数组自动生成的getter方法时未传参导致的:
- Solidity 为
public修饰的动态数组自动生成的查询方法,必须传入uint256类型的数组下标作为入参,才能返回对应位置的结构体数据 - 调用时未填写任何参数,入参值为空字符串,工具底层的bignumber库尝试将空字符串转换为uint256对应的数值类型,匹配失败抛出错误。
解决方案
- 单条查询:如果要读取数组第N个元素,调用
people方法时传入合法的非负整数下标即可,数组下标从0开始计数。比如你已经调用addPerson添加了3条数据,可传入0、1、2分别读取对应位置的用户数据。如果使用Remix测试,直接在people按钮旁的输入框填入下标后再点击查询即可,不要空输入框直接调用。 - 批量查询:如果需要一次性获取整个
people数组的所有数据,需要手动在合约中新增批量查询方法,原生public数组不会自动生成返回全量数组的接口,示例代码如下:
function getAllPeople() public view returns(People[] memory) { return people; }
- 长度校验:可额外新增数组长度查询方法,避免传入的下标超过数组最大长度导致调用失败:
function getPeopleLength() public view returns(uint256) { return people.length; }
内容的提问来源于stack exchange,提问作者Xaarth
相关产品推荐
相关产品推荐

