Solidity v0.8.7 引入了对 伦敦升级 的支持,包括对 Yul 到 EVM 代码转换、SMTChecker 的各种改进以及一些错误修复。
请注意:不幸的是,此版本的 npm 包已损坏。solc-js 存储库直接拉取将可以正常工作。
伦敦升级支持
Solidity 添加了对 BASEFEE 操作码 (EIP-3198 和 EIP-1559) 的支持,它公开了区块的基本费用。这可以通过全局变量 block.basefee 访问,或者在内联汇编或 Yul 中使用 basefee() 访问。
以下合约演示了一个示例
contract Basefee { function basefee_global() external view returns (uint) { return block.basefee; } function basefee_inline_assembly() external view returns (uint ret) { assembly { ret := basefee() } } }
SMTChecker
SMTChecker 现在将所有未经证明的目标报告捆绑在一个消息中,从而简化了工具的输出,并希望使任何重要信息更易于查看。命令行选项 --model-checker-show-unproved 和 JSON 选项 settings.modelChecker.showUnproved=true 可用于列出所有未经证明的目标。
除法和取模运算的 SMT 编码实际上使用乘法和松弛变量的等效编码来提高求解器的性能。但是,一些非默认求解器在使用这些运算的精确编码时效果更好。命令行选项 --model-checker-div-mod-no-slacks 和 JSON 选项 settings.modelChecker.divModNoSlacks 允许用户选择除法和取模的精确编码。预计此选项仅在使用 z3 以外的其他求解器时有用。
最后,下溢和上溢目标不再默认检查。这遵循编译器生成的检查的广泛使用,这些检查预计将在 Solidity >=0.8.0 中发生。仍然可以通过命令行选项 --model-checker-targets 或 JSON 选项 settings.modelChecker.targets 选择它们来执行下溢和上溢检查。
请参阅Solidity 文档中的 SMTChecker 文档,以获取有关这些选项和其他模型检查器选项的更多详细信息。
完整变更日志
语言特性
- 引入全局变量 block.basefee 用于检索当前区块的基本费用。
- Yul:引入内置函数 basefee() 用于检索当前区块的基本费用。
编译器特性
- AssemblyStack:在编译 Yul 代码时也运行基于操作码的优化器。
- 命令行界面:选项 --pretty-json 也适用于 --standard--json。
- EVM:将默认 EVM 版本设置为“London”。
- SMTChecker:默认情况下不检查下溢和上溢。
- SMTChecker:默认情况下隐藏未经证明的目标,并且 SMTChecker 仅说明有多少个未经证明的目标。可以使用命令行选项 --model-checker-show-unproved 或 JSON 选项 settings.modelChecker.showUnproved 列出它们。
- SMTChecker:新的设置用于启用/禁用使用松弛变量的除法和取模编码。命令行选项为 --model-checker-div-mod-slacks,JSON 选项为 settings.modelChecker.divModWithSlacks。
- Yul EVM 代码转换:对于没有返回值的函数,也弹出未使用的参数槽(在与有返回值的函数相同的限制下)。
- Yul EVM 代码转换:不要重用立即变得不可访问的堆栈槽。
- Yul 优化器:使用实验性的堆栈限制规避器(默认情况下未启用)将函数参数和返回值移动到内存中。
错误修复
- 代码生成器:修复将空字符串字面量传递给 bytes.concat() 时发生的崩溃。
- 代码生成器:修复调用绑定到 calldata 结构体和数组的函数时发生的内部编译器错误。
- 代码生成器:修复将 32 字节十六进制字面量或零字面量传递给 bytes.concat() 时发生的内部编译器错误,方法是禁止使用此类字面量。
- 命令行界面:在汇编/yul 模式下应用 --optimizer-runs 选项。
- 命令行界面:修复将目录路径传递给 --standard-json 时发生的崩溃。
- 命令行界面:当 --standard-json 获取 - 作为文件名时,从标准输入读取 JSON。
- 标准 JSON:包含文件名为空的文件中错误的源位置。
- 类型检查器:修复内部错误并防止对未实现的修饰符进行静态调用。
- Yul 代码生成器:修复使用带按位取反的长字面量时发生的内部编译器错误。
- Yul 代码生成器:修复对内置函数调用的源位置引用。
- Yul 解析器:修复 if 语句的源位置引用。
非常感谢所有帮助使此版本发布成为可能的贡献者!
从此处下载 Solidity 的新版本 此处。