我们很高兴宣布 Solidity 编译器的最新版本,Solidity v0.8.20。这个最新版本包括一系列通过 IR 管道进行的改进,改进了在合约 ABI 中公开的事件列表,最重要的是,支持 上海硬分叉!
重要说明
此编译器将默认目标 EVM 版本切换到上海,这意味着生成的字节码将包含PUSH0 操作码。请确保选择合适的 EVM 版本,以防您打算部署到除主网以外的其他链上,例如可能还不支持 PUSH0 的 L2 链,否则您的合约部署将失败。
通过标准 JSON 实验性导入 AST
对于工具开发人员来说,一个有趣的新功能是能够通过标准 JSON 接口使用 SolidityAST 作为输入语言来导入 JSON AST。到目前为止,我们已经将其作为一项实验性功能发布,主要是因为缺乏对格式错误的 AST 的适当错误报告,以及目前我们通常不保证对无效输入 AST 的健全行为。
因此,虽然我们强烈建议不要在任何生产管道中使用 AST 导入,特别是不要依赖从导入的 AST 生成的字节码用于生产用途,但我们希望这项新功能将使生态系统中更轻松地开发工具,我们鼓励您尝试一下并向我们反馈任何意见。
另外,请注意,编译器将再次对导入的 AST 进行类型检查和分析 - 为了确保编译器遵守您可能对 AST 执行的转换,您可以重新导出导入的 AST 并检查结果。
完整变更日志
编译器功能
- 汇编器:对从“上海”开始的 EVM 版本,使用 push0 将 0 放置到堆栈上。这降低了部署和运行时成本。
- EVM:将默认 EVM 版本设置为“上海”。
- EVM:支持 EVM 版本“上海”。
- NatSpec:添加对 enum 定义中的 NatSpec 文档的支持。
- NatSpec:添加对 struct 定义中的 NatSpec 文档的支持。
- NatSpec:在 userdoc 和 devdoc 输出中包含由合约发出但定义在合约外部的事件的 NatSpec。
- 优化器:重新实现 UnusedAssignEliminator 和 UnusedStoreEliminator 的简化版本。它可以正确地删除旧版本忽略的深度嵌套循环中的一些未使用的赋值。
- 解析器:一元加号在 AST 中不再被识别为一元运算符,并在解析阶段触发错误(而不是在分析阶段触发错误)。
- SMTChecker:将所有关于不支持的语言特性的消息分组到一个警告中。CLI 选项 --model-checker-show-unsupported 和 JSON 选项 settings.modelChecker.showUnsupported 可以被启用以显示完整列表。
- SMTChecker:现在在分析结束时明确报告已被证明安全的属性。默认情况下,只显示安全属性的数量。CLI 选项 --model-checker-show-proved-safe 和 JSON 选项 settings.modelChecker.showProvedSafe 可以被启用以显示安全属性的完整列表。
- 标准 JSON 接口:添加通过标准 JSON 导入 AST 的实验性支持。
- Yul EVM 代码转换:如果可用,使用 push0 而不是 codesize 在堆栈上生成任意值,以在分支之间创建相等的堆栈高度。
错误修复
- ABI:在 ABI 中包含由合约发出但定义在合约外部的事件。
- 不可变:禁止在 try/catch 语句中初始化不可变变量。
- SMTChecker:修复在三元运算符中包含验证目标(直接或间接)的分支中的假阳性。
AST 更改
- AST:将 internalFunctionIDs 字段添加到包含内部调度可调用的函数 ID 的合约的 AST 节点中。该字段是函数 AST ID 到内部调度函数 ID 的映射。这些 ID 始终生成,但它们仅在通过 IR 代码生成中使用。
- AST:将 usedEvents 字段添加到 ContractDefinition 中,其中包含合约发出的所有事件的 AST ID,以及合约定义和继承的所有事件。
一如既往,非常感谢所有帮助实现这次发布的贡献者!
如何安装/升级
要升级到最新版本的 Solidity 编译器,只需按照我们文档中提供的 安装说明 即可。我们的团队确保提供详细且简单的步骤,使升级过程尽可能无缝。如果您在升级过程中有任何问题或遇到任何问题,请随时联系我们的 社区矩阵频道。
您可以在此处下载 Solidity 的新版本:v0.8.20。如果您想从源代码构建,请不要使用 GitHub 自动生成的源代码存档,而是使用 solidity_0.8.20.tar.gz,并查看 我们关于如何从源代码构建的文档,如果您需要指导。
请注意,对于使用低于 0.8.0 版本的 Solidity 的用户,存在重大更改。我们强烈建议您查看我们文档中有关重大更改的详细列表,以确保升级过程顺利。此外,我们鼓励所有 Solidity 用户定期检查更新,以了解最新的改进和优化。我们建议所有 Solidity 开发人员升级到 0.8.20 版本,以利用这些改进和优化。