Solidity v0.7.6 添加了对 calldata 类型更好的支持。此外,fallback 函数现在可以具有参数并显式地返回数据。
值得注意的新特性
检测溢出的 Unicode 方向标记
Solidity Underhanded 比赛的获胜作品Solidity Underhanded 比赛巧妙地结合了 Unicode 方向标记来欺骗读者了解时间锁定升级机制的语义。从 Solidity 0.7.6 开始,解析器将拒绝注释和 Unicode 字符串,其中文本方向在注释或字符串结束之前未正确重置。
对 Calldata 类型更好的支持
从 Solidity 0.6.9 开始,您可以使用calldata 作为数据位置说明符,用于外部函数参数以外的变量。此版本最终添加了一些重要的缺失内部例程,使此特性更加有用
- 将动态编码的结构体和嵌套数组从 calldata 复制到内存
- 将数组切片从 calldata 复制到内存和存储
例如,第一部分允许调用需要复杂内存类型的外部函数或内部函数
// SPDX-License-Identifier: MIT pragma solidity ^0.7.6; pragma abicoder v2; struct Job { uint priority; string name; bool executed; } contract Scheduler { function schedule(Job[] calldata _jobs) public { for (uint i = 0; i < _jobs.length; i++) // This internal function call performs // a copy from calldata to memory. // The copy in memory will be writable. executeJob(_jobs[i]); } function executeJob(Job memory _job) internal { _job.executed = true; } }
第二部分允许更好地访问 calldata 数组,即使对更复杂的切片类型的实现尚未完成
function msgDataArguments() pure returns (bytes memory) { // This creates a calldata slice starting at the // fourth byte and converts it to a memory byte array // when returning it. return msg.data[4:]; }
Fallback 函数的参数和返回值
fallback 函数现在可以具有单个参数和一个返回值,以便在不使用内联汇编的情况下对低级数据进行操作。输入参数本质上是 msg.data 的别名,而返回值将作为原始字节数组返回,不会进行 ABI 编码。
// SPDX-License-Identifier: MIT pragma solidity ^0.7.6; pragma abicoder v2; contract Proxy { address target; fallback(bytes calldata _input) external returns (bytes memory) { (bool success, bytes memory result) = target.delegatecall(_input); if (success) // A byte array returned from the fallback function will // not be ABI-encoded. If you want to return structured // data, you can use ``return abi.encode(x, y)``; return result; else revert(result); } }
动态加载 Z3(如果可用)
"静态" Linux 二进制文件现在与 glibc >=2.14(于 2011 年发布)动态链接,这允许它加载 libz3.so.4.8(如果它在您的系统中可用),或者在它不可用时简单地禁用 SMTChecker。在此版本之前,Linux 二进制文件是完全静态的,并且 SMTChecker 功能始终处于禁用状态。
完整变更日志
语言特性
- 代码生成器:支持从 calldata 切片转换为内存和存储数组。
- 代码生成器:支持将动态编码的结构体从 calldata 复制到内存。
- 代码生成器:支持将嵌套数组从 calldata 复制到内存。
- 扫描器:当注释或 Unicode 字符串包含不平衡或下溢出的 Unicode 方向覆盖标记集 (LRO、RLO、LRE、RLE、PDF) 时,生成解析器错误。
- fallback 函数现在也可以具有单个 calldata 参数(等于 msg.data)并返回 bytes memory(不会进行 ABI 编码,而是按原样返回)。
- Wasm 后端:添加 i32.select 和 i64.select 指令。
编译器特性
- 构建系统:可选支持动态加载 Z3,并使用该机制进行 Linux 发布构建。
- 代码生成器:如果默认值未使用,则避免为其分配内存。
- SMTChecker:对二进制算术表达式应用常量求值。
- SMTChecker:在 CHC 引擎中为增量/减量创建下溢和上溢验证目标。
- SMTChecker:报告来自 CHC 引擎的反例中的结构体值。
- SMTChecker:支持 CHC 引擎中的提前返回。
- SMTChecker:支持 Getter。
- SMTChecker:支持函数调用中的命名参数。
- SMTChecker:支持结构体构造函数。
- Standard-Json:将最近引入的 modelCheckerSettings 键移至 settings.modelChecker。
- Standard-Json:正确地过滤请求的输出工件。
错误修复
- 代码生成器:在 ABI 编码器 v1 中,不要用单个 32 字节零字段填充空字符串字面量。
- NatSpec:修复在没有参数的修饰符中继承返回值参数文档时的段错误。
- SMTChecker:修复将字符串字面量转换为字节数组时的错误。
- SMTChecker:修复在使用字符串字面量进行按位复合赋值时发生的内部编译器错误。
- SMTChecker:修复尝试使用旧版 z3 生成反例时的内部错误。
- SMTChecker:修复在某些启用了 SMT 的源代码中,当没有 SMT 求解器可用时可能发生的段错误。
- SMTChecker:修复使用 bytes.push() 作为赋值左侧时发生的内部错误。
- 类型检查器:库中不可用 super。
- 类型检查器:不允许在大小类型 (例如 bytes000032) 中使用前导零,但允许将其视为标识符。
- Yul 优化器:修复 NameSimplifier 中的一个错误,其中 NameSimplifier 创建的新名称也可能由 NameDispenser 创建。
- Yul 优化器:从用户可用的优化步骤中删除 NameSimplifier。
非常感谢所有为本次发布做出贡献的人员!
在此下载 Solidity 的新版本 此处。