这是一个 Solidity 编译器和语言的主要重大版本。更改包括继承中的显式 virtual 和 override 关键字、对 try/catch 的支持、将回退函数拆分为接收 Ether 函数和实际的回退函数,以及对数组长度更改方式的限制,等等。有关详细说明,请参阅文档 或参考下面的列表,该列表显示了每个更改。
从本版本开始,ABIEncoderV2 不再被视为实验性功能,但您仍然需要通过 pragma 激活它。
此外,Yul 优化器会自动与常规优化器一起激活,但您仍然可以通过详细的优化器设置禁用它。
重大更改
- ABI:删除已弃用的constant 和 payable 字段。
- ABI:type 字段现在是必需的,不再默认为 function。
- AST:内联汇编以结构化 JSON 而不是纯字符串导出。
- C API (libsolc):在 solidity_compile 和回调中引入上下文参数。
- C API (libsolc):提供的回调现在接受两个参数,kind 和 data。然后可以使用回调用于多种目的,例如文件导入和 SMT 查询。
- C API (libsolc):solidity_free 已重命名为 solidity_reset。添加了函数 solidity_alloc 和 solidity_free。
- C API (libsolc):solidity_compile 现在返回一个字符串,必须通过 solidity_free() 显式释放。
- 命令行界面:删除基于文本的 AST 打印机 (ast)。
- 命令行界面:默认切换到新的错误报告器。 old-reporter 回退到已弃用的旧错误报告器。
- 命令行界面:添加选项以禁用或选择字节码元数据中 IPFS 和 Swarm 之间的哈希方法。
- 常规:不允许从外部函数类型到 address 的显式转换,并添加名为 address 的成员作为替代。
- 常规:启用 Yul 优化器作为标准优化的一部分。
- 常规:新的保留关键字:override、receive 和 virtual。
- 常规:private 不能与 virtual 一起使用。
- 常规:将未命名的回退函数拆分为两种情况,使用 fallback() 和 receive() 定义。
- 继承:现在不允许状态变量隐藏。
- 内联汇编:仅允许严格的内联汇编。
- 内联汇编:变量声明不能隐藏汇编块外部的声明。
- JSON AST:用 baseFunctions 替换 superFunction 属性。
- Natspec JSON 接口:在 @dev 文档中正确支持多个 @return 语句,并强制在文档中提及命名返回参数。
- 源映射:在源映射中添加“修饰符深度”作为第五个字段。
- 标准 JSON 接口:添加选项以禁用或选择字节码元数据中 IPFS 和 Swarm 之间的哈希方法。
- 语法:动态存储数组的 push(element) 不再返回新长度。
- 语法:抽象合约需要使用 abstract 关键字显式标记为抽象。
- 语法:数组的 length 成员现在始终是只读的,即使对于存储数组也是如此。
- 类型检查器:幂运算的结果类型等于底数的类型。还允许对底数使用有符号类型。
语言特性
- 允许通过 payable(...) 从 address 到 address payable 的显式转换。
- 允许全局枚举和结构体。
- 允许公共变量覆盖外部函数。
- 允许在十六进制字符串中使用下划线作为分隔符。
- 引入数组切片的语法并为动态 calldata 数组实现它们。
- 引入 push() 用于动态存储数组。如果适用,它会返回对新分配元素的引用。
- 引入 virtual 和 override 关键字。
- 引入 try/catch 语句
- 修改动态存储数组的 push(element),使其不再返回新长度。
- Yul:引入 leave 语句,退出当前函数。
- JSON AST:将每个外部可见的 FunctonDefinition 的函数选择器添加到 AST JSON 导出中。
编译器特性
- 允许使用 revert-strings 选项或 settings.debug.revertStrings 设置从二进制文件中去除 revert 字符串。
- ABIEncoderV2:不再警告已启用的 ABIEncoderV2(尽管仍然需要 pragma)。
非常感谢所有帮助使此版本成为可能的贡献者!
在此处下载 Solidity 的新版本 此处。