Solidity v0.8.4 添加了自定义结构化错误,bytes.concat(...),允许更灵活地配置 SMT 检查器,并修复了 Solidity ABI 解码器 v2 中的一个错误。
重要的错误修复
2021年4月5日,Certora 开发团队的 John Toman 报告了 Solidity ABI 解码器 v2 中的一个错误。对于二维数组和内存中特别设计的的数据,abi.decode 的结果可能取决于内存中其他位置的数据。调用数据解码不受影响。此错误存在于所有先前版本的 ABI 解码器 v2 中,并且被分配了“非常低”的严重级别。有关错误的全部详细信息以及哪些人应该关注,请阅读相应的安全警报.
值得注意的新功能
自定义错误
现在可以在合约内部和外部定义错误(包括接口和库)。这提供了一种便捷且节省 gas 的方法来向用户解释操作失败的原因。有关自定义错误的更多详细信息,请阅读此 说明文章。
SMTChecker
我们开始弃用 pragma experimental SMTChecker;。从 Solidity 0.8.4 开始,激活 SMTChecker 的标准方法是使用 CLI 选项 --model-checker-engine {all,chc,bmc} 或 JSON 选项 settings.modelChecker.engine={all,chc,bmc}。pragma 版本将继续有效,直到下一个重大版本发布,届时它将被完全移除。此外,SMTChecker 现在还验证索引访问是否安全,并允许用户精确选择要分析的合约,从而可能降低生成的符号模型的复杂性并提高证明能力。
完整变更日志
重要的错误修复
- ABI 解码器 V2:对于二维数组和内存中特别设计的的数据,abi.decode 的结果可能取决于内存中其他位置的数据。调用数据解码不受影响。
语言特性
- 汇编/Yul:允许十六进制字符串字面量。
- 可以使用 bytes.concat 以及可变数量的 bytes 和 bytesNN 参数,其行为类似于 abi.encodePacked 的受限版本,但名称更具描述性。
- 支持通过 error 关键字使用自定义错误,并引入 revert 语句。
编译器特性
- 分析:正确检测跨所有函数调用的其他合约字节码的循环引用。
- 命令行界面:模型检查器选项 --model-checker-targets 也接受 outOfBounds。
- 命令行界面:新的模型检查器选项 --model-checker-contracts 允许用户选择哪些合约应作为最派生合约进行分析。
- 低级内联器:将普通跳转内联到小型代码块,并将跳转内联到终止的小型代码块。
- NatSpec:允许在非公共状态变量和局部变量声明上使用 @notice 标签。文档仅作为 AST 的一部分,位于 documentation 字段下。
- SMTChecker:弃用 pragma experimental SMTChecker; 并将默认模型检查器引擎设置为 none。
- SMTChecker:在 CHC 反例中报告局部变量。
- SMTChecker:报告数组和固定字节的越界索引访问。
- SMTChecker:支持文件级函数和常量。
- 标准 JSON:模型检查器选项 settings.modelChecker.targets 也接受 outOfBounds。
- 标准 JSON:模型检查器选项 settings.modelChecker.targets 使用字符串目标数组代替逗号分隔的目标字符串。
- 标准 JSON:新的模型检查器选项 settings.modelChecker.contracts 允许用户选择哪些合约应作为最派生合约进行分析。
- Yul EVM 代码转换:堆栈优化:重用未使用的函数参数的插槽,并将分配返回值堆栈插槽的操作延迟到表达式语句和不引用它们的赋值之后。
- Yul 优化器:添加了一个新的步骤 FunctionSpecializer,用于使用其文字参数专门化函数。
错误修复
- Antlr 语法:修复导入路径的解析,通常情况下需要正确区分空字符串字面量和非空字符串字面量。
- AST 输出:修复基本构造函数调用的 ModifierInvocation 的 kind 字段。
- 命令行界面:修复打印 AST 并使用 --base-path 或 file:// 前缀导入时发生的内部错误。
- 命令行界面:修复标准输入绕过允许路径检查的问题。
- Natspec:修复与覆盖函数的公共状态变量的 @returns 文档相关的内部错误。
- SMTChecker:修复 push 作为复合赋值的 LHS 时的误报和漏报。
- SMTChecker:修复无法部署的合约中的误报。
- SMTChecker:修复在较旧的 EVM 版本(其中这些数据不可用)上返回动态数据的公共 getter 发生的内部错误。
- SMTChecker:修复在 catch 代码块中包含函数调用的 try-catch 语句发生的内部错误。
- 类型检查器:修复在没有 emit 语句的情况下使用事件时缺少错误的问题。
AST 更改
- ContractDefinition 节点的新的属性:usedErrors 列出合约使用的所有错误的 AST ID(即使在外部定义)。
非常感谢所有为使此版本发布成为可能而做出贡献的人!
从此处下载 Solidity 的新版本 此处。