我在Solidity:中定义了一个函数
function store(uint256 _favoriteNumber) public {}
然后在JavaScript:中调用参数为7
的函数
contract.store(7);
但是,根据Patrick Collins JS的视频,最好用这样的引号来包装数字7
:
contract.sotre("7");
所以有两件事让我困惑:
- 为什么在将数字传递给solidity contract函数时最好用引号包裹数字
- 为什么ehter.js可以自动将字符串转换为数字
Javascript支持比Solidity更小的数字集。具体地说,JS中的最大安全值是2^53-1,而Solidity中的最大数值是2^256
。
因此,例如,如果您要传输1个带有18位小数的令牌,则需要传递给Solidity合约的十进制值为1000000000000000000
,它介于2^59
和2^60
之间,已经高于2^53 - 1
的最大安全JS整数。
因此,ethers.js和其他js智能合约库接受数字值作为本地js字符串或名为BigNumber的辅助库实例,但不接受整数。
注意:某些版本中的某些库最初可能能够将本机整数转换为字符串或BigNumber。但一般来说,传递非整数值总是更安全的。