Solidity 0.8+ 版本中是否需要 SafeMath ,如果不需要,是否还可以导入它?

msa*_*720 5 ethereum solidity smartcontracts evm

我有这样的 Solidity 智能合约,pragma solidity >=0.7.0 <0.9.0;即使 0.8+ 不需要它,我仍然可以导入 SafeMath 吗?由于 SafeMath 使用的是 0.7,但我的合同指定它接受 0.7.0 至低于 0.9.0,在这种情况下 SafeMath 会做什么。

Pet*_*jda 21

SafeMath 库验证算术运算是否会导致整数上溢/下溢。如果是这样,库会抛出异常,从而有效地恢复事务。

从 Solidity 0.8 开始,上溢/下溢检查是在语言级别实现的 - 它在编译期间向字节码添加了验证。

Solidity 0.8+ 不需要 SafeMath 库。您仍然可以在此版本中自由使用它,它只会执行两次相同的验证(一次在语言级别,一次在库中)。

强烈建议在0.7版本中使用它,因为该版本尚未在语言级别上进行验证。


因此,如果您允许在两个版本中编译合约,则应该包含该库。

pragma solidity >=0.7.0 <0.9.0;

library SafeMath {
  function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
    c = a + b;
    assert(c >= a);
    return c;
  }
}

contract MyContract {
    using SafeMath for uint256;
    
    function foo() external pure {
        uint256 number = 1;
        number.add(1);
    }
}
Run Code Online (Sandbox Code Playgroud)