Solidity v0.8.1 引入了许多 SMTChecker 的新功能(见下文),将用于构建 soljson.js 的 emscripten 版本更新至 2.0.12,允许捕获 panic 错误并添加其他小的改进。
值得注意的新功能
SMTChecker 反例和外部函数的合成
SMTChecker 已经将交易跟踪作为失败验证目标的反例进行报告,但是 0.8.1 添加了内部调用,msg.value 和以重入调用形式对外部调用的未知代码的合成,作为反例。一篇最近的博文更详细地介绍了该主题。
如何选择 SMTChecker 目标
在 0.8.1 之前,SMTChecker 会自动为所有类型创建验证目标。现在用户可以通过 CLI 选项 --model-checker-targets 或标准 JSON 设置 modelCheckerSettings.targets 选择要检查的验证目标。有效的目标字符串为 underflow、overflow、divByZero、constantCondition、balance、popEmptyArray 和 assert。可以同时选择多个目标,目标之间用逗号分隔,不使用空格:underflow,overflow,assert。有关验证目标的详细说明,请参阅SMTChecker 文档.
捕获 Panic
Panic(uint) 回退错误是在 0.8.0 中引入的,但还没有办法在 try/catch 语句中捕获和解码此类错误。现在已经添加了此功能。
try otherContract.f() { } catch Panic(uint _code) { if (_code == 0x01) { revert("Assertion failed"); } else if (_code == 0x11) { revert ("Underflow/overflow"); } // We ignore the other errors. }
如果您的 try/catch 语句中既没有 catch Panic(uint) 子句,也没有没有错误类型的 catch 子句,则回退将“冒泡”,即调用合约将回退。
无论您是否捕获错误,调用的效果始终会被回退。
请注意,您无法知道错误是在被调用合约 (otherContract) 本身还是在从 otherContract 调用的合约中发生的。
代码长度快捷方式
从 v0.8.0 开始,可以通过使用 a.code.length 访问地址 a 处的代码大小。但是,这涉及将代码复制到内存中,即使您没有使用 a.code。在此版本中,实现了一个快捷方式,它直接返回 extcodesize(<address>) 的值,并避免将代码复制到内存中。
完整变更日志
语言特性
- 可以使用 catch Panic(uint code) 来捕获来自外部调用的 panic 失败。
编译器特性
- 代码生成器:通过直接使用 extcodesize 来降低 <address>.code.length 的成本。
- 命令行界面:允许在 --libraries 命令行选项中使用 = 作为库名称和地址之间的分隔符。
- 命令行界面:新的选项 --model-checker-targets 允许指定要检查的目标。有效选项为 all、constantCondition、underflow、overflow、divByZero、balance、assert、popEmptyArray,其中默认值为 all。可以同时选择多个目标,目标之间用逗号分隔,不使用空格:underflow,overflow,assert。
- 命令行界面:在 --libraries 命令行选项中,仅接受以 0x 为前缀的库地址。
- 优化器:添加规则以将 iszero(sub(x,y)) 替换为 eq(x,y)。
- 解析器:如果解析版本 pragma 失败,则报告有意义的错误。
- SMTChecker:在反例的交易跟踪中输出内部和受信任的外部函数调用。
- SMTChecker:当 msg.value 大于 0 时,在反例交易跟踪中显示它。
- SMTChecker:在反例函数调用中显示合约名称。
- SMTChecker:支持 ABI 函数作为未解释函数。
- SMTChecker:支持 try/catch 语句。
- SMTChecker:合成外部调用的不受信任的函数。
- SMTChecker:默认使用已检查的算术运算,并支持 unchecked 块。
- 标准 JSON:新的选项 modelCheckerSettings.targets 允许指定要检查的目标。有效选项为 all、constantCondition、underflow、overflow、divByZero、balance、assert、popEmptyArray,其中默认值为 all。可以同时选择多个目标,目标之间用逗号分隔,不使用空格:underflow,overflow,assert。
错误修复
- 代码生成器:修复在 catch 子句中解码格式错误的错误数据时的长度检查。
- 控制流图:修复由读取/写入未初始化变量引起的缺失错误。
- SMTChecker:修复覆盖修饰符和函数时的假阴性。
- SMTChecker:修复在存在内联汇编时的假阴性。
- SMTChecker:修复分析外部函数调用时的假阴性。
- SMTChecker:修复 block.chainid 上的内部错误。
- SMTChecker:修复将字符串字面量推送到 bytes 数组上的内部错误。
- SMTChecker:修复块变量缺少类型约束。
- 类型检查器:修复从内联汇编访问循环常量时的无限循环。
- 类型检查器:修复由包含映射的常量结构体引起的内部错误。
- 类型系统:当 M > N 时,不允许从 uintN 隐式转换为 intM,并且由此,不允许在相同类型之间进行显式转换。
构建系统
- 将 soljson.js 构建更新到 emscripten 2.0.12 和 boost 1.75.0。
非常感谢所有帮助使此版本成为可能的贡献者!
在此处下载 Solidity 的新版本 此处。