Solidity v0.8.3 修复了Solidity 优化器 Keccak 缓存错误,该错误存在于所有之前的 Solidity 版本中,此外,还包括对优化器的两项改进,这些改进可以在将结构体写入覆盖完整存储槽的存储时提供很大的燃气节省。
重要的 Bug 修复
Solidity 优化器 Keccak 缓存错误
2021 年 3 月 20 日,通过差分模糊测试发现 Solidity 字节码优化器中存在一个错误。此版本已修复该错误。该错误存在于所有之前的 Solidity 版本中,严重程度为“中等”。要详细了解该错误并检查您的代码是否受其影响,请阅读相应的 安全警报。
值得注意的新功能
优化器改进
此版本包含两个优化器改进,即改进小型类型的存储写入以及用移位运算替换乘法和除以 2 的幂。前者将使写入压缩结构体更有效。在以下示例中,写入结构体将避免从存储中读取,即优化器将能够删除冗余的sload:
struct S { address a; uint96 b; } contract C { S s; function f(uint96 _b) public { s.a = msg.sender; s.b = _b; } }
在 EVM 中,移位运算(shl、shr 和 sar)比算术运算 mul 和 div 更便宜。我们添加了一条优化规则,将乘以和除以 2 的幂转换为 shl 和 shr。除了此简单规则带来的少量燃气节省之外,该规则还与其他移位运算链式连接良好。例如:shl(10, mul(x, 256)) -> shl(10, shl(8, x)) -> shl(18, x)。
完整变更日志
重要的 Bug 修复
- 优化器:修复 Keccak-256 哈希错误缓存。
编译器功能
- 命令行界面:删除对 --machine evm15 的实验性支持。
- 优化器:尝试将 and 与常量移动到 or 中,以改进小型类型的存储写入。
- 优化器:用移位运算替换乘法和除以 2 的幂。
Bug 修复
- AST 导入:对于构造函数,公共可见性在导入期间被忽略。
- 错误报告器:修复回车处理。
- SMTChecker:修复 BMC 在解析分支内的虚拟函数时出现的内部错误。
- SMTChecker:修复 array.pop 嵌套在 1 元组内时出现的内部错误。
- SMTChecker:修复 FixedBytes 常量用字符串文字初始化时出现的内部错误。
- SMTChecker:修复数组切片出现的内部错误。
- SMTChecker:修复在对类型为结构体数组(可能嵌套)的成员变量调用公共 getter 时出现的内部错误。
- SMTChecker:修复将 string 推入强制转换为 bytes 时出现的内部错误。
- SMTChecker:修复构造函数调用的虚拟函数中的错误。
AST 变更
- ModifierInvocation:添加 kind 字段,它可以是 modifierInvocation 或 baseConstructorSpecifier。
衷心感谢所有帮助使本次发布成为可能的贡献者!
从这里下载 Solidity 的新版本 这里。