1

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

4

1 回答 1

3

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);
    }
}
于 2021-11-23T09:18:24.393 回答