当JS将数值作为参数传递给Solidity函数时,为什么用引号括起来更好



我在Solidity:中定义了一个函数

function store(uint256 _favoriteNumber) public {}

然后在JavaScript:中调用参数为7的函数

contract.store(7);

但是,根据Patrick Collins JS的视频,最好用这样的引号来包装数字7

contract.sotre("7");

所以有两件事让我困惑:

  1. 为什么在将数字传递给solidity contract函数时最好用引号包裹数字
  2. 为什么ehter.js可以自动将字符串转换为数字

Javascript支持比Solidity更小的数字集。具体地说,JS中的最大安全值是2^53-1,而Solidity中的最大数值是2^256

因此,例如,如果您要传输1个带有18位小数的令牌,则需要传递给Solidity合约的十进制值为1000000000000000000,它介于2^592^60之间,已经高于2^53 - 1的最大安全JS整数。

因此,ethers.js和其他js智能合约库接受数字值作为本地js字符串或名为BigNumber的辅助库实例,但不接受整数。

注意:某些版本中的某些库最初可能能够将本机整数转换为字符串或BigNumber。但一般来说,传递非整数值总是更安全的。

相关内容

  • 没有找到相关文章

最新更新