{ 跳至内容 }

Solidity 0.8.18 版本发布公告

发布于 2023年2月1日 由 Solidity 团队

版本发布

推出最新版本的 Solidity 编译器!

我们很高兴地宣布 Solidity 编译器的最新版本,Solidity v0.8.18。此最新版本包含一系列改进,并且还引入了对 巴黎升级 的支持!

值得注意的新功能

这些是我们希望在此版本中重点介绍的功能。

禁用 CBOR 元数据

一个新的命令行标志(--no-cbor-metadata) 和标准 JSON 选项 (settings.metadata.appendCBOR: false) 用于防止编译器在字节码末尾附加 CBOR 元数据部分。到目前为止,只能排除 JSON 元数据文件哈希 (--metadata-hash none/settings.metadata.bytecodehash: "none") 从该部分,但字节码仍将包含一小段包含编译器版本的 CBOR 数据。

支持巴黎硬分叉

对巴黎硬分叉的支持包括

  • 弃用 Solidity 中的全局 block.difficulty 内建函数以及从 EVM 版本 >= Paris 的内联汇编中删除 difficulty() 指令。此更改是由于 EIP-4399 引入的 difficulty 指令的重命名和语义更改。
  • 在 Solidity 中引入全局 block.prevrandao 内建函数以及在 EVM 版本 >= Paris 的内联汇编中引入 prevrandao() 指令。

注意:计划在 Solidity 版本 0.9.0 中完全删除 block.difficulty

弃用 selfdestruct

selfdestruct 现在被认为已弃用 (EIP-6049),并且编译器将在 Solidity 和 Yul 中警告其使用,包括内联汇编。目前没有替代方案,但强烈建议不要使用它,因为它最终会改变其语义,并且所有使用它的合约都会以某种方式受到影响。

从 Yul 生成 EVM 字节码

此版本还涉及在启用优化器时从 Yul 代码生成 EVM 字节码的变化:对于从未返回调用方(即始终回退或始终终止 EVM 调用)的 Yul 函数,编译器不再推送返回标签。该标签仅用于跳转回调用方。这将降低燃气成本和代码大小。依赖于字节码级别当前调用约定的工具可能需要进行调整以适应此更改。

完整变更日志

语言特性

  • 允许在映射类型中使用命名参数。

编译器特性

  • 命令行界面:添加 --no-cbor-metadata 以跳过在字节码末尾附加 CBOR 元数据。
  • 命令行界面:在未捕获的异常时返回退出代码 2
  • EVM:弃用 block.difficulty 并在 EVM 版本 >= paris 的内联汇编中禁止使用 difficulty()。此更改是由于 EIP-4399 引入的重命名引起的。
  • EVM:在 Solidity 中引入 block.prevrandao 并在 EVM 版本 >= paris 的内联汇编中引入 prevrandao()
  • EVM:将默认 EVM 版本设置为“Paris”。
  • EVM:支持 EVM 版本“Paris”。
  • 语言服务器:添加基本文档悬停支持。
  • Natspec:为 devdoc 添加事件 Natspec 继承。
  • 优化器:添加优化规则 and(shl(X, Y), shl(X, Z)) => shl(X, and(Y, Z))
  • 解析器:关于无效版本 pragma 的更详细的错误消息。
  • SMTChecker:使 z3 成为 BMC 和 CHC 引擎的默认求解器,而不是所有求解器。
  • SMTChecker:在使用 CLI 选项 --model-checker-solvers eld 时,支持 Eldarica 作为 CHC 引擎的 Horn 求解器。二进制文件 eld 必须在系统中可用。
  • Solidity 升级工具:删除 solidity-upgrade 工具。
  • 标准 JSON:添加一个布尔字段 settings.metadata.appendCBOR 以跳过在字节码末尾附加 CBOR 元数据。
  • 类型检查器:在使用已弃用的内建函数 selfdestruct 时发出警告。
  • Yul EVM 代码转换:为始终终止交易的用户定义函数生成更优化的代码。对于对始终终止的函数的调用,不会推送返回标签。
  • Yul 优化器:允许通过在序列字符串中冒号分隔符 (:) 后指定自定义步骤来替换以前硬编码的清理序列。
  • Yul 优化器:如果值已由先前的调用计算并且可以重用,则消除 keccak256 调用。

错误修复

  • 解析器:不允许为同一事件参数使用多个 indexed 属性。
  • 解析器:不允许对修饰符参数使用 indexed 属性。
  • SMTChecker:修复负整数(比 2 的幂大 1)的显示错误。
  • SMTChecker:修复使用静态完全指定的静态变量的链赋值的内部错误。
  • SMTChecker:修复多个错误的 SMTChecker natspec 条目的内部错误。
  • SMTChecker:修复在内部调用公共库函数时的内部错误。
  • SMTChecker:修复删除函数类型结构体成员时的内部错误。
  • SMTChecker:修复在使用用户定义类型作为映射索引或结构体成员时的内部错误。
  • SMTChecker:改进了错误消息中 2 的幂或几乎 2 的幂的大整数的可读性。
  • 类型检查器:修复私有库函数可以在其声明范围之外使用 using for 附加的错误。
  • Yul 优化器:根据十六进制和十进制文字的值而不是其表示形式对其进行哈希处理,从而提高了等效函数的检测效率。

一如既往,非常感谢所有帮助使此版本成为可能的贡献者!

如何安装/升级

要升级到最新版本的 Solidity 编译器,只需按照安装说明(可在我们的文档中找到)。我们的团队确保提供详细且简单的步骤,使升级过程尽可能流畅。如果您在升级过程中有任何疑问或遇到任何问题,请随时联系我们的 社区 Matrix 频道

您可以在此处下载 Solidity 的新版本:v0.8.18。如果您想从源代码构建,请不要使用 GitHub 自动生成的源代码存档,而是请使用 solidity_0.8.18.tar.gz 并查看 我们关于如何从源代码构建的文档,如果您需要指导。

请注意,对于使用低于 0.8.0 版本的 Solidity 的用户,存在重大更改。我们强烈建议您查看我们文档中重大更改的详细列表,以确保升级过程顺利进行。此外,我们鼓励所有 Solidity 用户定期检查更新,以了解最新的改进和优化。我们建议所有 Solidity 开发人员升级到 0.8.18 版本以利用这些改进和优化。我们的团队始终致力于不断增强 Solidity,以造福整个以太坊生态系统。

准备好释放您的创造力,并使用最新版本的 Solidity 编译器构建有影响力的去中心化应用程序。编码愉快!

更新 2023-02-02:重新构建 Solidity 0.8.18 的 Linux 二进制文件

0.8.18 版本的 Linux 二进制文件最初是针对过新版本的 glibc 构建的,因此无法在较旧的 Linux 系统上运行。因此,我们重新构建并替换了二进制文件,因此您可能会遇到较旧版本的 solc-linux-amd64-v0.8.18+commit.87f61d96,它与您在 当前发布的 Linux 二进制文件列表 上找到的哈希不匹配。这两个版本的编译器除了新版本仅在 glibc 版本低于 2.32 的系统上才能工作之外,行为完全相同。

需要明确的是:这两个二进制文件在所有情况下(包括元数据中的提交哈希)都会生成相同的输出。只有编译器二进制文件本身的哈希由于替换而会更改,但新二进制文件将始终生成字节相同的输出。

https://binaries.soliditylang.org 的列表中,原始的(现已替换的)二进制文件列出如下

{
  "path": "solc-linux-amd64-v0.8.18+commit.87f61d96",
  "version": "0.8.18",
  "build": "commit.87f61d96",
  "longVersion": "0.8.18+commit.87f61d96",
  "keccak256": "0x265ad8479d7c5d30ef3556c5c23efddbf1718c1112abd219a6add420489cf930",
  "sha256": "0xa1c0f33eb4482c26f56719ecf62b0ee05d7d7a4f8264ffbddf9ebcd9095c32bd",
  "urls": [
    "bzzr://bc795017b74430520c9fd41300536f45d43edb74ca3c497ce2117d1954bbca12",
    "dweb:/ipfs/QmPkAoHf5hNoZS9W7uZhrGgVTSPoCui3h9MEEKTTfSe8am"
  ]
}

它已被替换为

{
  "path": "solc-linux-amd64-v0.8.18+commit.87f61d96",
  "version": "0.8.18",
  "build": "commit.87f61d96",
  "longVersion": "0.8.18+commit.87f61d96",
  "keccak256": "0x932901581a2ef0795851363522811fa160db5561e34cbb306e7105b6bbc3834d",
  "sha256": "0x95e6ed4949a63ad89afb443ecba1fb8302dd2860ee5e9baace3e674a0f48aa77",
  "urls": [
    "bzzr://61828ca55d703ddcd2ceff0e20a48ae6bca28a58b09725836893dc5f6b8e8018",
    "dweb:/ipfs/Qmf68UBPAspGAh6TJ1F9zKLFy3WjvH6W43HvzWWGAUQXTv"
  ]
}

上一篇

下一篇

参与进来

GitHub

Twitter

Mastodon

Matrix

了解更多

博客文档使用案例贡献关于论坛

2024Solidity 团队

安全策略

行为准则