Solidity 0.8.30 版本发布公告

Solidity 编译器发布了 v0.8.30 版本,这是一个维护版本,主要为应对 Pectra Ethereum 网络升级,该版本将默认 EVM 版本从 cancun 更改为 prague,并讨论了 Pectra 升级中对 Solidity 有影响的 EIP,包括 EIP-7623、EIP-7702 和 EIP-2537。

我们发布了 Solidity 编译器 v0.8.30。 鉴于计划于 2025 年 5 月 7 日进行的 Pectra Ethereum 网络升级,此最新版本是一个维护版本,并将默认 EVM 版本从 cancun 更改为 prague。

Pectra 是一个以太坊协议升级,继 Dencun 之后,为以太坊网络的执行层和共识层带来了新的功能和变化。 在 Pectra 主网公告 中阅读更多内容。

值得注意的 EIP

让我们看看 Pectra 引入的更改列表中对 Solidity 影响最大的 EIP。

EIP-7623:增加 calldata 成本

在 Pectra 中,EIP-7623 提议增加主要发布数据的交易的 calldata 成本。 这是为了通过减少最大区块大小及其方差来抵消另一个包含的 EIP(EIP-7691)引起的带宽增加,而不会对普通用户产生负面影响。

calldata 成本的增加可能会影响编译器组件必须根据它做出的决策的有效性。 最值得注意的是 ConstantOptimizer,它是 基于操作码的优化器模块 的一部分。 为了说明这个问题,让我们考虑常量 2**256 - 1。 它可以编码为 PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff(3 gas,33 字节)或 PUSH0 NOT(5 gas,2 字节)。 优化器必须决定哪个是更好的选择,这涉及对每个字节的成本做出假设。 由于合约 initcode 作为 calldata 传递到创建事务中,因此 calldata 的成本是该计算的一部分,并且对选择哪种形式有一定的影响。

尽管如此,我们已决定不对编译器执行的计算进行任何调整。 首先,由于成本增加是非局部的,并且不容易在各个操作码级别上考虑,因此几乎不可能这样做。 最终成本现在取决于事务的执行成本,该成本是可变的,并且取决于输入、状态以及代码中采用的整个路径。 其次,回到 ConstantOptimizer 示例,通过用户选择的优化参数(特别是 --optimizer-runs)可以更好地缓解它。 默认值 200 导致编译器尝试在合约部署成本和在其生命周期内所有预期调用的成本之间取得平衡,而更高的 calldata 成本意味着前者可能被低估。 但是,通常的做法是选择非常低或非常高的值,以明确地优先考虑其中一个,这有效地消除了对 calldata 成本的考虑。

EIP-7702:设置 EOA 账户代码

Pectra 中的 EIP-7702 增加了一种新的交易类型,允许 EOA 所有者将其帐户委托给现有合约,从而使其充当一个合约。 这是实现完全账户抽象的重要一步。 在 EIP 中阅读更多内容!

此最新版本未引入与上述 EIP 相关的任何其他更改。 但是,请注意,编译器的先前版本(v0.8.29)引入了对存储布局的控制,专门用于允许多个委托安全地共享属于同一 EOA 的存储。

EIP-2537:用于 BLS12-381 曲线运算的预编译

EIP-2537 历时近 5 年,引入了在链上执行 BLS 签名验证所需的预编译。 虽然以太坊交易使用速度更快的 ECDSA 签名,但 BLS 签名已在共识中使用,并且由于其非常理想的属性(它们可以聚合)而被长期需求。

由于预编译的内置函数本质上是外部函数调用的薄包装器,因此它们可以使用现有功能直接实现,而无需扩展语言。

我们认为,像这样的功能最好委托给外部库,而不是在 Solidity 编译器中进行硬编码,尽管我们不排除它最终成为计划中的标准库的一部分的可能性。

当前版本没有为预编译引入任何全局内置函数,因此,用户必须手动调用它们。 我们知道社区可能对 Solidity 中的 BLS 签名支持感兴趣。 虽然我们乐于讨论并希望了解其用例,但我们目前没有计划在语言中实现它。

完整的更新日志

编译器特性

  • EVM:将默认 EVM 版本设置为 prague。
  • NatSpec:捕获 AST 中枚举值的 NatSpec 文档。

Bug修复

  • SMTChecker:不要将循环条件视为恒定条件验证目标,因为这可能会导致不正确的报告和内部编译器错误。
  • SMTChecker:修复了使用 --model-checker-contracts 仅选择合约子集时的不正确分析。
  • SMTChecker:修复了使用字符串文字初始化基于固定字节的用户定义类型时发生的内部编译器错误。

如何安装/升级?

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

如果要从源代码构建,请不要使用 GitHub 自动生成的源代码存档。而是使用 solidity_0.8.30.tar.gz 源代码 tarball 或通过 git 检出 v0.8.30 标签。

pragma solidity ^0.8.30;

contract Example {
    uint256 public value;

    function setValue(uint256 _value) public {
        value = _value;
    }

    function getValue() public view returns (uint256) {
        return value;
    }
}

最后但并非最不重要的一点是,我们要衷心感谢所有为实现此版本做出贡献的贡献者!

  • 原文链接: soliditylang.org/blog/20...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

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