Solidity v0.6.8 修复了代码生成器中的三个重要错误,并建议使用 SPDX 许可证标识符。 此外,对 WebAssembly 的支持已扩展,现在可以访问min 和 max 整数类型的直接值。
如果您正在使用数组切片,字符串文字中的反斜杠用于 ABIEncoderV2 或者担心不可支付的构造函数,请升级。
重要的错误修复
请注意,下面列出的三个错误都被评定为“非常低”的严重程度。
字符串文字的内部转义错误
问题:当启用 ABIEncoderV2 时,直接传递给编码函数或外部函数调用的字符串文字将作为字符串存储在中间代码中。 可打印范围之外的字符处理正确,但此过程中没有对反斜杠进行转义。 这会导致双反斜杠减少为单个反斜杠,并因此重新解释为转义,这可能导致编码的字符串不同。
解决方案:现在对包含反斜杠字符的字符串文字进行了正确转义。
受影响代码的示例
pragma experimental ABIEncoderV2; contract C { function f() public payable returns (bytes memory) { // The reason string should contain two backslashes, // but during compilation, only a single backslash // ends up in the message. require(msg.value > 0, "back\\\\slash"); // This string literal is not directly passed to // an encoding function and is properly escaped. return "back\\\\slash"; } }
我们特别感谢 Alex Groce (@agroce) 通过模糊测试发现了这个错误!
数组切片动态编码基本类型错误
问题:对于基本类型大小动态的数组,使用非零开始表达式的索引范围访问将导致无效的数组切片。 任何对这种数组切片的索引访问都将导致从不正确的 calldata 偏移量读取数据。 数组切片仅支持动态 calldata 类型,所有存在问题类型都需要启用 ABIEncoderV2。
解决方案:禁止对基本类型动态编码的数组进行数组切片。
受影响代码的示例
pragma experimental ABIEncoderV2; struct S { uint[] data; } contract C { function f( S[] calldata arrayOfStructs, uint[][] calldata arrayOfArrays ) external pure { // These two do not result in the correct value. // Both expressions are disallowed now. arrayOfStructs[1:]; arrayOfArrays[1:]; } }
隐式构造函数调用值检查错误
问题:从 Solidity 0.4.5 开始,没有明确的 payable 构造函数的合约的创建代码应该包含一个调用值检查,如果传递了非零值,则导致合约创建回滚。 但是,如果合约根本没有定义明确的构造函数,但合约有一个定义了构造函数的基类,则此检查缺失。 在这些情况下,即使创建代码应该不可支付,也可以在合约创建事务中或使用内联汇编发送值,而不会回滚。
解决方案:我们在没有定义构造函数但具有定义了构造函数的基类的合约的创建代码中添加了一个调用值检查。
代码示例
contract Base { constructor() public payable {} } contract Derived is Base { // No constructor defined }
在 0.6.8 之前,可以将以太坊与 Derived 实例的创建事务一起发送。 同时 - 令人困惑的是 - 编译器现在不允许 Solidity 基于创建的形式 new Derived{value: 1}()。 我们通过在 Derived 的构造函数期间回滚(如果在创建时提供了以太坊)解决了这种差异。
要复制旧的行为,您可以在最派生的合约中添加一个 payable 构造函数。
其他错误修复
- ABI:跳过 private 或 internal 构造函数。
- 代码生成器:修复了“汇编代码中的异常”错误,其中请求的函数被生成了两次。
- Natspec:修复了在没有其他开发者文档标记的情况下忽略 @return 标记的错误。
- 类型检查器:检查 ** 操作中的文字指数是否过大或分数。
- 类型检查器:禁止访问包含不可变状态变量的合约类型的 runtimeCode。
- Yul 汇编器:修复没有值的变量声明的源位置。
新功能
语言功能
- 实现了 type(T).min 和 type(T).max,用于每个返回该类型可表示的最小值和最大值的整数类型 T。
编译器功能
- 命令行界面:在汇编模式下不要忽略 --yul-optimizations。
- ABI:允许对 calldata 数组切片使用 abi 编码函数,而无需显式转换。
- Wasm 二进制输出:实现 br 和 br_if。
非常感谢所有帮助使此版本成为可能的贡献者!
下载 Solidity 的新版本 在此。