推出最新版本的 Solidity 编译器v0.8.25。这是继 2024年3月13日协调世界时 13:55 在以太坊主网上进行的 Dencun 硬分叉之后的次要版本发布。
Dencun 升级
Dencun 升级结合了对以太坊共识层和执行层的更改。协议更改的完整列表可以在 EIP-7569 中找到。
随着 Dencun 现在在主网上上线,我们相应地将cancun 设为编译器将为其生成代码的默认 EVM 版本。
MCOPY 在代码生成器中
之前的版本在 Yul 和内联汇编中提供了 mcopy() 内建函数。Solidity 0.8.25 最终在代码生成器中使用了它,取代了 mload()/mstore() 循环的使用。
将受益于新操作码的操作是存储在内存中的字节数组的编码和解码。这包括任何显式使用 abi.decode() 和 abi.encode(),以及将此类数组传递/返回到外部函数中/从外部函数中返回。
但是请注意,虽然许多合约应该会看到燃气费使用量有所减少,但我们预计减少幅度会非常小。首先,在绝大多数情况下,编译器可以避免首先在内存中进行不必要的复制(内存变量只能是引用类型这一事实是主要原因之一)。一个更常见的情况是在内存和位置之间复制数据,例如 calldata、storage 或 returndata,对于这些操作,成本保持不变。其次,新指令与连续的内存区域一起工作,这使得它非常适合字节数组,如 bytes 和 string,但不适合需要为每个元素进行清理的更复杂的数组类型。
关于瞬态存储的重要说明
为了引起人们注意错误使用 瞬态存储操作码 的危险性,从 0.8.24 版本开始,编译器始终会警告使用汇编中的 tstore 操作码。由于有问题的用法模式通常无法通过算法与瞬态存储的安全使用区分开来,因此我们仍然别无选择,只能无条件发出警告。从 0.8.25 开始,编译器将继续这样做,尽管现在每个编译只执行一次,在 tstore 的第一次出现时。我们意识到这可能会让负责任地使用瞬态存储的用户和库作者感到困扰,但至少在目前,我们认为提高人们对粗心使用瞬态存储的危险性的认识比在安全情况下追求便利性更重要。通过这种方式,我们希望降低用户完全不知道这些问题存在的风险,并无意中将其代码中引入细微的错误。
要详细了解瞬态存储以及导致引入警告的问题,请阅读 关于瞬态存储的完整博文。
完整变更日志
编译器功能
- 代码生成器:在复制字节数组时使用 MCOPY 而不是 MLOAD/MSTORE 循环。
- EVM:将默认 EVM 版本设置为 cancun。
- Yul 分析器:仅对 tstore 的第一次出现发出瞬态存储警告。
错误修复
- 汇编器:防止标签大小的错误计算。
- 命令行界面:当使用 --via-ir 但没有请求依赖于 IR 的输出时,不运行 IR 管道。
- EVM 汇编导入:修复导入期间缺少源位置的处理。
- SMTChecker:在使用 SMT-LIB 接口时,确保查询在调用求解器之前正确刷新到文件。
- SMTChecker:修复在构建零值 SMT 表达式时不尊重整数类型的符号导致的内部错误。
- SMTChecker:即使系统上存在 Eldarica,也仅在使用 --model-checker-solvers eld 明确请求时才运行它。
如何安装/升级?
要升级到最新版本的 Solidity 编译器,请按照安装说明(可在我们的文档中找到)。
您可以在此处下载 Solidity 的新版本:v0.8.25。如果您想从源代码构建,请不要使用 GitHub 自动生成的源代码归档文件。请改用 solidity_0.8.25.tar.gz,并查看 我们关于如何从源代码构建的文档。我们建议所有 Solidity 开发人员始终升级到最新版本的 Solidity,以利用改进、优化以及最重要的是错误修复。
最后但并非最不重要的是,我们要对所有帮助使本次发布成为可能的贡献者表示衷心的感谢!