Solidity 0.8.29 发布

Solidity 0.8.29 发布

我们很高兴地宣布发布 Solidity 编译器的 v0.8.29

此版本的编译器带来了对 EVM 对象格式的实验性支持、对自定义存储布局的支持、对 ethdebug 的初步支持等更多功能!

重要特性

对 EVM 对象格式的实验性支持

0.8.29 为我们带来了对 EVM 对象格式(EOF)的实验性支持。请注意,该功能仅在为尚未部署到主网或测试网的 Osaka EVM 版本进行编译时可以启用。

实验性后端仍然不完整,仅实现了 EOF 特性的一部分。然而,这部分特性已经足够支持编译任意的 Solidity 合约。缺失的元素主要是像 RJUMPV 或 EXCHANGE 这样的操作码,这将使我们能够在未来生成更高效的代码,但并不是生成有效字节码的绝对必要条件。

请注意,由于某些特性在 EOF 中不再存在,现有合约可能需要调整才能编译。例如,gas 和代码检查不再可能,这意味着无法为外部调用或如 gasleft()和<address>.code 等内置函数生成 gas 调用选项的代码。合约创建的变化也影响了运算符 new,现已始终使用盐值。盐值的默认值为 0,但很快将变为强制要求,因为使用相同的值与相同的合约会导致相同的部署地址(这与 EOF 外的 new 不同,后者使用账户的 nonce 为每次部署生成唯一地址)。最后,许多操作码被移除或替换,特别是外部调用,因此大量使用内联汇编的合约可能无法按原样编译。

由于该功能的实验性质,目前并非所有的语法差异都受到分析检查的覆盖,在某些情况下,你可能会在尝试使用它们时遇到内部编译器错误。请耐心等待,并注意这些不应被报告为实施中的错误。我们将在后续版本中解决这些问题。

此外,编译到 EOF 只能通过 IR 进行,并且仅在启用优化器的情况下进行。然而,当前实现不包括任何低级优化,这在某些情况下可能导致代码大小增加。我们预计将在未来的发布中减轻这些问题,甚至通过将 libevmasm 优化器移植到 EOF 目标来进行重大改进。这应该减轻用户在当前实现状态下可能遇到的任何代码大小回归。

请记住,在此版本发布时,Fusaka 升级的范围尚未最终确定,EOF 规范在最近几个月仍在进行更改。我们的实现尚未考虑这些更改,基于截至 2024 年 09 月 05 日的统一 EOF 规范并针对 evmone 0.13.0 进行了测试。

要尝试与你的合约一起使用,请在命令行中使用--experimental-eof-version 1,或在标准 JSON 中设置 settings.eofVersion: 1,并记得选择支持它的 EVM 版本(--evm-version osaka/settings.evmVersion: "osaka")。

我们要感谢 Ipsilon 团队在 EOF 方面所做的出色工作,特别是 Radek Zagórowicz 在 Solidity 实现方面的贡献。

对自定义存储布局的支持

这个发行版本引入了重新定位合约存储变量到任意位置的语法。

contract C layout at 2**255 - 42 {
    uint x;
}

支持指定存储位置是我们问题跟踪器中最古老、讨论最多的请求之一,但众多的用例和潜在的冲突需求使我们在特定解决方案上未能达成一致。随着 EIP-7702: 设置 EOA 账户代码在 Pectra 升级中的纳入,安全实现账户抽象变得至关重要,我们决定优先考虑这一用例而不是其他。

目前语法非常有限:基本位置只能是一个字面表达式,并适用于整个继承树。作为下一步,我们计划允许使用常量,并为最常用的布局添加特定目的的辅助器(尤其是 ERC-7201: 命名空间存储布局 )。最终,我们可能会支持初始语法提案中描述的全部功能,尽管我们希望逐步实施,以避免使其过于复杂,首先解决最相关的用例。社区反馈将推动该功能的未来发展,因此请随时在我们的论坛上分享你的意见,并告诉我们哪些方面对你的合约最为重要。

要了解有关新功能的更多信息,请查阅自定义存储布局文档

对 ethdebug 的初步支持

此版本还引入了对 ethdebug 的首次实验性支持——一种适合智能合约的调试数据格式。

ethdebug 规范仍在开发中。请加入 ethdebug Matrix 频道或关注 ethdebug 在 Github 上的存储库以跟踪正在进行的开发。ethdebug 每两周举行一次会议,时间定于周四 17:00(柏林时间)。会议在 Matrix 频道上宣布。

当前实现支持生成指令和源范围 。此初始版本仅支持通过 IR 的未优化编译,仍缺少许多重要特性。

如果你想尝试,可以在命令行上使用--ethdebug/--ethdebug-runtime 启用 ethdebug 输出。要在标准 JSON 中请求 ethdebug 工件,请在 settings.outputSelection 中添加"evm.bytecode.ethdebug"/"evm.deployedBytecode.ethdebug"(注意,"*"通配符_不_启用它)。请记得设置 settings.viaIR: true/--via-ir,这是使该功能正常工作的必要条件。

完整变更日志

语言特性

  • 允许将合约存储重新定位到任意位置。

编译器特性

  • 错误报告:生成代码时报告的错误现在会指向合约的位置,除非更精确的位置不可用。
  • EVM:支持 EVM 版本“Osaka”。
  • EVM 汇编导入:允许启用基于操作码的优化器。
  • 一般:实验性 EOF 后端实现的 EOF 子集足以通过 IR 编译任意高级 Solidity 语法,并启用优化。
  • SMTChecker:支持 block.blobbasefee 和 blobhash。
  • SMTChecker:选项--model-checker-print-query`不再需要--model-checker-solvers smtlib2`。
  • SMTChecker:Z3 现在是运行时依赖项,而不是构建依赖项(除了 emscripten 构建外)。
  • Yul 解析器:与内置名称冲突将变为非致命错误。

bug 修复

  • 命令行界面:在编译器模式下报告 StackTooDeep 错误作为适当的错误,而不是打印出用于内部编译器错误的诊断信息。
  • 错误报告:修复空名称源文件的错误位置未显示。
  • 一般:修复请求接口和抽象合约的 IR AST 输出时的内部编译器错误。
  • 元数据:修复在其他优化器设置具有默认值时,元数据中缺少自定义清理序列的问题。
  • SMTChecker:修复分析溢出表达式或涉及常量的无符号类型的按位否定时的内部编译器错误。
  • SMTChecker:修复在一个合约的上下文中安全但在另一个合约的上下文中不安全的目标报告。
  • SMTChecker:修复在分析涉及 BMC 的跨合约 getter 调用时的 SMT 逻辑错误。
  • SMTChecker:修复合约部署涉及字符串文字到固定字节转换时的 SMT 逻辑错误。
  • SMTChecker:修复外部调用有额外无效括号时的 SMT 逻辑错误。
  • SMTChecker:修复使用字符串文字初始化固定大小字节数组时的 SMT 逻辑错误。
  • SMTChecker:修复在转换涉及数组存储和选择操作的不变式时的 SMT 逻辑错误。
  • SMTChecker:修复将字符串文字作为 ecrecover 预编译参数进行错误编码的问题。
  • 标准 JSON 接口:修复生成的 generatedSources 和 sourceMap 即使未请求也会内部生成的问题。
  • 类型检查器:修复由于错误计算合约存储大小而导致的虚假编译错误,该错误错误地包括瞬态存储变量。
  • Yul:修复应报告代码生成错误时的内部编译器错误。
  • Yul 优化器:修复由于解除引用空的可选值而导致的调试断言失败。

构建系统

  • Linux 发行版构建完全静态,不再依赖 glibc。
  • 将目标标准从 C++17 切换到 C++20。

Solc-JS:

  • 包装器现在至少需要 nodejs v12。

如何安装/升级?

要升级到最新版本的 Solidity 编译器,请按照我们文档中提供的安装说明进行操作。你可以在此处下载新版本的 Solidity:v0.8.29

如果你想从源代码构建,请不要使用 GitHub 自动生成的源归档。相反,请使用 solidity_0.8.29.tar.gz 源 tar 包或通过 git 检出 v0.8.29 标签。

最后但同样重要的是,我们要对所有帮助实现此版本的贡献者表示衷心的感谢!

我是 AI 翻译助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
SolidityLang
SolidityLang
https://soliditylang.org/