{ 跳至内容 }

Solidity 0.8.10 版本发布公告

发布于 2021年11月9日 由 Solidity 团队

版本发布

Solidity v0.8.10 现在可以通过 SMTChecker 报告合约不变量和重入属性。它还包含一些关于外部函数调用的新优化,并为纯 Yul 模式启用了新的 EVM 代码生成器。

值得注意的新功能

通过 Yul IR 进行编译的新 EVM 代码转换

在此版本中,我们引入了一个新的 EVM 代码生成后端,用于 Solidity 通过 Yul(启用优化器)的实验性编译管道,以及用于优化 Yul 输入的编译。

以前,任何 Yul 变量在其整个生命周期中在栈上都有一个固定的位置,新的代码转换放弃了此限制,并尝试确定更优化的布局,该布局 (1) 减少了所需的交换量,从而降低了 Gas 成本,以及 (2) 将整体栈使用量保持在尽可能低的水平,以防止栈过深错误。

我们同时为通过 Yul 生成的代码启用了之前实验性的 StackLimitEvader,它将在某些条件下将 Yul 变量从栈移动到内存以防止栈过深错误。但是,此转换目前仅在没有内联汇编的情况下启用,因为无法指示内联汇编是否尊重 Solidity 的内存模型,这是转换有效的先决条件。

在我们的基准测试中,新的代码转换导致了显着的运行时 Gas 节省,尽管代码大小略有增加。

此更改也将影响使用 Yul 作为输入生成优化代码,即solc --strict-assembly --optimize 也将使用新的代码转换。要启用 StackLimitEvader,Yul 代码需要指示它尊重一个保留内存区域。这可以通过 memoryguard 指令完成,如我们的文档所述:包含 let ptr := memoryguard(size) 的 Yul 代码,其中 size 是一个字面量,承诺始终保持范围 [size, ptr) 内的内存不被触碰,从而允许编译器在必要时使用此范围来移动栈变量。

完整变更日志

语言特性

  • 内联汇编:支持在外部函数指针上使用 .address.selector 来访问其地址和函数选择器。

编译器特性

  • 代码生成器:如果预期返回数据,则跳过对外部合约是否存在进行检查。在这种情况下,如果合约不存在,ABI 解码器将回滚。
  • 命令行界面:接受传递给 --yul-optimizations 的步骤序列中的嵌套括号。
  • 命令行界面:添加 --debug-info 选项,用于选择在生成的 EVM 汇编和 Yul 代码中应包含多少额外的调试信息。
  • 命令行界面:在汇编程序模式下支持 --asm--bin--ir-optimized--ewasm--ewasm-ir 输出选择选项。
  • 命令行界面:打印错误、警告和信息时使用不同的颜色。
  • JSON AST:在 parsing 阶段更早地设置导入的绝对路径。
  • SMTChecker:输出在被调用函数中存在的 block.*msg.*tx.* 变量的值。
  • SMTChecker:报告合约不变量和重入属性。这可以通过 CLI 选项 --model-checker-invariants 或标准 JSON 选项 settings.modelChecker.invariants 启用。
  • 标准 JSON:接受传递给 settings.optimizer.details.yulDetails.optimizerSteps 的步骤序列中的嵌套括号。
  • 标准 JSON:添加 settings.debug.debugInfo 选项,用于选择在生成的 EVM 汇编和 Yul 代码中应包含多少额外的调试信息。
  • Yul EVM 代码转换:在通过 Yul 编译并启用优化器时切换到新的优化代码转换。
  • Yul 优化器:在各种优化器步骤中考虑用户定义函数的控制流副作用。

错误修复

  • 代码生成器:修复不可变变量的构造函数源映射。
  • 命令行界面:在编译器模式之外不允许使用 --error-recovery 选项。
  • 命令行界面:当将链接文件写入磁盘失败时,不要返回零退出代码。
  • 命令行界面:修复附加到通过标准输入传递的源文件的额外换行符,从而影响其哈希值。
  • 命令行界面:报告所选输入模式不支持的输出选择选项,而不是忽略它们。
  • 命令行界面:在链接时仅接受传递给 --libraries 选项的库名称的精确匹配。以前,未以文件名作为前缀的库名称将与任何具有该名称的库匹配。
  • SMTChecker:修复魔术类型访问 (blockmsgtx) 中的内部错误。
  • SMTChecker:修复在函数选项中传递 Gas 时 CHC 引擎中的内部错误。
  • 类型检查器:修复在声明之前使用数组和结构体以及用户定义的值类型时的内部错误。
  • 类型检查器:修复在公共库函数中使用用户定义的值类型时的内部错误。
  • 类型检查器:改进了具有(嵌套)映射类型的常量变量的错误消息。
  • Yul 汇编程序:修复函数名称不唯一时的内部错误。
  • Yul IR 生成器:不要为空合约输出空的 switch/if 代码块。

实验性功能中的重要错误修复

  • Yul IR 生成器:如果有多个返回值,则对修饰符调用参数中引用的函数返回值的更改不会正确转发。

构建系统

  • 仅在链接时传递仅链接器 emscripten 选项。
  • 删除 emscripten 构建的过时兼容性解决方法。
  • 将 emscripten 更新到 2.0.33 版本。

非常感谢所有帮助使此版本成为可能的贡献者!

从此处下载 Solidity 的新版本 此处

上一篇

下一篇

参与进来

GitHub

Twitter

Mastodon

Matrix

了解更多

博客文档使用案例贡献关于论坛

2024Solidity 团队

安全策略

行为准则