Solidity 0.7.0 是 Solidity 编译器和语言的一个重大版本发布。
此版本没有包含很多新功能,而是进行了一些更改,这些更改需要在语法或语义上进行向后不兼容的调整。有关详细说明,请参阅文档。
最值得注意的是,我们对可见性和状态可变性进行了进一步清理,并删除了几个不受欢迎的关键字。内存中包含映射的类型被禁止,移位和指数运算使用更合理的类型。
由于我们通常不向后移植错误修复,因此建议将所有代码升级为与 Solidity v.0.7.0 兼容。 solidity-upgrade 工具 可以帮助您将合约半自动升级到重大语言更改。虽然solidity-upgrade 承担了大部分工作,但您的合约很可能需要进一步的手动调整。
您可以在此处找到有关如何更新代码的指南。
请注意,下面列出的更改是**0.6.12 和 0.7.0 之间的更改**。对于在 0.6.x 系列期间引入的更改,请参阅此博客上的各个更改日志或版本发布公告。
重大更改
- 内联汇编:不允许在用户定义的函数和变量名中使用.。
- 内联汇编:存储指针变量x 的槽和偏移量分别通过x.slot 和x.offset 访问,而不是x_slot 和x_offset。
- JSON AST:使用kind: "hexString" 标记十六进制字符串字面量。
- JSON AST:从 JSON 输出中删除值为null 的成员。
- 解析器:不允许使用gwei 作为标识符。
- 解析器:不允许对value 和gas 使用点语法。
- 解析器:不允许在字符串字面量中使用不可打印字符。
- 解析器:引入 Unicode 字符串字面量:unicode"😃"。
- 解析器:变量上的 NatSpec 注释仅允许用于公共状态变量。
- 解析器:删除finney 和szabo 单位。
- 解析器:删除标识符now(替换为block.timestamp)。
- 引用解析器:using A for B 仅影响其所在的合约,而不影响所有派生合约。
- 类型检查器:不允许对库函数使用virtual。
- 类型检查器:不允许对包含嵌套映射的状态变量进行赋值。
- 类型检查器:不允许在继承层次结构中使用相同名称和参数类型的事件。
- 类型检查器:不允许使用有符号类型进行移位。
- 类型检查器:如果结构体和数组在内存或 calldata 中包含嵌套映射,则不允许使用。
- 类型检查器:字面量对非字面量的指数运算和移位将始终使用uint256 或int256 作为类型。
- Yul:不允许在标识符中使用连续和尾随的点。开头点已被禁止。
- Yul:不允许使用 EVM 指令pc()。
语言特性
- 继承:允许覆盖具有更严格的状态可变性:view 可以覆盖nonpayable,pure 可以覆盖view。
- 解析器:弃用构造函数的可见性。
- 状态可变性:不要对虚拟函数发出更严格的可变性建议,但对覆盖的函数发出建议。
编译器特性
- SMTChecker:报告多事务反例,包括发起事务的函数调用。这并不包括引用类型和重入调用的具体值。
- 不再识别使用var 关键字的变量声明。
错误修复
- 继承:不允许公共状态变量覆盖pure 函数。
- NatSpec:构造函数和函数具有一致的用户文档输出。
- SMTChecker:修复分配给 1 元组时的内部错误。
- SMTChecker:修复元组具有额外无效果括号时的内部错误。
- 状态可变性:常量公共状态变量被视为pure 函数。
- 类型检查器:修复函数调用具有命名参数时函数类型的推导问题。
- 不可变变量:修复不可变变量未赋值时的内部编译器错误。
非常感谢所有帮助使此版本发布成为可能的贡献者!
从此处下载 Solidity 的新版本。