我们很高兴宣布 Solidity 编译器发布v0.8.24。这个最新的编译器版本为“Cancun”网络升级做好了准备,包括支持瞬时存储 (EIP-1153)、分片 Blob 事务 (EIP-4844) 等等。现在,macOS 的发布二进制文件也与 Apple 硅芯片兼容。
Cancun 网络升级
“Cancun”网络升级以操作码和预编译的形式提供了新功能,这些功能需要显式使用才能获得任何好处,但也引入了现有 EVM 行为的更改,这些更改将自动影响已部署的合约。Solidity 0.8.24 为新的操作码添加了完整的 Yul 级支持,并为其中的一些操作码添加了 Solidity 级别的内置函数。
硬分叉将包括以下执行层更改
- EIP-1153:瞬时存储操作码
- EIP-4788:EVM 中的信标区块根
- EIP-4844:分片 Blob 事务
- EIP-7516:BLOBBASEFEE 操作码
- EIP-5656:MCOPY - 内存复制指令
- EIP-6780:SELFDESTRUCT 仅在同一事务中
重要说明
“Cancun”尚未部署到以太坊主网。因此,这个新的编译器版本尚未将其设置为默认目标。为了使用新的操作码和内置函数,用户需要使用--evm-version cancun 标志选择此版本。请注意,使用此标志编译的代码可能无法在任何尚未实施硬分叉的网络上正常运行。
重要的是要注意,目前代码生成器不会自动使用新的操作码来改进生成的代码,并且优化器支持也很小。代码生成和优化器改进将在后续版本中进行。
支持的 EIP 和重要功能
瞬时存储 (EIP-1153)
瞬时存储是 EVM 级别上的一个期待已久的功能,它引入了除了内存、存储、 calldata(以及 return-data 和代码)之外的另一个数据位置。新的数据位置的行为类似于一个键值存储,类似于存储,主要区别在于瞬时存储中的数据不是永久性的,而是仅限于当前事务,并且在事务结束时重置为零。因此,瞬时存储与热存储访问一样便宜,读取和写入的价格均为 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 操作码的功能。在 Cancun 中,操作码将仅执行整个合约余额的以太坊转账。该帐户(包括其存储和合约代码)将不再被清除。唯一的例外是合约部署在同一事务中的情况。
此更改不需要编译器的任何支持。它是一个网络范围的更改,将影响所有已部署的合约。编译合约时使用的 --evm-version 设置对此没有影响。
请注意,SELFDESTRUCT 已经过时一段时间了,通过EIP-6049。弃用仍然有效,编译器将继续对它的使用发出警告。强烈建议不要在新部署的合约中使用它,即使考虑到新的行为。对 EVM 的未来更改可能会进一步减少操作码的功能。
对 Apple 硅芯片的支持
从这个版本开始,我们正在用通用二进制文件替换仅 Intel 的 macOS 二进制文件 (solc-macos),该二进制文件也可以在基于 ARM 的 Mac 上运行。此更新确保 Solidity 编译器在 Apple 硅芯片架构上本地运行,无需用户从源代码编译它。基于 Intel 的 Mac 用户可以像以前一样继续使用二进制文件。
您可以在solc-macos GitHub 发布页面上找到二进制文件。
完整变更日志
语言功能
- 引入全局 block.blobbasefee 用于检索当前区块的 Blob 基本费用。
- 引入全局函数 blobhash(uint) 用于检索 Blob 的版本化哈希值,类似于同名的 Yul 内置函数。
- Yul:引入内置函数 blobbasefee() 用于检索当前区块的 Blob 基本费用。
- Yul:引入内置函数 blobhash() 用于检索与事务关联的 Blob 的版本化哈希值。
- Yul:引入内置函数 mcopy() 用于廉价地复制内存区域之间的数据。
- Yul:引入内置函数 tload() 和 tstore() 用于访问瞬时存储。
编译器功能
- EVM:支持 EVM 版本“Cancun”。
- SMTChecker:支持 bytes.concat,除非将字符串字面量作为参数传递。
- 标准 JSON 接口:添加对导入 EVM 汇编的实验性支持,该汇编采用 --asm-json 使用的格式。
- 类型检查器:内部函数指针的比较现在会产生警告,因为它在启用传统管道的情况下可能会产生意外结果。
错误修复
- AST 导入:修复导入具有空 let 变量声明的内联汇编时的错误。
如何安装/升级?
要升级到最新版本的 Solidity 编译器,请按照我们文档中提供的安装说明进行操作。
您可以在此处下载 Solidity 的新版本:v0.8.24。如果您想从源代码构建,请不要使用 GitHub 自动生成的源代码存档。请改为使用solidity_0.8.24.tar.gz,并查看我们关于如何从源代码构建的文档。我们建议所有 Solidity 开发人员始终升级到最新版本的 Solidity,以便利用改进、优化,最重要的是错误修复。
最后但并非最不重要的,我们要感谢所有帮助使此次发布成为可能的贡献者!