使用Truffle调用Solidity函数时触发new BigNumber()错误,如何解决?
解决Truffle调用Solidity函数时的new BigNumber()错误
嘿,我之前也踩过这个BigNumber的坑,这个错误大概率和数值类型不匹配或者处理方式不对有关,咱们一步步来排查解决:
常见触发原因&对应解法
1. 参数传递时的数值超出JS安全范围
JS的普通数字只能精确表示到2^53-1,如果你的Solidity函数接收的是uint256/int256这类大数值类型,直接传JS数字就会触发BigNumber错误。
解决办法:用Web3提供的工具把数值转成BigNumber实例再传递:
// 错误示例:直接传超大数字 await contract.returnNumber(12345678901234567890123); // 正确示例:转成BigNumber(适配Truffle常用的Web3 v1.x) const targetNum = web3.utils.toBN("12345678901234567890123"); await contract.returnNumber(targetNum);
2. 返回值处理时强行转普通数字
Solidity的数值类型返回后,Truffle会自动封装成BigNumber实例。如果直接用Number()把它转成JS普通数字,大数值会丢失精度,进而触发错误。
解决办法:用BigNumber的原生方法处理返回值:
// 错误示例:强行转普通数字 const result = await contract.returnNumber(); const wrongNum = Number(result); // 正确示例:转字符串或用BigNumber运算 const result = await contract.returnNumber(); // 转成可读字符串 const numStr = result.toString(); // 做数值运算(用BigNumber的方法) const doubledResult = result.mul(web3.utils.toBN(2));
3. Truffle/Web3版本不兼容
不同版本的Truffle搭配的Web3版本不同,BigNumber的API也有差异:
- Truffle v4 搭配 Web3 v0.2x:用
web3.toBigNumber() - Truffle v5+ 搭配 Web3 v1.x:用
web3.utils.toBN()
如果混用API,就会出现new BigNumber()相关错误,先确认你的Truffle版本,再用对应方法。
4. Solidity函数返回类型异常
如果你的returnNumber()返回的不是标准数值类型(比如自定义结构体、动态数组),或者返回值格式不符合预期,也可能导致解析时触发BigNumber错误。
解决办法:先检查Solidity函数定义,确保返回的是明确的数值类型,比如:
// 正确示例:返回标准uint256 function returnNumber() public pure returns (uint256) { return 12345678901234567890123; }
如果之前的解决方案都无效,建议把你的Solidity函数完整代码和具体的Truffle调用代码贴出来,这样能更精准定位问题(比如是不是调用时用了错误的方法,比如send()代替call()?)
内容的提问来源于stack exchange,提问作者Pramesh Bajracharya
相关产品推荐
相关产品推荐

