Solidity 0.8.24 版编译器发布

Solidity 0.8.24 版编译器支持坎昆升级

Solidity 团队于 2024 年 1 月 26 日发布 Solidity 编译器 v0.8.24。这个编译器的最新版本为“坎昆”网络升级做好了准备,包括支持临时存储(EIP-1153)、分片 Blob 交易(EIP-4844)等。此版本的发布二进制文件现在也兼容苹果芯片的 macOS。

坎昆网络升级

“坎昆”网络升级提供了新的特性,以操作码和预编译的形式呈现,需要明确使用才能获得任何好处,但也引入了现有 EVM 行为的更改,这将自动影响已部署的合约。Solidity 0.8.24 为新的操作码提供了完整的 Yul 级别支持,并为其中一些提供了 Solidity 级别的内建支持。

硬分叉将包括以下执行层更改

重要说明

“坎昆”尚未部署到以太坊主网。因此,这个新的编译器版本尚未将其设为默认目标。为了使用新的操作码和内建函数,用户需要使用--evm-version cancun 标志选择此版本。请注意,使用此标志编译的代码在尚未实施硬分叉的任何网络上可能无法正常工作。

需要注意的是,目前代码生成器并不会自动利用新的操作码来改进生成的代码,而且优化器的支持是最小的。代码生成和优化器的改进将在随后的版本中进行。

支持的 EIPs 和显著特性

临时存储(EIP-1153)

临时存储是 EVM 级别上期待已久的特性,引入了除了内存、存储、calldata(以及返回数据和代码)之外的另一个数据位置。新的数据位置的行为类似于存储,主要区别在于临时存储中的数据不是永久性的,而是仅限于当前交易,并在交易结束时重置为零。因此,临时存储的成本与热存储访问一样便宜,读取和写入的价格都是 100 gas。

要了解更多关于其用例和重要事项,请阅读关于临时存储的完整博客文章

Solidity 0.8.24 添加了两个新的汇编内建函数来支持 EIP-1153:tstore()和 tload()。

分片 Blob 交易(EIP-4844)

EIP-4844引入了一种新的交易格式,这是未来完全实现的数据分片机制的一部分。携带 Blob 的交易将允许用户包含大量数据。虽然合约无法直接访问这些数据 Blob,但提供了对它们的 KZG 承诺的访问。编译器通过 blobhash() Yul 内建函数和同名的全局 Solidity 函数提供访问版本化的 Blob 哈希。

这类交易的定价涉及一种新类型的 gas,具有自我调整的价格,类似于普通 gas,但与之独立。与当前区块的基础费用通过 basefee()提供给合约一样,Blob 基础费用可以通过 Yul 中的 blobbasefee()内建函数和 Solidity 中的 block.blobbasefee 变量进行访问。有关新操作码的详细信息,请参阅 EIP-7516

用于复制内存区域的高效 EVM 指令(EIP-5656)

到目前为止,EVM 没有适当定价的机制来直接在内存区域之间复制数据。过去曾有多次尝试,但由于各种原因,依旧没有一种取代今天编译器使用的简单的 mload/mstore 循环。

EIP-5656最终引入了 MCOPY 操作码,在 Yul 中可用作 mcopy()内建函数。请注意,Solidity 0.8.24 只在汇编中明确使用时才可用。未来版本将在代码生成器发出的复制例程中广泛使用新操作码,降低高级别复制操作的 gas 成本。

SELFDESTRUCT 行为的更改(EIP-6780)

EIP-6780显著限制了 SELFDESTRUCT 操作码的功能。在坎昆中,该操作码将仅执行整个合约以太余额的转账。该账户,包括其存储和合约代码,将不再被清除。唯一的例外是在与部署合约相同的交易中发生销毁的情况。

这种更改不需要编译器的任何支持。这是一个全网范围的更改,将影响所有已部署的合约。编译合约时使用的--evm-version 设置对此没有影响。

需要注意的是,SELFDESTRUCT 已经被 EIP-6049 弃用了一段时间。弃用仍然有效,编译器仍会对其使用发出警告。即使考虑到新的行为,也强烈不建议在新部署的合约中使用。未来对 EVM 的更改可能会进一步减少该操作码的功能。

支持 Apple Silicon

从这个版本开始,我们用一个可以在基于 ARM 的 Mac 上运行的通用二进制文件取代了仅适用于英特尔的 macOS 二进制文件(solc-macos)。这个更新确保 Solidity 编译器可以在苹果 Silicon 架构上本地运行,消除了用户需要从源代码编译的需要。基于英特尔的 Mac 用户可以像以前一样继续使用该二进制文件。

你可以在 github 发布页面上找到 solc-macos 二进制文件

完整的更改日志

语言特性

  • 引入全局 block.blobbasefee 以检索当前区块的 Blob 基础费用。
  • 引入全局函数 blobhash(uint)以检索 Blob 的版本化哈希,类似于同名的 Yul 内建函数。
  • Yul:引入内建函数 blobbasefee()以检索当前区块的 Blob 基础费用。
  • Yul:引入内建函数 blobhash()以检索与交易相关的 Blob 的版本化哈希。
  • Yul:引入内建函数 mcopy()以便宜地在内存区域之间复制数据。
  • Yul:引入内建函数 tload()和 tstore()以访问临时存储。

编译器特性

  • EVM:支持“坎昆” EVM 版本。
  • SMTChecker:支持 bytes.concat,除非将字符串文字作为参数传递。
  • 标准 JSON 接口:添加了对以--asm-json 格式导入 EVM 汇编的实验性支持。
  • 类型检查器:现在对内部函数指针的比较会产生警告,因为它在启用了传统管线的情况下可能会产生意外的结果。 { /try-react/}

Bugfixes

  • AST import: 修复了使用空let变量声明导入内联程序时的错误。

如何安装/升级?

要升级到最新版本的 Solidity 编译器,请按照我们文档中提供的安装说明进行操作。

你可以在这里下载新版本的 Solidity:v0.8.24。如果你想从源代码构建,请不要使用 GitHub 自动生成的源代码存档。而是使用 solidity_0.8.24.tar.gz,并参考我们的源代码构建文档 。我们建议所有 Solidity 开发人员始终升级到最新版本的 Solidity,以便利用改进、优化,最重要的是 bug 修复。

最后但同样重要的是,我们要感谢所有帮助实现此版本发布的贡献者!


本翻译由 DeCert.me 协助支持, 在 DeCert 构建可信履历,为自己码一个未来。

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

0 条评论

请先 登录 后评论
翻译小组
翻译小组
0x9e64...7c84
大家看到好的文章可以在 GitHub 提 Issue: https://github.com/lbc-team/Pioneer/issues 欢迎关注我的 Twitter: https://twitter.com/UpchainDAO