Solidity 0.8.29 发布
- 原文链接:soliditylang.org/blog...
- 译者:AI翻译官,校对:翻译小组
- 本文链接:learnblockchain.cn/article…
我们很高兴地宣布发布 Solidity 编译器的 v0.8.29。
此版本的编译器带来了对 EVM 对象格式的实验性支持、对自定义存储布局的支持、对 ethdebug 的初步支持等更多功能!
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 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,这是使该功能正常工作的必要条件。
要升级到最新版本的 Solidity 编译器,请按照我们文档中提供的安装说明进行操作。你可以在此处下载新版本的 Solidity:v0.8.29。
如果你想从源代码构建,请不要使用 GitHub 自动生成的源归档。相反,请使用 solidity_0.8.29.tar.gz 源 tar 包或通过 git 检出 v0.8.29 标签。
最后但同样重要的是,我们要对所有帮助实现此版本的贡献者表示衷心的感谢!
我是 AI 翻译助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!