Solidity 0.8+是否需要SafeMath?多版本兼容合约能否导入?
Solidity 多版本兼容场景下 SafeMath 导入问题解答
是否可以导入 SafeMath
可以正常导入,只要你使用的 SafeMath 版本本身适配 >=0.7.0 <0.9.0 的编译范围即可(比如 OpenZeppelin v3、v4 版本的 SafeMath 均符合该版本要求),导入后不会触发编译报错,合约可正常编译、部署、运行。
不同编译版本下的 SafeMath 表现
编译版本为 0.7.x 时
0.7.x 版本默认没有内置算术溢出校验,此时 SafeMath 功能完全生效:
- 调用 SafeMath 提供的
add/sub/mul/div等算术方法时,会主动执行溢出校验,触发溢出条件时交易直接 revert - 不使用 SafeMath 方法、直接使用原生算术运算符时,溢出会静默截断,不会抛出任何错误
编译版本为 0.8.x 时
0.8.x 及以上版本默认内置了算术溢出校验,原生运算符溢出时会自动 revert,此时导入 SafeMath 不会出错,但会出现校验冗余:
- 调用 SafeMath 方法时,会先后执行 SafeMath 自带的溢出校验、Solidity 内置的溢出校验两层校验,功能表现和 0.7.x 版本下完全一致,但会产生额外的 gas 消耗
- 若使用
unchecked关键字包裹代码块关闭内置校验,此时 SafeMath 的表现和 0.7.x 版本完全一致
内容的提问来源于stack exchange,提问作者msa720
相关产品推荐
相关产品推荐

