我们很高兴地宣布 Solidity 编译器的最新版本发布,Solidity v0.8.19。此最新版本包含一系列改进,并且还引入了对在用户定义值类型 (UDVTs) 上定义运算符的支持!您可以在我们的功能深度解读博文中详细了解它。
值得注意的新功能
这些是我们希望在此版本中重点介绍的功能。
用户定义值类型的运算符
使用运算符的功能旨在使 UDVTs 更接近于像内置类型一样自然使用,并促进类型安全接口的使用。所有关于此功能的设计考虑因素的详细信息、代码示例和上下文都可以在这篇博文中找到。
防止运行时字节码中的死代码
在早期版本和默认的传统代码生成中,当仅在合约创建期间调用内部库函数或通过模块访问的自由函数时,例如仅在构造函数中,合约的运行时字节码中仍然存在该函数的副本。其根本原因是,通常,函数类型的表达式可以在合约创建期间存储在存储中,同时在创建期间和运行时都被调用。但是,函数的字节码在创建代码中的偏移量与运行时代码中的偏移量不同,并且传统代码生成中的函数指针被编码为字节码中的偏移量。因此,在创建期间,必须在这些函数表达式中对创建代码和运行时代码中的两个位置的引用进行编码。因此,创建代码中的函数指针也引用函数在运行时代码中的偏移量,这要求函数实际上存在于运行时代码中。当然,这实际上仅对于最终可能存储在存储中的函数指针才必要,这通常是一种不太可能的情况。对于直接调用,这种双重编码是不必要的。这就是为什么对于对内部合约函数的直接调用,编译器会绕过函数表达式的完整编码。但是,此绕过对于内部库函数和通过模块调用的自由函数没有发生,导致了此版本中已修复的这种不良行为。感谢 @sifislag 报告此问题。
完整变更日志
语言特性
- 允许通过以下语法为用户定义的值类型定义自定义运算符:using {f as +} for T global。
编译器特性
- SMTChecker:新的可信模式,假设任何编译时可用的代码都是实际使用的代码,即使在外部调用中也是如此。这可以通过 CLI 选项 --model-checker-ext-calls trusted 或 JSON 字段 settings.modelChecker.extCalls: "trusted" 使用。
错误修复
- 汇编器:尽可能避免复制子汇编字节码。
- 代码生成器:如果立即调用引用函数,则避免包含对引用函数的已部署标签的引用。
- 合约级别检查器:正确区分缺少基构造函数参数的情况与具有未实现的基函数的情况。
- SMTChecker:修复由未处理的 z3 表达式(当使用按位运算符时来自求解器)引起的内部错误。
- SMTChecker:修复使用自定义 NatSpec 注释来抽象自由函数时的内部错误。
- 类型检查器:还允许 using for 中的外部库函数。
一如既往,非常感谢所有帮助使此版本成为可能的贡献者!
如何安装/升级
要升级到最新版本的 Solidity 编译器,只需按照我们文档中提供的安装说明即可。我们的团队确保提供了详细且简单的步骤,以使升级过程尽可能顺利。如果您在升级过程中有任何疑问或遇到任何问题,请随时联系我们的社区 Matrix 频道。
您可以在此处下载 Solidity 的新版本:v0.8.19。如果您想从源代码构建,请不要使用 GitHub 自动生成的源代码归档文件,而是请使用solidity_0.8.19.tar.gz,如果您需要指导,请查看我们关于如何从源代码构建的文档。
请注意,对于使用低于 0.8.0 版本的 Solidity 的用户,存在重大更改。我们强烈建议您查看我们文档中有关重大更改的详细列表,以确保升级过程顺利进行。此外,我们鼓励所有 Solidity 用户定期检查更新,以了解最新的改进和优化。我们建议所有 Solidity 开发人员升级到 0.8.18 版本以利用这些改进和优化。