Solidity v0.8.12 改善了 JavaScript / Wasm 二进制文件并修复了若干 bug。
值得注意的新特性
Emscripten 构建 / solc-js
我们成功将 JavaScript / WebAssembly 二进制文件的大小从 27 MB 减少到略高于 8 MB。最初二进制文件如此之大的原因是,我们包含了 SMT 求解器 Z3。
尺寸缩减是通过使用 LZ4 压缩二进制文件并在加载时解压缩来实现的,这对用户来说应该是完全透明的。我们最初担心这可能会对那些经常切换编译器版本或始终在全新的 Node.js 环境中运行编译器的人产生负面影响,但我们的基准测试表明,解压缩速度快于 base64 解码,因此应该不是问题。
solc-js 的 TypeScript 迁移
编译器 JavaScript 包装器的代码已部分移植到 TypeScript,这应该不会影响 npm 包的用户。如果您自己构建包或在没有 npm 包的情况下使用存储库,如果您遇到任何问题,请联系我们。
完整变更日志
语言特性
- 通用:为外部函数类型添加相等比较运算符。
- 通用:支持ContractName.functionName 用于 abi.encodeCall,除了外部函数指针。
编译器特性
- 命令行界面:使用 --hashes 时,也会返回事件和错误签名。
- Yul 优化器:如果插槽已包含相同的值,则删除 mstore 和 sstore 操作。
- Yul:在请求时为纯 Yul 代码发出不可变引用。
Bug 修复
- Antlr 语法:允许 yulPath 中使用内置名称以支持函数指针中的 .address。
- 代码生成器:修复访问占用两个以上堆栈插槽的外部函数成员时的内部错误。
- 代码生成器:修复从 string calldata 到 bytes 进行显式转换时的内部错误。
- 控制流图:对修饰符执行正确的虚拟查找,以进行未初始化变量和不可达代码分析。
- 通用:string.concat 现在正确地将字符串作为参数并返回 string memory。之前它意外地被引入为 bytes.concat 的副本。
- 不可变变量:修复基类合约的构造函数使用 return 且派生合约包含不可变变量时出现的错误。
- 继承:在覆盖分析期间考虑所有祖先中的函数。
- IR 生成器:在将固定字节类型转换为较小的固定字节类型期间添加缺失的清理。
- IR 生成器:为值类型的索引事件参数添加缺失的清理。
- IR 生成器:修复在将 calldata 和存储中的引用类型复制到内存中的结构或数组成员时的内部错误。
- IR 生成器:修复复制包含函数的结构的存储数组时的 IR 语法错误。
- Natspec:修复覆盖具有 Natspec 文档化返回值的结构 getter 且结构中的名称不同的情况下的内部错误。
- 类型检查器:修复常量变量声明前向引用结构时的内部错误。
- Yul EVM 代码转换:在极端情况下改进了堆栈洗牌。
Solc-Js
- 包装器现在至少需要 nodejs v10。
- 代码已移植到 TypeScript。
构建系统
- Emscripten 构建将嵌入的 WebAssembly 二进制文件存储在 LZ4 压缩格式中,并在加载时透明地解压缩。
非常感谢所有帮助使此版本成为可能的贡献者!
在此处下载 Solidity 的新版本 此处。