Solidity v0.7.2 修复了 v0.7.1 中引入的自由函数中的一个错误,并添加了编译器生成的实用程序文件导出。此外,它还大大扩展了 SMTChecker 的语言支持。
重要错误修复
自由函数重载检查
自由函数在之前的版本 (Solidity v0.7.1) 中引入。事实证明,可以多次定义具有相同名称的函数,即使包含相同的参数类型。允许两个具有相同名称但不同参数类型的函数称为“重载”,当为不同类型实现本质上相同的功能时,这很有用。但是,不允许两个具有相同名称和相同参数类型的函数。
在 v0.7.1 中,编译器会静默生成调用第一个定义的代码。
为了修复此错误,已添加了缺少的检查。
值得注意的新功能
实用程序文件导出
对于 ABI 编码器和解码器等例程,编译器会生成无法直接归因于源代码中特定位置的其他代码。一段时间以来,这些例程作为 Yul 代码生成,该代码应该易于阅读和审计。Solidity 0.7.2 提供了输出生成代码的功能,包括其优化形式和非优化形式。
生成的可在标准 JSON 中的以下键下找到:evm.bytecode.generatedSources 和 evm.deployedBytecode.generatedSources。目前,只有一个始终名为 #utility.yul 的文件,但这在将来可能会发生变化。
完整变更日志
重要错误修复
- 类型检查器:不允许两个或多个具有相同名称(可能导入和别名)和参数类型的自由函数。
编译器功能
- 通过标准 JSON 或组合 JSON 导出编译器生成的实用程序源代码。
- 优化器:当底数为 0、1 或 2 时,优化 exp。
- SMTChecker:即使通过赋值,也保留有关字符串字面量的信息,从而正确支持 .length 属性。
- SMTChecker:支持 address 类型与字面量的转换,例如 address(0)。
- SMTChecker:支持 revert()。
- SMTChecker:支持 type(T).min、type(T).max 和 type(I).interfaceId。
- SMTChecker:支持复合 and、or 和 xor 运算符。
- SMTChecker:支持事件和低级日志。
- SMTChecker:支持固定字节索引访问。
- SMTChecker:支持内存分配,例如 new bytes(123)。
- SMTChecker:支持移位。
- SMTChecker:支持结构体。
- 类型检查器:解释为什么超大的十六进制字符串字面量不能显式转换为较短的 bytesNN 类型。
- 类型检查器:更详细的错误消息说明隐式转换失败的原因。
- 类型检查器:报告 unicode"" 字面量中第一个无效 UTF-8 序列的位置。
- Yul IR 生成器:报告与未实现的功能相关的源位置。
- Yul 优化器:首先内联到调用图中较低位置的函数。
- Yul 优化器:修剪函数中未使用的参数。
- Yul 优化器:尝试简化函数名称。
错误修复
- 代码生成器:修复在从返回值参数中剥离动态类型时,在没有 RETURNDATACOPY 的 EVM 版本上出现的内部错误。
- 类型检查器:在禁用 ABIEncoderV2 时,添加对 ABI 编码函数中嵌套动态数组的缺失检查。
- 类型检查器:更正调用中无效命名参数的错误消息,使其引用正确的参数。
- 类型检查器:更正同名但未隐藏声明的警告。
- 类型检查器:不允许库中的修饰符使用 virtual。
- 类型系统:修复将合约实例隐式转换为其 super 类型的内部错误。
- 类型系统:修复将字符串字面量隐式转换为 calldata 字符串的内部错误。
- 类型系统:修复如果顺序与声明不同,则重载函数和事件调用中的命名参数匹配不正确的问题。
- ViewPureChecker:防止对构造函数执行可见性检查。
非常感谢所有帮助使此版本发布成为可能的贡献者!
在此处下载 Solidity 的新版本 此处。