1、调用函数,传数值类型的参数,报 overflow
truffle 版本
Truffle v5.6.8
Ganache V7.5.0
Solidity V0.5.16 (solc-js)
web3.js v1.7.4
这里简单写一个智能合约,作为演示。
Example.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.5.16;
contract Example {
uint public a;
function setA(uint _a) public {
a = _a;
}
function getA() public view returns(uint) {
return a;
}
}
使用 truffle 部署合约:
truffle migrate
进入 控制台,调用函数
truffle console
amt_1 = web3.utils.toWei('1', 'ether');
// 不报错
Example.deployed().then(ins => ins.setA(amt_1).then(console.log))
//报错
Example.deployed().then(ins => ins.setA(2*amt_1).then(console.log))
报错详情:
Uncaught:
Error: overflow [ See: https://links.ethers.org/v5-errors-NUMERIC_FAULT-overflow ] (fault="overflow", operation="BigNumber.from", value=2000000000000000000, code=NUMERIC_FAULT, version=bignumber/5.6.2)
原因:
2*amt_1 在 js 中会进行隐式转换。导致数值超过 js的 Number.MAX_SAFE_INTEGER。所以报 overflow
解决办法:
函数调用时,将参数按照
字符串
进行传参。
比如上面的例子:
amt_2 = web3.utils.toWei(‘2’, ‘ether’);
Example.deployed().then(ins => ins.setA(amt_2).then(console.log))