该文档是 Solidity 编程语言的更新日志,详细记录了从 0.8.31 版本到 0.8.0 版本的每次更新内容,包括新特性、编译器特性、Bug 修复以及构建系统的变更。每次版本更新都有语言功能改进、编译器优化、EVM 支持增强和问题修复,为开发者提供更稳定、高效的开发环境。
0.8.31 (未发布)
语言特性:
编译器特性:
- ethdebug: EOF下指令和源位置的实验性支持。
Bug修复:
- 汇编器: 修复了未对嵌套超过一级的子汇编使用固定宽度类型分配ID的问题,导致目标架构之间
--asm-json
输出不一致。
- Yul 优化器: 修复了表达式简化器由于替换包含超出范围变量的表达式而产生无效 Yul 代码的边缘情况。
构建系统:
- 对于非 Windows 版本,更新到 boost 1.70.0。
0.8.30 (2025-05-07)
编译器特性:
- EVM: 将默认 EVM 版本设置为
prague
。
- NatSpec: 在 AST 中捕获
enum
值的 Natspec 文档。
Bug修复:
- SMTChecker: 不要将循环条件视为恒定条件验证目标,因为这可能导致不正确的报告和内部编译器错误。
- SMTChecker: 修复了使用
--model-checker-contracts
仅选择合约子集时分析不正确的问题。
- SMTChecker: 修复了使用字符串文字初始化基于固定字节的用户定义类型时出现的内部编译器错误。
0.8.29 (2025-03-12)
语言特性:
编译器特性:
- 错误报告: 代码生成期间报告的错误现在指向合约的位置,当没有更精细的位置可用时。
- ethdebug: 指令和源位置的实验性支持。
- EVM: 支持 EVM 版本 "Osaka"。
- EVM 汇编导入: 允许启用基于操作码的优化器。
- 常规: 实验性的 EOF 后端实现了 EOF 的一个子集,该子集足以通过启用优化的 IR 编译任意高级 Solidity 语法。
- SMTChecker: 支持
block.blobbasefee
和 blobhash
。
- SMTChecker: 选项
--model-checker-print-query
不再需要 --model-checker-solvers smtlib2
。
- SMTChecker: Z3 现在是运行时依赖项,而不是构建依赖项(除了 emscripten 构建)。
- Yul 解析器: 使与内建名称冲突成为非致命错误。
Bug修复:
- 命令行界面: 将编译器模式下的 StackTooDeep 错误报告为适当的错误,而不是打印用于内部编译器错误的诊断信息。
- 错误报告: 修复了对于名称为空的源文件未显示错误位置的问题。
- 常规: 修复了请求接口和抽象合约的 IR AST 输出时出现的内部编译器错误。
- 元数据: 修复了当其他优化器设置具有默认值时,元数据中缺少自定义清理序列的问题。
- SMTChecker: 修复了分析常量涉及的无符号类型的溢出表达式或按位取反时出现的内部编译器错误。
- SMTChecker: 修复了在一个合约上下文中安全但在另一个合约上下文中不安全的目标的报告。
- SMTChecker: 修复了 BMC 分析跨合约 getter 调用时的 SMT 逻辑错误。
- SMTChecker: 修复了合约部署涉及字符串文字到固定字节转换时的 SMT 逻辑错误。
- SMTChecker: 修复了外部调用具有额外的无效果括号时的 SMT 逻辑错误。
- SMTChecker: 修复了使用字符串文字初始化固定大小字节数组时的 SMT 逻辑错误。
- SMTChecker: 修复了翻译涉及数组存储和选择操作的不变量时的 SMT 逻辑错误。
- SMTChecker: 修复了将字符串文字错误编码为
ecrecover
预编译的参数的问题。
- 标准 JSON 接口: 修复了即使未请求也内部生成
generatedSources
和 sourceMap
的问题。
- TypeChecker: 修复了由于错误计算合约存储大小而导致的虚假编译错误,该大小错误地包含了瞬态存储变量。
- Yul: 修复了应该报告代码生成错误时出现的内部编译器错误。
- Yul 优化器: 修复了由于取消引用空的
optional
值而导致的调试断言失败。
构建系统:
- Linux 发布版本再次完全静态,不再依赖
glibc
。
- 从 C++17 切换到 C++20 作为目标标准。
Solc-Js:
0.8.28 (2024-10-09)
语言特性:
编译器特性:
- 常规: 仅按需生成 Yul AST 的 JSON 表示形式,以减少内存使用量。
- 标准 JSON 接口: 现在可以为所有合约的子集请求字节码或 IR,而不会触发其他合约的不必要的代码生成。
Bug修复:
- SMTChecker: 修复了分配给地址数组时的 SMT 逻辑错误。
- Yul AST: 修复了当调试信息选择包含代码段时,移位的原生源位置。
构建系统:
- 删除了
USE_LD_GOLD
选项,默认使用编译器默认链接器。对于自定义链接器,可以使用 CMAKE_CXX_FLAGS
。
0.8.27 (2024-09-04)
语言特性:
- 接受使用
transient
数据位置声明状态变量(仅解析器支持,尚未进行代码生成)。
- 在使用旧管道时,使
require(bool, Error)
可用。
- Yul: 放宽了对源位置注释的解析规则:现在允许位置组件之间的空格以及单引号括起来的代码段。
编译器特性:
- 命令行界面: 添加
--transient-storage-layout
输出。
- 命令行界面: 允许在汇编器模式下使用
--asm-json
输出选项,以 JSON 格式导出合约的 EVM 汇编。
- 命令行界面: 仅请求未优化的 IR 时,不执行 IR 优化。
- 常量优化器: 如果所选 EVM 版本支持,则使用
PUSH0
。
- 错误报告: 未实现的功能现在被正确地报告为错误,而不是像处理错误一样处理。
- EVM: 支持 EVM 版本 "Prague"。
- Peephole 优化器: 当支持
PUSH0
时,显式复制它,而不是使用 DUP1
。
- Peephole 优化器: 删除终止控制流的相同代码段(如果它们一个接一个地出现)。
- SMTChecker: 为一元减号运算中的下溢和溢出添加 CHC 引擎检查。
- SMTChecker: 将 CVC4 作为可能的 BMC 后端替换为 cvc5。
- 标准 JSON 接口: 添加
transientStorageLayout
输出。
- 标准 JSON 接口: 仅请求未优化的 IR 时,不执行 IR 优化。
- Yul: 删除不推荐使用的类型化 Yul 方言,该方言只能通过 CLI 中的
--yul
访问。
- Yul: 现在,未类型化 Yul 方言中类型的存在是一个解析器错误。
- Yul 优化器: 缓存优化的 IR,以加速具有字节码依赖项的合约的优化。
- Yul 优化器: 优化器现在将一些以前无法识别的相同字面量视为相同。
Bug修复:
- 汇编器: 当代码大小超过 255 时,修复了由于字节码中标签所需大小的不精确计算而导致的 ICE。
- 解析器: 修复了在某些情况下,一元加号运算在用作二元运算符时虚假地发出解析器错误。
- SMTChecker: 修复了报告 BMC 和 CHC 引擎验证检查数量无效的错误。
- SMTChecker: 修复了不变量中一元减号表达式的格式。
- SMTChecker: 修复了报告 BMC 引擎证明的目标时出现的内部编译器错误。
- SMTChecker: 修复了分配给合约或函数数组时的 SMT 逻辑错误。
- 标准 JSON 接口: 对于 Yul 输入,在出现警告的情况下,正确生成输出工件。
- TypeChecker: 修复了将嵌套元组分配给元组时发生的段错误。
- Yul IR 代码生成: Yul 子对象的确定性顺序。
- Yul 优化器: 修复了 Yul 源位置始终引用未优化的源的问题,即使在优化输出中也是如此。
- Yul 优化器: 修复了在没有错误时生成两次警告的问题。
- Yul 优化器: 名称简化可能导致带有前导和/或尾随点的禁止标识符,例如,
x._
将被简化为 x.
。
- Yul 解析器: 修复了解析非常长的位置注释时发生的段错误。
构建系统:
- 更改构建系统以将 git 子模块用于某些依赖项(nlohmann-json、fmtlib 和 range-v3)。
0.8.26 (2024-05-21)
语言特性:
- 引入一个新的重载
require(bool, Error)
,允许使用带有自定义错误的 require
函数。此功能仅在 via-ir
管道中可用。
编译器特性:
- SMTChecker: 为 CHC 引擎创建余额检查验证目标。
- Yul IR 代码生成: 对于使用小静态编码大小的错误进行还原,代码更便宜。
- Yul 优化器: 新的、更快的默认优化器步骤序列。
Bug修复:
- 命令行界面: 修复了当禁用优化器并且空/空白字符串用于
--yul-optimizations
序列时发生的ICE。
- SMTChecker: 修复了比较相同数组或字符串文字的哈希值时的误报。
- SMTChecker: 修复了由于对索引和映射域的排序兼容性要求过高而导致的映射访问内部错误。
- SMTChecker: 修复了在条件运算符中使用空元组时的内部错误。
- SMTChecker: 修复了将按位运算符与数组元素作为参数一起使用时的内部错误。
- 标准 JSON 接口: 修复了当禁用优化器并且将空/空白字符串用于
optimizerSteps
序列时发生的 ICE。
- StaticAnalyzer: 仅在字面量之间进行除法和模零时,才引发编译时错误。
- TypeChecker: 修复了当赋值的左侧是元组类型的带括号的非元组表达式时发生的编译器崩溃。
- Yul 优化器: 修复了优化器至少执行步骤序列的每个重复部分两次的问题,即使在第一次迭代后代码大小已经变得稳定也是如此。
- Yul 优化器: 修复了
SSATransform
生成的赋值顺序依赖于AST ID的问题,有时会在将不相关的文件添加到编译管道时导致不同的(但等效的)字节码。
构建系统:
- 将内部 JSON 库 jsoncpp 替换为 nlohmann::json。
0.8.25 (2024-03-14)
编译器特性:
- 代码生成器: 复制字节数组时,使用
MCOPY
而不是MLOAD
/MSTORE
循环。
- EVM: 将默认 EVM 版本设置为
cancun
。
- Yul 分析器: 仅对首次出现的
tstore
发出瞬态存储警告。
Bug修复:
- 汇编器: 避免错误计算标签大小。
- 命令行界面: 当使用
--via-ir
但未请求依赖IR的输出时,请勿运行IR管道。
- EVM 汇编导入: 修复导入期间缺少源位置的处理。
- SMTChecker: 确保在使用 SMT-LIB 接口时,在调用求解器之前将查询正确刷新到文件。
- SMTChecker: 修复了由于构造零值 SMT 表达式时未遵循整数类型的符号而引起的内部错误。
- SMTChecker: 即使系统存在 Eldarica,也仅在使用
--model-checker-solvers eld
显式请求时才运行 Eldarica。
0.8.24 (2024-01-25)
语言特性:
- 引入全局
block.blobbasefee
用于检索当前区块的 blob 基础费用。
- 引入全局函数
blobhash(uint)
用于检索 blob 的版本化哈希值,类似于同名的 Yul 内置函数。
- Yul: 引入内置函数
blobbasefee()
用于检索当前区块的 blob 基础费用。
- Yul: 引入内置函数
blobhash()
用于检索与交易关联的 blob 的版本化哈希值。
- Yul: 引入内置函数
mcopy()
用于在内存区域之间廉价地复制数据。
- Yul: 引入内置函数
tload()
和 tstore()
用于瞬态存储访问。
编译器特性:
- EVM: 支持 EVM 版本 "Cancun"。
- SMTChecker: 支持
bytes.concat
,除非将字符串文字作为参数传递。
- SMTChecker: 当求解器找到的具体值太长而无法打印时,打印一条消息,指示使用了函数参数名称而不是具体值。
- 标准 JSON 接口: 添加实验性支持以导入
--asm-json
使用的格式的 EVM 汇编。
- TypeChecker: 比较内部函数指针现在会产生警告,因为它在使用旧管道启用时可能会产生意外的结果。
Bug修复:
- AST 导入: 修复导入带有空
let
变量声明的内联汇编时的错误。
0.8.23 (2023-11-08)
重要的 Bug 修复:
- 优化器: 修复了块去重器中的错误,该错误导致除了
verbatim
指令内容之外完全相同的块被视为等效,从而合并为一个块。
编译器特性:
- 命令行界面: 现在可以始终提供一个空的
--yul-optimizations
序列。
- 标准 JSON 接口: 现在可以始终提供一个空的
optimizerSteps
序列。
0.8.22 (2023-10-25)
语言特性:
编译器特性:
- 代码生成器: 删除某些
for
循环的冗余溢出检查,当计数器变量不会溢出时。
- 命令行界面: 添加
--no-import-callback
选项,防止编译器加载未在 CLI 或标准 JSON 输入中显式给出的源文件。
- 命令行界面: 添加一个实验性的
--import-asm-json
选项,可以导入 --asm-json
使用的格式的 EVM 汇编。
- 命令行界面: 对于在编译管道之外产生的错误消息,也使用适当的严重性和颜色。
- EVM: 弃用对 "homestead"、"tangerineWhistle"、"spuriousDragon" 和 "byzantium" EVM 版本的支持。
- 解析器: 删除实验性错误恢复模式 (
--error-recovery
/ settings.parserErrorRecovery
)。
- SMTChecker: 支持用户定义的运算符。
- Yul 优化器: 如果支持
PUSH0
,则优先使用零字面量,而不是在变量中存储零值。
- Yul 优化器: 在默认清理序列的末尾运行
Rematerializer
和 UnusedPruner
步骤。
Bug 修复:
- AST: 修复 AST 中 Yul 节点的错误初始 ID。
- 代码生成器: 修复了通过导入回调发现的文件依赖的 via-IR 代码生成器的输出。 在某些情况下,不同的 AST ID 分配会改变内部分派中函数的顺序,从而导致表面上不同但语义上等效的字节码。
- NatSpec: 修复了请求在外部合约或接口中定义的合约发出事件的 userdoc 或 devdoc 时出现的内部错误。
- SMTChecker: 修复了导致循环在完成后展开的编码错误。
- SMTChecker: 修复了在条件检查之前展开
while
或 for
循环时恒定条件检查的不一致性。
- Yul 优化器: 修复了 CSE 期间的替换决策受到编译器生成的 Yul 变量名称的影响,从而在某些情况下导致不同的(但等效的)字节码。
0.8.21 (2023-07-19)
重要的 Bug 修复:
- 代码生成器: 始终为旧代码生成管道中的
<expression>.selector
中的表达式生成代码。
- Yul 优化器: 修复了
FullInliner
步骤 (i
) 未保留传递给未以表达式拆分形式的代码中的内联函数的参数的评估顺序(即,当使用自定义优化器序列时,该步骤前面没有 ExpressionSplitter
(x
))。
语言特性:
- 允许从其他合约对事件进行限定访问。
- 放宽对不可变变量初始化的限制。 现在读取和写入可以在函数和修饰符之外的构造期间的任何时间发生。 显式初始化不再是强制性的。
编译器特性:
- 命令行界面: 在汇编器模式下添加
--ast-compact-json
输出。
- 命令行界面: 为 Solidity 输入添加
--ir-ast-json
和 --ir-optimized-ast-json
输出,为 IR 和优化的 IR 提供压缩 JSON 格式的 AST。
- 命令行界面: 在编译器模式下尊重
--optimize-yul
和 --no-optimize-yul
,并在汇编器模式下也接受它们。 --optimize --no-optimize-yul
组合现在允许启用 EVM 汇编优化器,而无需启用 Yul 优化器。
- EWasm: 删除 EWasm 后端。
- 解析器: 引入
pragma experimental solidity
,这将启用实验性语言模式,特别是该模式在非破坏性版本之间没有稳定性保证,不适合生产使用。
- SMTChecker: 添加
--model-checker-print-query
CLI 选项和 settings.modelChecker.printQuery
JSON 选项,以 SMTLIB2 格式输出 SMTChecker 查询。 这需要仅使用 smtlib2
求解器。
- 标准 JSON 接口: 为 Yul 输入添加
ast
文件级别输出。
- 标准 JSON 接口: 为 Solidity 输入添加
irAst
和 irOptimizedAst
合约级别输出,为 IR 和优化的 IR 提供压缩 JSON 格式的 AST。
- Yul 优化器: 删除实验性的
ReasoningBasedSimplifier
优化步骤。
- Yul 优化器: 只要有可能,堆栈到内存移动器现在默认启用,用于通过 IR 代码生成和纯 Yul 编译。
Bug 修复:
- 代码生成器: 禁止结果是类型、内置函数、模块或某些不可分配函数的复杂表达式。 旧代码生成管道实际上不会评估它们,从而丢弃它们可能具有的任何副作用。
- 代码生成器: 修复未优化的 Yul 输出中函数顺序并非完全确定的问题。 在某些情况下,C++ 编译器的选择会导致不同的(但等效的)字节码(尤其是来自原生二进制文件与 emscripten 二进制文件)。
- 命令行界面: 修复了当使用
--stop-after parsing
并请求某些需要完整分析或编译的输出时出现的内部错误。
- 命令行界面: 不再可能同时指定
--optimize-yul
和 --no-optimize-yul
。
- SMTChecker: 修复 BMC 引擎中
if
和 三元条件
语句中副作用的编码。
- SMTChecker: 修复了仅能通过来自另一个公共函数的受信任的外部调用来违反验证目标时的误报。
- SMTChecker: 修复了发生 CHC 引擎超时时,在具有外部调用的受信任模式的 BMC 引擎中生成无效 SMT-LIB2 脚本的问题。
- SMTChecker: 修复了由于将使用函数指针的外部函数调用错误地分类为公共 getter 而导致的内部错误。
- SMTChecker: 修复了由于使用外部标识符来编码对将内部函数作为参数的函数的成员访问而导致的内部错误。
- 标准 JSON 接口: 修复了当分析被某些类型的致命错误中断时返回不完整的 AST 的问题。
- 类型检查器: 禁止在复杂表达式中使用某些不可分配的函数类型。
- 类型检查器: 引用不同声明的函数声明类型不再相互可转换。
- Yul 优化器: 确保为移动到内存的变量分配内存槽不依赖于 AST ID,而 AST ID 可能依赖编译期间是否包含其他文件。
- Yul 优化器: 修复了
FullInliner
步骤未忽略未以表达式拆分形式的代码的问题。
- Yul 优化器: 修复了在字节码生成之前,优化的 IR 被不必要地再次传递到 Yul 优化器的问题。
AST 更改:
- AST: 将
experimentalSolidity
字段添加到 SourceUnit
节点,该节点指示是否已通过 pragma experimental solidity
启用实验性解析模式。
0.8.20 (2023-05-10)
编译器特性:
- 汇编器: 对于从 "Shanghai" 开始的 EVM 版本,使用
push0
在堆栈上放置 0
。 这降低了部署和运行时成本。
- EVM: 将默认 EVM 版本设置为 "Shanghai"。
- EVM: 支持 EVM 版本 "Shanghai"。
- NatSpec: 添加对
enum
定义中的 NatSpec 文档的支持。
- NatSpec: 添加对
struct
定义中的 NatSpec 文档的支持。
- NatSpec: 在 userdoc 和 devdoc 输出中包含来自合约发出但在外部定义的事件的 NatSpec。
- 优化器: 重新实现简化版本的
UnusedAssignEliminator
和 UnusedStoreEliminator
。 它可以正确删除旧版本忽略的深层嵌套循环中的一些未使用的赋值。
- 解析器: 一元加号不再被识别为 AST 中的一元运算符,并在解析阶段(而不是在稍后的分析期间)触发错误。
- SMTChecker: 添加 CLI 选项
--model-checker-bmc-loop-iterations
和 JSON 选项 settings.modelChecker.bmcLoopIterations
,用于指定 BMC 引擎应展开多少个循环迭代。 请注意,展开循环时可能会出现误报。 这是因为 bmc 循环迭代设置可能小于完成循环所需的实际迭代次数。
- SMTChecker: 将所有关于不支持的语言功能的消息分组在一个警告中。 可以启用 CLI 选项
--model-checker-show-unsupported
和 JSON 选项 settings.modelChecker.showUnsupported
以显示完整列表。
- SMTChecker: 现在在分析结束时显式报告已证明安全的属性。 默认情况下,仅显示安全属性的数量。 可以启用 CLI 选项
--model-checker-show-proved-safe
和 JSON 选项 settings.modelChecker.showProvedSafe
以显示安全属性的完整列表。
- 标准 JSON 接口: 添加通过标准 JSON 导入 AST 的实验性支持。
- Yul EVM 代码转换: 如果可用,使用
push0
而不是 codesize
在堆栈上生成任意值,以便在分支之间创建相等的堆栈高度。
Bug 修复:
- ABI: 在 ABI 中包含由合约发出但在外部定义的事件。
- Immutables: 禁止在 try/catch 语句中初始化 immutable。
- SMTChecker: 修复了在包含验证目标的分支(直接或间接)中的三元运算符中的误报。
AST 更改:
- AST: 将
internalFunctionIDs
字段添加到包含可通过内部分派调用的函数的 ID 的合约的 AST 节点。 该字段是从函数 AST ID 到内部分派函数 ID 的映射。 这些 ID 始终生成,但仅在通过 IR 代码生成中使用。
- AST: 将
usedEvents
字段添加到 ContractDefinition
,其中包含合约发出的所有事件以及合约定义和继承的所有事件的 AST ID。
0.8.19 (2023-02-22)
语言特性:
- 允许通过
using {f as +} for T global
语法为用户定义的值类型定义自定义运算符。
编译器特性:
- SMTChecker: 新的受信任模式,假定任何编译时可用的代码都是实际使用的代码,即使在外部调用中也是如此。 可以通过 CLI 选项
--model-checker-ext-calls trusted
或 JSON 字段 settings.modelChecker.extCalls: "trusted"
使用此功能。
Bug 修复:
- 汇编器: 尽可能避免复制子汇编字节码。
- 代码生成器: 如果立即调用,则避免包含对引用函数的已部署标签的引用。
- ContractLevelChecker: 正确区分缺少基本构造函数参数的情况与具有未实现的基本函数的情况。
- SMTChecker: 修复了使用按位运算符时,由求解器产生的未处理的
z3
表达式引起的内部错误。
- SMTChecker: 修复了使用自定义 NatSpec 注释来抽象自由函数时的内部错误。
- TypeChecker: 还允许在
using for
中使用外部库函数。
AST 更改:
- AST: 将
function
字段添加到 UnaryOperation
和 BinaryOperation
AST 节点。 当列表条目定义运算符时,UsingForDirective
AST 节点中的 functionList
现在将包含 operator
和 definition
成员而不是 function
。
0.8.18 (2023-02-01)
语言特性:
编译器特性:
- 命令行界面: 添加
--no-cbor-metadata
,该选项跳过将 CBOR 元数据附加到字节码末尾。
- 命令行界面: 在未捕获的异常时返回退出代码
2
。
- EVM: 对于 EVM 版本 >= paris,弃用
block.difficulty
并且不允许在内联汇编中使用 difficulty()
。 此更改是由于 EIP-4399 引入的重命名。
- EVM: 对于 EVM 版本 >= paris,在 Solidity 中引入
block.prevrandao
并且在内联汇编中引入 prevrandao()
。
- EVM: 将默认 EVM 版本设置为 "Paris"。
- EVM: 支持 EVM 版本 "Paris"。
- 语言服务器: 添加基本文档悬停支持。
- Natspec: 为 devdoc 添加事件 Natspec 继承。
- 优化器: 添加优化规则
and(shl(X, Y), shl(X, Z)) => shl(X, and(Y, Z))
。
- 解析器: 关于无效版本 pragma 的更详细的错误消息。
- SMTChecker: 使
z3
成为 BMC 和 CHC 引擎的默认求解器,而不是所有求解器。
- SMTChecker: 当使用 CLI 选项
--model-checker-solvers eld
时,支持将 Eldarica 作为 CHC 引擎的 Horn 求解器。 二进制文件 eld
必须在系统中可用。
- Solidity 升级工具: 删除
solidity-upgrade
工具。
- 标准 JSON: 添加一个布尔字段
settings.metadata.appendCBOR
,该字段跳过将 CBOR 元数据附加到字节码末尾。
- TypeChecker: 警告何时使用已弃用的内置函数
selfdestruct
。
- Yul EVM 代码转换: 为始终终止事务的用户定义函数生成更优化的代码。 对于始终终止的函数的调用,不会推送返回标签。
- Yul 优化器: 允许通过在序列字符串中的冒号分隔符 (
:
) 之后指定自定义步骤来替换先前硬编码的清理序列。
- Yul 优化器: 如果该值已经被先前的调用计算出来并且可以重用,则消除
keccak256
调用。
Bug 修复:
- 解析器: 禁止同一事件参数的多个
indexed
属性。
- 解析器: 禁止对修饰符参数使用
indexed
属性。
- SMTChecker: 修复了超过 2 的幂的负整数的显示错误。
- SMTChecker: 修复了使用静态完全指定的状态变量时,链式赋值的内部错误。
- SMTChecker: 修复了多个错误的 SMTChecker natspec 条目的内部错误。
- SMTChecker: 修复了在内部调用公共库函数时的内部错误。
- SMTChecker: 修复了删除函数类型的结构成员时的内部错误。
- SMTChecker: 修复了使用用户定义类型作为映射索引或结构成员时的内部错误。
- SMTChecker: 改进了在错误消息中对作为 2 的幂或几乎是 2 的幂的大整数的可读性。
- TypeChecker: 修复了一个错误,该错误导致私有库函数可以在其声明范围之外与
using for
关联。
- Yul 优化器: 根据值的哈希值而不是其表示形式来哈希十六进制和十进制文字,从而提高了等效函数的检测。
0.8.17 (2022-09-08)
重要的 Bug 修复:
- Yul 优化器: 防止在调用有条件地终止外部 EVM 调用的 Yul 函数之前错误地删除存储写入。
编译器特性:
- 代码生成器: 更有效的乘法溢出检查。
- 语言服务器: 默认情况下分析项目中的所有文件(可以通过在 LSP 设置对象中将
'file-load-strategy'
设置为 'directly-opened-and-on-import'
来自定义)。
- Yul 优化器: 将零长度操作的起始偏移量简化为零。
Bug 修复:
- 类型检查器: 修复了在具有无效左侧的元组赋值上的内部编译器错误。
- Yul IR 代码生成: 修复了通过内联汇编中的存储引用访问映射的
.slot
成员时的内部编译器错误。
构建系统:
- 允许禁用迂腐的警告,并且不要将警告视为编译器构建期间的错误,当将
-DPEDANTIC=OFF
标志传递给 CMake 时。
- 将 emscripten 更新到版本 3.1.19。
0.8.16 (2022-08-08)
重要的 Bug 修复:
- 代码生成: 修复了影响由元组表示的 calldata 值的 ABI 编码的数据损坏:任何嵌套级别的结构; 外部函数、事件和错误的参数列表; 外部函数的返回值列表。 当最后一个组件包含静态编码的数组时,元组中第一个动态编码值的前 32 个前导字节将被清零。
编译器特性:
- 代码生成器: 更有效的检查加法和减法代码。
- TypeChecker: 支持在其他常量的初始化程序中使用库常量。
- Yul IR 代码生成: 改进了具有打包存储布局的数组的复制例程。
- Yul 优化器: 如果
A
是 2 的幂,则添加规则将 mod(add(X, Y), A)
转换为 addmod(X, Y, A)
。
- Yul 优化器: 如果
A
是 2 的幂,则添加规则将 mod(mul(X, Y), A)
转换为 mulmod(X, Y, A)
。
Bug 修复:
- 命令行界面: 禁止在编译器模式之外使用以下选项:
--via-ir
,--metadata-literal
, --metadata-hash
, --model-checker-show-unproved
, --model-checker-div-mod-no-slacks
, --model-checker-engine
, --model-checker-invariants
, --model-checker-solvers
, --model-checker-timeout
, --model-checker-contracts
, --model-checker-targets
。
- 类型检查器: 修复了左侧带有单元素元组的某些模式下涉及元组赋值的编译器崩溃。
- 类型检查器: 修复了
abi.encodeCall
接收到元组表达式而不是内联元组时的编译器崩溃。
- 类型检查器: 修复了自由函数
abi.encodeCall
类型检查中的空指针解引用。
0.8.15 (2022-06-15)
重要的 Bug 修复:
- 代码生成: 复制
bytes
数组时,避免将脏字节写入存储。
- Yul 优化器: 保留内联汇编块的所有内存副作用。
语言特性:
- 添加
E.selector
用于非匿名事件 E
以访问 32 字节的选择器主题。
编译器特性:
- 语言服务器: 添加语义高亮的基本支持。
- 语言服务器: 添加对配置
include-paths
JSON 设置对象(可以在 LSP 配置阶段传递)的支持。
- 语言服务器: 始终将
{project_root}/node_modules
添加到包含搜索路径。
- 类型检查器: 警告涉及多次推送到存储
bytes
的赋值,这些赋值可能会使引用无效。
- Yul 优化器: 改进通过 IR 代码生成和纯 Yul 编译的内联启发式方法。
Bug 修复:
- ABI 编码器: 当编码来自存储的空字符串时,不要为数据添加多余的空槽。
- 公共子表达式消除器: 以最大大小为 2000 的块处理汇编项。 这有助于避免在代码优化期间进行非常耗时的搜索。
- DocString 解析器: 修复了由带有映射的不可变结构引起的 ICE。
- Yul IR 代码生成: 在内存到存储复制期间,在极端情况下进行更强大的清理。
- Yul 优化器: 不要删除
returndatacopy
,因为在某些情况下,它可能会执行无条件地恢复为 out-of-gas 的越界读取。 以前,任何写入从未读取的内存的returndatacopy
都被删除,而没有考虑越界情况。
0.8.14 (2022-05-17)
重要的 Bug 修复:
- ABI 编码器:当对来自包含嵌套数组的 calldata 的值进行 ABI 编码时,在所有情况下,针对
calldatasize()
正确验证嵌套数组的长度。
- 覆盖检查器:仅在覆盖外部函数时,才允许更改参数的数据位置。
编译器特性:
- Assembly-Json 导出器:在
sourceList
字段中包含源代码列表。
- 命令行界面:选项
--pretty-json
也适用于以下选项:--abi
、--asm-json
、--ast-compact-json
、--devdoc
、--storage-layout
、--userdoc
。
- 语言服务器:允许语言服务器完全访问文件系统。
- Peephole 优化器:在简单终止之前删除没有副作用的操作。
- SMTChecker:支持考虑被调用选择器的
abi.encodeCall
。
Bug修复:
- Assembly-Json 导出器:修复 assembly json 导出,以在
jumpType
字段中存储操作的跳转类型,而不是 value
。
- SMTChecker:修复与 z3 >=4.8.16 的 ABI 兼容性。
- SMTChecker:修复当选择了 z3 但在运行时不可用时的错误。
- 类型检查器:正确检查
using ... global
与库结合使用的限制。
- TypeChecker:将函数类型的参数转换为它们将如何被调用以用于
abi.encodeCall
。
0.8.13 (2022-03-16)
重要Bug修复:
- 代码生成器:正确编码用于代替固定字节参数的
abi.encodeCall
中的字面量。
语言特性:
- 通用:允许将内联汇编标注为内存安全,以允许依赖于遵守 Solidity 内存模型的优化和堆栈限制规避。
- 通用:允许在文件级别使用
using M for Type;
,并且M
现在也可以是用大括号括起来的自由函数或库函数列表。
- 通用:允许在文件级别使用
using ... for T global;
,其中用户定义的类型T
已被定义,从而使语句的效果在T
可用的任何地方都可用。
编译器特性:
- 命令行界面:允许使用
--via-ir
代替--experimental-via-ir
。
- 通过 Yul IR 进行编译不再标记为实验性。
- JSON-AST:为错误和事件添加了选择器字段。
- 语言服务器:实现跳转到定义。
- Peephole 优化器:优化条件跳转之前的比较以及跨单个无条件跳转的条件跳转。
- Yul EVM 代码转换:避免在终止控制流上不必要的
pop
。
- Yul IR 代码生成:当外部调用的结果是静态大小时,忽略编译器预期大小之外的任何 returndata。
- Yul 优化器:删除从未读取的
sstore
和 mstore
操作。
Bug修复:
- 通用:修复具有不寻常大小写规则的区域设置的内部错误。现在完全忽略环境变量中设置的区域设置。
- 类型检查器:修复导入重载函数时类型检查器的错误。
- Yul IR 代码生成:使用正确的设置优化嵌入式创建代码。这修复了单独编译的合约的构造函数代码与
type(C).creationCode
中的字节码之间潜在的不匹配,以及用于new C(...)
的字节码。
0.8.12 (2022-02-16)
语言特性:
- 通用:为外部函数类型添加相等比较运算符。
- 通用:除了外部函数指针之外,还支持
ContractName.functionName
用于 abi.encodeCall
。
编译器特性:
- 命令行界面:使用
--hashes
时,还会返回事件和错误签名。
- Yul 优化器:如果插槽已经包含相同的值,则删除
mstore
和 sstore
操作。
- Yul:根据要求,为纯 yul 代码发出 immutable 引用。
Bug修复:
- Antlr 语法:允许在
yulPath
中使用内置名称,以支持函数指针中的 .address
。
- 代码生成器:修复访问占用两个以上堆栈插槽的外部函数的成员时的内部错误。
- 代码生成器:修复从
string calldata
到 bytes
进行显式转换时的内部错误。
- 控制流图:对未初始化变量和无法访问的代码分析的修饰符执行适当的虚拟查找。
- 通用:
string.concat
现在正确地将字符串作为参数并返回 string memory
。它之前被意外地作为 bytes.concat
的副本引入。
- Immutables:修复基本合约的构造函数使用
return
且派生合约包含 immutable 变量时的错误。
- 继承:在覆盖分析期间考虑所有祖先中的函数。
- IR 生成器:在将固定字节类型转换为较小的固定字节类型期间添加缺少的清理。
- IR 生成器:为值类型的索引事件参数添加缺少的清理。
- IR 生成器:修复在 calldata 和 storage 中将引用类型复制到内存中的 struct 或数组成员时的 IR 语法错误。
- IR 生成器:修复复制包含函数的 struct 的 storage 数组时的 IR 语法错误。
- Natspec:修复使用 Natspec 文档的返回值覆盖 struct getter 且 struct 中的名称不同时的内部错误。
- 类型检查器:修复常量变量声明提前引用 struct 时的内部错误。
- Yul EVM 代码转换:改进了角落情况下的堆栈混洗。
Solc-Js:
- 该包装器现在至少需要 nodejs v10。
- 代码已移植到 TypeScript。
构建系统:
- Emscripten 构建以 LZ4 压缩格式存储嵌入式 WebAssembly 二进制文件,并在加载时透明地解压缩。
0.8.11 (2021-12-20)
语言特性:
- 通用:新的内置函数
abi.encodeCall(functionPointer, (arg1, arg2, ...))
,它对参数进行类型检查并返回 ABI 编码的函数调用数据。
编译器特性:
- 命令行界面:添加
--lsp
选项以使 solc
充当通过 stdio 进行通信的语言服务器 (LSP)。
Bug修复:
- 代码生成器:修复在使用
@use-src
并从 Yul 编译到 ewasm 时发生的崩溃。
- SMTChecker:修复多次求解不安全目标且反例消息不同时的内部错误。
- SMTChecker:修复了未擦除足够知识的已分配 storage/memory 本地指针的可靠性。
- 修复了函数具有带有内部类型的 calldata struct 参数时的内部错误。
- IR 生成器:修复复制函数 storage 数组时的 IR 语法错误。
0.8.10 (2021-11-09)
语言特性:
- 内联汇编:支持外部函数指针上的
.address
和 .selector
以访问它们的地址和函数选择器。
编译器特性:
- 代码生成器:如果预期有返回数据,则跳过对外部合约的存在性检查。在这种情况下,如果合约不存在,ABI 解码器将恢复。
- 命令行界面:接受传递给
--yul-optimizations
的步骤序列中的嵌套括号。
- 命令行界面:添加
--debug-info
选项,用于选择应在生成的 EVM 汇编代码和 Yul 代码中包含多少额外的调试信息。
- 命令行界面:在汇编程序模式下支持
--asm
、--bin
、--ir-optimized
、--ewasm
和 --ewasm-ir
输出选择选项。
- 命令行界面:打印错误、警告和信息时使用不同的颜色。
- JSON AST:在
parsing
阶段更早地设置导入的绝对路径。
- SMTChecker:输出已调用函数中存在的
block.*
、msg.*
和 tx.*
变量的值。
- SMTChecker:报告合约不变量和重入属性。可以通过 CLI 选项
--model-checker-invariants
或标准 JSON 选项 settings.modelChecker.invariants
启用此功能。
- 标准 JSON:接受传递给
settings.optimizer.details.yulDetails.optimizerSteps
的步骤序列中的嵌套括号。
- 标准 JSON:添加
settings.debug.debugInfo
选项,用于选择应在生成的 EVM 汇编代码和 Yul 代码中包含多少额外的调试信息。
- Yul EVM 代码转换:使用启用的优化器通过 Yul 编译时,切换到新的优化代码转换。
- Yul 优化器:在各种优化器步骤中考虑用户定义函数的控制流副作用。
Bug修复:
- 代码生成器:修复 immutable 的构造函数源映射。
- 命令行界面:禁止在编译器模式之外使用
--error-recovery
选项。
- 命令行界面:写入链接文件到磁盘失败时,不要返回零退出代码。
- 命令行界面:修复附加到通过标准输入传递的源代码的额外换行符,从而影响它们的哈希值。
- 命令行界面:报告所选输入模式不支持的输出选择选项,而不是忽略它们。
- 命令行界面:链接时,仅接受传递给
--libraries
选项的库名称的完全匹配。以前缀没有文件名的库名称用于匹配具有该名称的任何库。
- SMTChecker:修复魔法类型访问(
block
、msg
、tx
)中的内部错误。
- SMTChecker:修复在函数选项中传递 gas 时 CHC 引擎中的内部错误。
- TypeChecker:修复在使用声明之前使用带有用户定义值类型的数组和结构时的内部错误。
- TypeChecker:修复在公共库函数中使用用户定义值类型时的内部错误。
- TypeChecker:改进了具有(嵌套)映射类型的常量变量的错误消息。
- Yul 汇编程序:修复函数名称不唯一时的内部错误。
- Yul IR 生成器:不要为空合约输出空开关/if 主体。
实验性功能中的重要 Bug 修复:
- Yul IR 生成器:如果有多个返回值变量,则在修改器调用参数中引用的函数返回值变量的更改未正确转发。
构建系统:
- 仅在链接时传递仅链接器的 emscripten 选项。
- 删除 emscripten 构建的过时兼容性解决方法。
- 将 emscripten 更新到 2.0.33 版本。
0.8.9 (2021-09-29)
重要Bug修复:
- Immutables:对带符号的 immutables 正确执行符号扩展。
- 用户定义值类型:修复短于 32 字节的基础类型的用户定义值类型的 storage 布局。
Bug修复:
- AST:为
UserDefinedValueTypeDefinition
和 ContractDefinition
导出 canonicalName
。
0.8.8 (2021-09-27)
语言特性:
- 继承:仅覆盖单个接口函数的函数不需要
override
说明符。
- 类型系统:支持枚举的
type(E).min
和 type(E).max
。
- 用户定义值类型:允许在具有更严格类型要求的值类型上创建零成本抽象。
编译器特性:
- 命令行界面:添加
--include-path
选项,用于指定可能包含可导入代码(例如,打包的第三方库)的额外目录。
- 命令行界面:除非请求的输出需要,否则不要隐式运行 evm 字节码生成。
- 命令行界面:规范化命令行上指定的路径,并为位于基本路径和/或包含路径内的文件使其成为相对路径。
- 一旦初始化,就可以在构造时读取 Immutable 变量。
- SMTChecker:添加约束以更好地关联
address(this).balance
和 msg.value
。
- SMTChecker:通过模块支持常量。
- SMTChecker:支持低级
call
作为对未知代码的外部调用。
- SMTChecker:支持外部函数调用的
value
选项。
- SMTChecker:支持用户定义的值类型。
Bug修复:
- 代码生成器:修复在内联汇编中分配给 calldata struct 和静态大小的 calldata 数组时的 ICE。
- 代码生成器:对 ABI 函数使用稳定的源顺序。
- 命令行界面:禁止在标准 JSON、汇编程序和链接器模式下使用
--experimental-via-ir
选项。
- 命令行界面:修复使用
--allowed-paths
允许的路径或由于基本路径、重映射和正在编译的文件而隐式允许的路径的解析。正确处理由于相对、非规范化或为空而与导入不完全匹配的路径。
- 命令行界面:报告标准 JSON 和链接器模式下无效的优化器选项,而不是忽略它们。
- 名称解析器:修复了使用
import {AliasedName} from "a.sol"
导入别名符号时,它将使用符号的原始名称而不是别名名称的问题。
- Opcode 优化器:防止优化器多次运行,以避免引用代码的潜在字节码差异。
- Parser:正确检查彼此相邻的多个 SPDX 许可证标识符并验证它们。
- SMTChecker:修复 BMC 关于内部函数的约束。
- SMTChecker:修复了由内部函数返回的 storage 数组引用上的
push
引起的误报。
- SMTChecker:修复了构造函数中外部调用的误报。
- SMTChecker:修复了
abi.*
、加密函数和常量的某些多源使用中的内部错误。
- Standard JSON:修复了 Yul 模式下的非致命错误在致命错误之后被丢弃的问题。
- 类型检查器:修复了内联汇编中关于
.slot
或 .offset
无效的错误消息,而实际上使用了 .length
时的错误消息。
- 类型检查器:禁止在接口中声明和定义修饰符。
- Yul 优化器:修复了在 LoadResolver 中,当
keccak256
具有特定的非标识符参数时发生的崩溃。
0.8.7 (2021-08-11)
语言特性:
- 引入全局
block.basefee
用于检索当前区块的基本费用。
- Yul:引入内置
basefee()
用于检索当前区块的基本费用。
编译器特性:
- AssemblyStack:在编译 Yul 代码时也运行基于操作码的优化器。
- 命令行界面:选项
--pretty-json
也适用于 --standard--json
。
- EVM:将默认 EVM 版本设置为“伦敦”。
- 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 优化器:使用实验性堆栈限制规避器(默认情况下未启用)将函数参数和返回变量移动到内存中。
Bug修复:
- 代码生成器:修复将空字符串文字传递给
bytes.concat()
时发生的崩溃。
- 代码生成器:修复调用绑定到 calldata struct 和数组的函数时发生的内部编译器错误。
- 代码生成器:通过禁止此类文字,修复将 32 字节十六进制文字或零文字传递给
bytes.concat()
时发生的内部编译器错误。
- 命令行界面:在汇编/yul 模式下应用
--optimizer-runs
选项。
- 命令行界面:修复将目录路径传递给
--standard-json
时发生的崩溃。
- 命令行界面:当
--standard-json
接收到 -
作为文件名时,从标准输入读取 JSON。
- 标准 JSON:包括具有空名称的文件的错误的源位置。
- 类型检查器:修复内部错误并阻止对未实现的修饰符进行静态调用。
- Yul 代码生成器:修复使用带有按位取反的长文字时发生的内部编译器错误。
- Yul 代码生成器:修复对内置函数的调用源位置引用。
- Yul Parser:修复
if
语句的源位置引用。
0.8.6 (2021-06-22)
语言特性:
- Yul:Yul 对象中
".metadata"
数据对象的特殊含义。
Bug修复:
- 控制流图:修复错误报告的无法访问的代码。
- Solc-Js:在不使用
--optimize
标志运行 solcjs
时,在标准 JSON 中使用 settings.optimizer.enabled=false
而不是省略该键。
- 标准 JSON:省略
settings.optimizer.enabled
并不等同于将其设置为 false
。它意味着禁用 peephole 优化器和 jumpdest 删除器,默认情况下它们仍然以 enabled=false
运行。
0.8.5 (2021-06-10)
语言特性:
- 允许从
bytes
和bytes
切片转换为bytes1
/.../bytes32
。
- Yul:添加
verbatim
内置函数来注入任意字节码。
编译器特性:
- 代码生成器:插入恐慌代码的辅助函数,而不是无条件地内联。如果插入了许多恐慌(检查),这可以降低成本,但如果使用的恐慌很少,则可能会增加成本。
- EVM:将默认 EVM 版本设置为“柏林”。
- SMTChecker:函数定义可以使用自定义 Natspec 标签
custom:smtchecker abstract-function-nondet
注释,以便在调用时由非确定性值抽象。
- 标准 JSON / 合并 JSON:新的 artifact “functionDebugData”,其中包含函数入口点的字节码偏移量以及未来可能包含的更多信息。
- Yul 优化器:评估
keccak256(a, c)
,当内存位置a
的值在编译时已知且c
是常量<= 32
时。
Bug修复:
- AST:如果 Yul 字面量不是有效的 UTF-8 字符串,则不输出该值。
- 代码生成器:修复当函数数组分配给存储变量且函数类型可以隐式转换但不相同时发生的内部错误。
- 代码生成器:修复当 super 必须跳过虚拟解析顺序中未实现的函数时发生的内部错误。
- 控制流图:假设未实现的修饰符使用占位符。
- 控制流图:考虑始终恢复的函数的内部调用,以报告未使用的或未分配的变量。
- 函数调用图:修复与循环常量引用相关的内部错误。
- 名称解析器:如果阴影名称无法直接访问,则不发出阴影警告。
- Natspec:允许在公共状态变量文档上使用多个
@return
标签。
- SMTChecker:修复从
bytes
到fixed bytes
转换时的内部错误。
- SMTChecker:修复从构造函数进行的外部调用中的内部错误。
- SMTChecker:修复用字符串文字初始化的固定字节成员的结构构造函数中的内部错误。
- 源位置:正确设置作用域块的源位置。
- 标准 JSON:正确允许
settings.optimizer.details
下的inliner
设置。
- 类型检查器:修复与抽象合约的构造函数参数中具有映射类型相关的内部编译器错误。
- 类型检查器:修复尝试在 pre-byzantium EVM 上使用无效的外部函数类型时发生的内部编译器错误。
- 类型检查器:修复使用具有不同参数的函数覆盖 receive ether 函数时在继承期间发生的内部编译器错误。
- 类型检查器:将事件或错误参数中(嵌套的)映射类型的错误转换为致命的类型错误。
- 类型检查器:修复用未实现的修饰符覆盖已实现的修饰符时发生的内部编译器错误。
AST 更改:
- 为 Yul 字符串和十六进制字面量添加成员
hexValue
。
0.8.4 (2021-04-21)
重要 Bug 修复:
- ABI 解码器 V2:对于二维数组和内存中专门制作的数据,
abi.decode
的结果可能取决于内存中其他位置的数据。Calldata 解码不受
语言特性:
- 汇编 / Yul:允许使用十六进制字符串文字。
- 可以将
bytes.concat
与可变数量的的bytes
和bytesNN
参数一起使用,其行为类似于abi.encodePacked
的限制版本,具有更具描述性的名称。
- 通过
error
关键字支持自定义错误并引入了revert
语句。
编译器特性:
- 分析:正确检测跨所有函数调用的对其他合约字节码的循环引用。
- 命令行界面:模型检查器选项
--model-checker-targets
也接受outOfBounds
。
- 命令行界面:新的模型检查器选项
--model-checker-contracts
允许用户选择应将哪些合约分析为最派生的合约。
- 低级内联器:内联跳转到小块的普通跳转以及跳转到终止的小块的跳转。
- NatSpec:允许在非公共状态变量和局部变量声明上使用
@notice
标记。文档将仅是 AST 的一部分,位于documentation
字段下。
- SMTChecker:弃用
pragma experimental SMTChecker;
并将默认模型检查器引擎设置为none
。
- SMTChecker:在 CHC 反例中报告局部变量。
- SMTChecker:报告数组和固定字节的越界索引访问。
- SMTChecker:支持文件级别函数和常量。
- 标准 JSON:模型检查器选项
settings.modelChecker.targets
也接受outOfBounds
。
- 标准 JSON:模型检查器选项
settings.modelChecker.targets
采用字符串目标的数组,而不是逗号分隔目标的字符串。
- 标准 JSON:新的模型检查器选项
settings.modelChecker.contracts
允许用户选择应将哪些合约分析为最派生的合约。
- Yul EVM 代码转换:堆栈优化:重用未使用的函数参数的插槽,并延迟为返回变量分配堆栈插槽,直到不引用它们的表达式语句和赋值之后。
- Yul 优化器:添加了一个新的步骤 FunctionSpecializer,该步骤使用其文字参数来专门化函数。
Bug 修复:
- Antlr 语法:修复了涉及正确区分一般情况下空字符串文字和非空字符串文字的导入路径的解析。
- AST 输出:修复基本构造函数调用的
ModifierInvocation
的kind
字段。
- 命令行界面:修复了打印 AST 并在导入中使用
--base-path
或file://
prefix 时的内部错误。
- 命令行界面:修复了绕过允许的路径检查的标准输入。
- Natspec:修复了与覆盖函数的公共状态变量的
@returns
文档相关的内部错误。
- SMTChecker:修复了作为复合赋值的 LHS 的
push
上的误报和漏报。
- SMTChecker:修复了无法部署的合约中的误报。
- SMTChecker:修复了在较旧的 EVM 版本上返回动态数据的公共 getter 上的内部错误,在这些 EVM 版本上这些数据不可用。
- SMTChecker:修复了 try-catch 中 catch 块中带有函数调用的内部错误。
- 类型检查器:修复了在没有 emit 语句的情况下使用事件时缺少错误的问题。
AST 更改:
ContractDefinition
节点的新属性:usedErrors
列出了合约使用的所有错误的 AST ID(即使在外部定义)。
0.8.3 (2021-03-23)
重要 Bug 修复:
- 优化器:修复了 Keccak-256 哈希不正确缓存的问题。
编译器特性:
- 命令行界面:删除对
--machine evm15
的实验性支持。
- 优化器:尝试将内部带有常量的
and
移入or
以改善小类型的存储写入。
- 优化器:用移位代替是 2 的幂的乘法和除法。
Bug 修复:
- AST 导入:对于构造函数,在导入期间会忽略 public 可见性。
- 错误报告器:修复了回车符的处理。
- SMTChecker:修复了在分支内解析虚拟函数时 BMC 中的内部错误。
- SMTChecker:修复了嵌套在 1 元组内的
array.pop
的内部错误。
- SMTChecker:修复了用字符串文字初始化的
FixedBytes
常量的内部错误。
- SMTChecker:修复了数组切片的内部错误。
- SMTChecker:修复了在结构体类型的状态变量(可能是嵌套的)的数组上调用公共 getter 时的内部错误。
- SMTChecker:修复了推送到转换为
bytes
的string
的内部错误。
- SMTChecker:修复了构造函数调用的虚拟函数中的错误。
AST 更改:
- ModifierInvocation:添加了
kind
字段,可以是modifierInvocation
或baseConstructorSpecifier
。
0.8.2 (2021-03-02)
编译器特性:
- AST:导出每个语句上方的 NatSpec 注释作为其文档。
- 内联汇编:不再警告变量或函数被 EVM 操作码隐藏。
- NatSpec:为解析错误提供源位置。
- 优化器:在跳转到几个无副作用操作码之后再次跳转到小块时进行简单内联。
- NatSpec:允许和导出所有以
@custom:
开头的标签。
Bug 修复:
- AST:为枚举成员添加了
referencedDeclaration
。
- 代码生成器:修复了当函数作为其他可调用对象的参数传递,当函数类型可以隐式转换但不相同时发生的内部错误。
- Parser:在某些情况下正确解析
.address
。
- SMTChecker:修复了部署阶段中 block 和 transaction 变量缺少类型约束的问题。
- 类型检查器:修复了 override 说明符不是合约时的内部错误。
- 类型检查器:将函数哈希冲突错误转换为致命类型错误。
AST 更改:
- 将
nameLocation
添加到声明以表示符号名称的确切位置。
- 删除了冗余的函数类型“bytearraypush” - 由“arraypush”代替。
- 支持字段
documentation
以保存每个语句上方的 NatSpec 注释。
0.8.1 (2021-01-27)
语言特性:
- 可以使用
catch Panic(uint code)
来捕获来自外部调用的恐慌失败。
编译器特性:
- 代码生成器:通过直接使用
extcodesize
来降低<address>.code.length
的成本。
- 命令行界面:允许在
--libraries
命令行选项中使用=
作为库名称和地址之间的分隔符。
- 命令行界面:新的选项
--model-checker-targets
允许指定应检查哪些目标。有效选项为all
、constantCondition
、underflow
、overflow
、divByZero
、balance
、assert
、popEmptyArray
,其中默认值为all
。可以同时选择多个目标,用逗号分隔,没有空格:underflow,overflow,assert
。
- 命令行界面:仅在
--libraries
命令行选项中接受带有0x
前缀的库地址。
- 优化器:添加规则以用
eq(x,y)
替换iszero(sub(x,y))
。
- Parser:如果解析版本 pragma 失败,则报告有意义的错误。
- SMTChecker:在反例的 transaction 跟踪中输出内部和受信任的外部函数调用。
- SMTChecker:当大于 0 时,在反例 transaction 跟踪中显示
msg.value
。
- SMTChecker:在反例函数调用中显示合约名称。
- SMTChecker:支持 ABI 函数作为未解释的函数。
- SMTChecker:支持 try/catch 语句。
- SMTChecker:综合外部调用的不受信任的函数。
- SMTChecker:默认情况下使用检查的算术并支持
unchecked
块。
- 标准 JSON:新的选项
modelCheckerSettings.targets
允许指定应检查哪些目标。有效选项为all
、constantCondition
、underflow
、overflow
、divByZero
、balance
、assert
、popEmptyArray
,其中默认值为all
。可以同时选择多个目标,用逗号分隔,没有空格:underflow,overflow,assert
。
Bug 修复:
- 代码生成器:修复在 catch 子句中解码格式错误的错误数据时的长度检查。
- 控制流图:修复由于从/向未初始化的变量的读取/写入引起的缺少错误。
- SMTChecker:修复了覆盖修饰符和函数中的误报。
- SMTChecker:修复了内联汇编存在时的误报。
- SMTChecker:修复了分析外部函数调用时的误报。
- SMTChecker:修复了
block.chainid
上的内部错误。
- SMTChecker:修复了将字符串文字推送到
bytes
数组的内部错误。
- SMTChecker:修复了 block 变量缺少类型约束的问题。
- 类型检查器:修复了从内联汇编中访问循环常量时引起的无限循环。
- 类型检查器:修复了由包含映射的常量结构引起的内部错误。
- 类型系统:当
M > N
时,禁止从uintN
到intM
的隐式转换,并且扩展后,也禁止在相同类型之间进行显式转换。
构建系统:
- 将 soljson.js 构建更新到 emscripten 2.0.12 和 boost 1.75.0。
0.8.0 (2020-12-16)
重大更改:
- 代码生成器:默认情况下会检查所有算术。可以使用
unchecked { ... }
禁用这些检查。
- 代码生成器:如果访问的 storage 中的字节数组的长度编码不正确,则会引起 panic。
- 代码生成器:在失败的断言上使用带有错误签名
Panic(uint256)
和错误代码的revert
而不是无效的操作码。
- 命令行界面:JSON 字段
abi
,devdoc
,userdoc
和storage-layout
现在是子对象而不是字符串。
- 命令行界面:删除
--old-reporter
选项。
- 命令行界面:删除旧的
--ast-json
选项。现在仅支持--ast-compact-json
选项。
- 通用:默认情况下启用 ABI coder v2。
- 通用:删除全局函数
log0
、log1
、log2
、log3
和log4
。
- Parser:求幂是右结合的。
a**b**c
解析为a**(b**c)
。
- Scanner:删除对
\b
、\f
和\v
转义序列的支持。
- 标准 JSON:删除
legacyAST
选项。
- 类型检查器:函数调用选项只能给出一次。
- 类型系统:不允许使用名称
this
,super
和_
进行声明,公共函数和事件除外。
- 类型系统:在
receive()
函数中不允许使用msg.data
。
- 类型系统:不允许使用
type(super)
。
- 类型系统:不允许使用超过 256 个成员的枚举。
- 类型系统:禁止从负数文字和大于
type(uint160).max
的文字到address
类型的显式转换。
- 类型系统:禁止使用
byte
类型。它是bytes1
的别名。
- 类型系统:显式转换为
address
类型始终返回非 payable 的address
类型。特别是,address(u)
,address(b)
,address(c)
和address(this)
具有address
类型而不是address payable
(此处u
,b
和c
是类型分别为uint160
,bytes20
和合约类型的任意变量。)
- 类型系统:如果它同时更改了符号、宽度或种类中的多个,则禁止在两种类型之间进行显式转换。
- 类型系统:仅当该值适合枚举时,才允许从文字到枚举的显式转换。
- 类型系统:从文字到整数类型的显式转换与隐式转换一样严格。
- 类型系统:引入
address(...).code
以检索作为bytes memory
代码。可以通过address(...).code.length
获取大小,但是当前它总是包括复制代码。
- 类型系统:引入
block.chainid
以检索当前的 chain id。
- 类型系统:支持
address(...).codehash
以检索账户的代码哈希。
- 类型系统:全局变量
tx.origin
和msg.sender
具有address
类型而不是address payable
。
- 类型系统:一元取反只能在有符号整数上使用,而不能在无符号整数上使用。
- View Pure Checker:将
chainid
标记为 view。
- Yul:即使给定的方言/EVM 版本不可用,也不允许使用保留的标识符,例如 EVM 指令。
- Yul:在“带有对象的 EVM”方言中的
assignimmutable
内置函数将作为附加参数修改代码的基本偏移量。
语言特性:
- 现在可以使用成员表示法调用 Super 构造函数,例如
M.C(123)
。
Bug 修复:
- 类型检查器:在使用数组长度表达式中的常量时,执行适当的截断整数算术。
AST 更改:
- 新的 AST 节点
IdentifierPath
在许多地方替换了UserDefinedTypeName
。
- 新的 AST 节点
UncheckedBlock
用于unchecked { ... }
。
0.7.6 (2020-12-16)
语言特性:
- 代码生成器:支持从 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:正确过滤请求的输出工件。
Bug修复:
- 代码生成器:不要在 ABI coder v1 中用单个 32 字节的零字段填充空字符串字面量。
- NatSpec:修复了在继承没有参数的修饰器的返回参数文档时发生的段错误。
- SMTChecker:修复了将字符串字面量强制转换为字节数组的问题。
- SMTChecker:修复了使用字符串字面量进行按位复合赋值时发生的内部编译器错误。
- SMTChecker:修复了尝试使用旧 z3 生成反例时发生的内部错误。
- SMTChecker:修复了在没有 SMT 求解器可用时,某些启用 SMT 的源上可能发生的段错误。
- SMTChecker:修复了
bytes.push()
用作赋值的 LHS 时发生的内部错误。
- 类型检查器:
super
在库中不可用。
- 类型检查器:不允许在 sized-types 中使用前导零(例如
bytes000032
),但允许将它们视为标识符。
- Yul 优化器:修复了 NameSimplifier 中的一个 bug,其中 NameSimplifier 创建的新名称也可能由 NameDispenser 创建。
- Yul 优化器:从用户可用的优化步骤中删除了 NameSimplifier。
0.7.5 (2020-11-18)
语言特性:
- 能够使用
pragma abicoder v1
和 pragma abicoder v2
选择 abi coder。
- 内联汇编:使用动态数组类型的 calldata 变量的
.offset
和 .length
来访问它们的 calldata 偏移量和长度(元素数量)。 它们都可以被赋值。
- 具有字面量数字值的不可变变量被认为是 pure 的。
编译器特性:
- 汇编器:当提供库地址时,在汇编模式下执行链接。
- 命令行界面:新选项
--experimental-via-ir
允许切换编译过程以通过 Yul 中间表示。 这是高度实验性的,用于开发目的。
- 命令行界面:新选项
--model-checker-timeout
设置 SMTChecker 执行的每个单独查询的超时时间(以毫秒为单位)。
- 命令行界面:如果在
--standard-json
模式下无法读取文件,则报告错误。
- 命令行界面:报告每个无法写入的输出文件的正确错误。 先前在第一个错误时抛出异常并中止执行。
- SMTChecker:在 CHC 引擎中添加除零检查。
- SMTChecker:使用
this
更精确地分析外部调用。
- SMTChecker:支持在编译时值已知的表达式的
selector
。
- Standard JSON:新选项
modelCheckerSettings.timeout
设置 SMTChecker 执行的每个单独查询的超时时间(以毫秒为单位)。
- Standard JSON:新选项
settings.viaIR
允许与命令行上的 --experimental-via-ir
相同的切换。
Bug修复:
- 代码生成器:修复了抽象合约缺少创建依赖跟踪的问题。
- 命令行界面:修复了传递给
--output-dir
的目录以斜杠结尾时的写入错误。
- 命令行界面:拒绝
--libraries
选项中的重复库,而不是任意选择一个。
- NatSpec:修复了继承返回参数文档,但基类和继承类之间的参数名称不同时发生的内部错误。
- SMTChecker:修复了在修饰器内部使用分支时 CHC 产生的误报。
- SMTChecker:修复了多次应用修饰器时的漏报。
- SMTChecker:修复了 CHC 引擎报告的不正确的反例。
- SMTChecker:修复了当来自不同源单元的继承合约具有私有状态变量时,BMC 引擎中发生的内部错误。
- SMTChecker:修复了从字符串字面量转换为字节时发生的内部错误。
- SMTChecker:修复了
array.push()
用作赋值的 LHS 时发生的内部错误。
- SMTChecker:修复了通过合约名称分配状态变量时发生的内部错误。
- SMTChecker:修复了在条件运算符内部使用有理字面量元组时发生的内部错误。
- SMTChecker:修复了仅使用 CHC 引擎时缺少报告潜在违规的问题。
- Standard JSON:修复了即使文件名不匹配,也使用在
libraries
中指定的库地址进行链接的问题。
AST 更改:
- 内联汇编标识符的新成员
suffix
。 当前支持的值为 "slot"
、"offset"
和 "length"
,用于访问 Solidity 变量的组件。
0.7.4 (2020-10-19)
重要的 Bug 修复:
- 代码生成器:修复了将空字节数组从内存或 calldata 复制到存储时的数据损坏 bug。
语言特性:
编译器特性:
- 命令行界面:新选项
--model-checker-engine
允许选择特定的 SMTChecker 引擎。 选项包括 all
(默认)、bmc
、chc
和 none
。
- 控制流图:对于未命名的返回参数的非空函数,如果在所有代码路径中未分配值,则打印警告。
- SMTChecker:支持 CHC 引擎中的
keccak256
、sha256
、ripemd160
和 ecrecover
。
- SMTChecker:支持内联数组。
- SMTChecker:支持 CHC 引擎中的变量
block
、msg
和 tx
。
- Standard JSON:新选项
modelCheckerSettings.engine
允许选择特定的 SMTChecker 引擎。 选项包括 all
(默认)、bmc
、chc
和 none
。
Bug修复:
- 代码生成器:修复了当前模块的
ABIEncoderV2
pragma 影响继承函数和应用的修饰器的问题。
- 代码生成器:修复了通过模块名称引用成员但不使用该引用时发生的内部编译器错误。
- 代码生成器:修复了从库函数返回包含映射的结构体时发生的内部错误。
- 代码生成器:对于 getter 中越界的数组索引访问,使用 revert 而不是无效操作码。
- 合约级别检查器:在 ABIEncoderV1 合约中添加了缺少的使用 ABIEncoderV2 返回类型的继承函数的检查。
- 名称解析器:修复了对后续声明的阴影/同名警告。
- 类型检查器:允许合约类型的数组作为类型表达式和
abi.decode
的参数。
- 类型检查器:禁止将库名称无效地用作类型名称。
- 类型检查器:修复了由库中具有嵌套映射的存储参数引起的内部编译器错误。
0.7.3 (2020-10-07)
重要的 Bug 修复:
- 代码生成器:正确清理将动态数组复制到打包类型的存储后。
编译器特性:
- 代码生成器:实现了具有函数类型作为其索引参数之一的事件。
- 常规:选择在解析阶段之后停止编译的选项。 可以与
solc --stop-after parsing
一起使用
- 优化器:当基数为
-1
时优化 exp
。
- SMTChecker:支持
addmod
和 mulmod
。
- SMTChecker:支持数组切片。
- SMTChecker:支持类型转换。
Bug修复:
- 修复了涉及
new
表达式的某些合约的内部编译器错误。
- JSON AST:修复了在 ABIEncoderV2 合约中使用
--ast-json
处理具有内存参数的函数时发生的内部错误。
- 类型检查器:在未启用 ABIEncoderV2 的模块中,为使用与 ABIEncoderV1 不兼容的类型进行的调用添加缺少的检查。
- 类型检查器:修复了为具有嵌套映射的存储数组调用
.push(<arg>)
时发生的内部编译器错误。
0.7.2 (2020-09-28)
重要的 Bug 修复:
- 类型检查器:禁止具有相同名称(可能已导入和别名)和参数类型的两个或多个 free 函数。
编译器特性:
- 通过 standard-json 或 combined-json 导出编译器生成的实用程序源。
- 优化器:当基数为 0、1 或 2 时优化
exp
。
- SMTChecker:即使通过赋值,也要保留有关字符串文字的知识,从而正确支持
.length
属性。
- SMTChecker:支持使用字面量进行
address
类型转换,例如 address(0)
。
- SMTChecker:支持
revert()
。
- SMTChecker:支持
type(T).min
、type(T).max
和 type(I).interfaceId
。
- SMTChecker:支持复合 and、or 和 xor 运算符。
- SMTChecker:支持事件和底层日志。
- SMTChecker:支持固定字节索引访问。
- SMTChecker:支持内存分配,例如
new bytes(123)
。
- SMTChecker:支持移位。
- SMTChecker:支持结构体。
- 类型检查器:解释了为什么超大的十六进制字符串字面量无法显式转换为较短的
bytesNN
类型。
- 类型检查器:为什么隐式转换失败的更详细的错误消息。
- 类型检查器:报告
unicode""
字面量中第一个无效 UTF-8 序列的位置。
- Yul IR 生成器:报告与未实现的功能相关的源位置。
- Yul 优化器:首先内联到调用图中更深处的函数中。
- Yul 优化器:删除函数中未使用的参数。
- Yul 优化器:尝试简化函数名称。
Bug修复:
- 代码生成器:修复了在没有
RETURNDATACOPY
的 EVM 版本上从返回参数中剥离动态类型时发生的内部错误。
- 类型检查器:当禁用 ABIEncoderV2 时,在 ABI 编码函数中添加了缺少的使用嵌套动态数组的检查。
- 类型检查器:更正了对无效命名参数的错误消息,以引用调用的正确自变量。
- 类型检查器:禁止库中修饰器的
virtual
。
- 名称解析器:更正了对同名但未遮蔽声明的警告。
- 类型系统:修复了合约实例隐式转换为其
super
类型时发生的内部错误。
- 类型系统:修复了字符串字面量隐式转换为 calldata 字符串时发生的内部错误。
- 类型系统:如果声明的顺序与声明不同,则修复了重载函数和事件调用中的命名参数匹配不正确的问题。
- ViewPureChecker:阻止对构造函数的可见性检查。
0.7.1 (2020-09-02)
语言特性:
- 允许在合约之外定义函数,其行为很像内部库函数。
- 代码生成器:实现了将结构体从 calldata 复制到存储。
编译器特性:
- SMTChecker:在 CHC 引擎中添加下溢和溢出作为验证条件。
- SMTChecker:支持按位或、异或和非运算符。
- SMTChecker:支持条件运算符。
- Standard JSON 接口:如果仅请求 Yul IR 或 EWasm 输出,则不运行 EVM 字节码代码生成。
- Yul 优化器:LoopInvariantCodeMotion 可以将读取操作移到 for 循环之外,只要受影响的区域在循环内未被修改。
- Yul:当对
datasize()
、dataoffset()
、linkersymbol()
、loadimmutable()
、setimmutable()
使用非字符串字面量时,报告错误。
Bug修复:
- AST:即使编译器以 standard-json-mode 模式使用,也删除
null
成员值。
- 常规:允许抽象合约和接口的
type(Contract).name
。
- Immutables:禁止在声明期间多次分配 immutables。
- Immutables:正确地将复杂赋值和递增/递减操作视为读写操作,因此禁止在 immutable 变量的任何地方使用。
- 优化器:即使常量
a
和 b
会使表达式无条件地为零,也要保留 x
在 byte(a, shr(b, x))
中的副作用。 即使在无法以可能导致无效代码的方式触发此优化器规则的情况下,此优化器规则也很难(如果不是不可能)触发。
- 引用解析器:修复了使用库的构造函数时发生的内部错误。
- 扫描器:修复了在
->
Token中允许空格的 bug(例如,function f() - > x {}
在内联汇编和 Yul 中变为无效)。
- SMTChecker:修复了 BMC 函数内联中的内部错误。
- SMTChecker:修复了数组隐式转换中的内部错误。
- SMTChecker:修复了固定字节索引访问中的内部错误。
- SMTChecker:修复了具有元组的左值一元运算符中的内部错误。
- SMTChecker:修复了元组赋值中的内部错误。
- SMTChecker:修复了具有元组类型的单元素元组中的内部错误。
- SMTChecker:修复了使用导入代码时发生的内部错误。
- SMTChecker:修复了数组
pop
的可靠性。
- 类型检查器:禁止接口内部的
using for
指令。
- 类型检查器:禁止将有符号字面量作为幂运算符中的指数。
- 类型检查器:禁止在内存中包含嵌套映射的结构体和 calldata 作为库函数的参数。
- Yul 优化器:确保 Yul 关键字不会被 NameDispenser 和 VarNameCleaners 错误地使用。 该错误将表现为无法编译的代码。
- Yul 优化器:使函数内联顺序更能抵抗是否存在不相关的源文件。
0.7.0 (2020-07-28)
重大更改:
- 内联汇编:禁止在用户定义的函数和变量名称中使用
.
。
- 内联汇编:存储指针变量
x
的槽和偏移量通过 x.slot
和 x.offset
而不是 x_slot
和 x_offset
访问。
- JSON AST:用
kind: "hexString"
标记十六进制字符串字面量。
- JSON AST:从 JSON 输出中删除
null
值的成员。
- 解析器:禁止将
gwei
作为标识符。
- 解析器:禁止对
value
和 gas
使用点语法。
- 解析器:禁止在字符串字面量中使用不可打印字符。
- 解析器:引入 Unicode 字符串字面量:
unicode"😃"
。
- 解析器:变量的 NatSpec 注释仅允许用于 public 状态变量。
- 解析器:删除
finney
和 szabo
面额。
- 解析器:删除标识符
now
(由 block.timestamp
替换)。
- 引用解析器:
using A for B
仅影响被提及的合约,而不影响所有派生合约。
- 类型检查器:禁止库函数的
virtual
。
- 类型检查器:禁止嵌套映射的状态变量赋值。
- 类型检查器:禁止在继承层次结构中具有相同名称和参数类型的事件。
- 类型检查器:禁止有符号类型进行移位。
- 类型检查器:如果结构体和数组包含嵌套映射,则禁止在内存或 calldata 中使用。
- 类型检查器:字面量指数的幂运算和移位将始终使用
uint256
或 int256
作为类型。
- Yul:禁止在标识符中使用连续和尾随的点。 已经禁止前导点。
- Yul:禁止 EVM 指令
pc()
。
语言特性:
- 继承:允许覆盖具有更严格的状态可变性:
view
可以覆盖 nonpayable
,pure
可以覆盖 view
。
- 解析器:不建议使用构造函数的可见性。
- 状态可变性:不对 virtual 函数发布更严格的可变性建议,但对覆盖的函数发布。
编译器特性:
- SMTChecker:报告多交易反例,包括启动交易的函数调用。 这不包括引用类型和重入调用的具体值。
- 不再识别使用
var
关键字的变量声明。
Bug修复:
- Immutables:修复了未分配 immutables 时发生的内部编译器错误。
- 继承:禁止 public 状态变量覆盖
pure
函数。
- NatSpec:构造函数和函数具有一致的 userdoc 输出。
- SMTChecker:修复了分配给 1 元组时发生的内部错误。
- SMTChecker:修复了元组具有额外的无效果括号时发生的内部错误。
- 状态可变性:常量 public 状态变量被认为是
pure
函数。
- 类型检查器:修复了函数调用具有命名参数时函数类型的推导问题。
0.6.12 (2020-07-22)
语言特性:
- NatSpec:实现标签
@inheritdoc
以从特定基合约复制文档。
- Wasm 后端:添加
i32.ctz
、i64.ctz
、i32.popcnt
和 i64.popcnt
。
编译器特性:
- 代码生成器:避免复制到内存时的双重清理。
- 代码生成器:在编译时评估字符串字面量的
keccak256
。
- 优化器:添加规则以删除字节操作码内的移位。
- Peephole 优化器:添加规则以删除 dup 后的交换。
- Peephole 优化器:删除不必要的标签屏蔽。
- Yul EVM 代码转换:在访问变量声明的右侧后立即释放堆栈槽,而不是仅在语句的末尾释放。
Bug修复:
- SMTChecker:修复了类型为静态数组的索引事件中的错误。
- SMTChecker:修复了顺序存储数组推送中的内部错误(
push().push()
)。
- SMTChecker:修复了对固定字节类型使用按位运算符时发生的内部错误。
- SMTChecker:修复了在分支内的数组索引上使用复合按位运算符赋值时发生的内部错误。
- 类型检查器:修复了与超大类型相关的内部编译器错误。
- 类型检查器:修复了与
{value: ...}
结合使用的重载解析。
构建系统:
- 将 jsoncpp 的内部依赖项更新到 1.9.3。
0.6.11 (2020-07-07)
语言特性:
- 常规:添加单位面额
gwei
- Yul:支持独立程序集模式下的
linkersymbol
内置函数以引用库地址。
- Yul:支持使用超过 32 字节的字符串文字作为内置函数的文字参数。
编译器特性:
- NatSpec:将字段
kind
和 version
添加到 JSON 输出。
- NatSpec:如果派生函数未提供任何标签,则从唯一的基本函数继承标签。
- 命令行界面:防止一些不兼容的命令行选项一起使用。
- NatSpec:支持事件的 NatSpec 注释。
- Yul 优化器:在
a := sload(x)
/ a := mload(x)
之后存储有关存储/内存的知识。
- SMTChecker:支持对未知代码的外部调用。
- 源映射:还将进出 Yul 函数的跳转标记为进出函数的跳转。
Bug修复:
- NatSpec:不要将
////
和 /***
视为 NatSpec 注释。
- 类型检查器:禁止使用
calldata
数据位置的构造函数参数。
- 类型检查器:不要禁止分配给 calldata 变量。
- 类型检查器:修复了应用于非库的
using for
相关的内部错误。
- Wasm 后端:修复了具有 pre 语句的 for 循环的代码生成。
- Wasm 后端:正确支持
i32.drop
和 i64.drop
,并删除 drop
。
- Yul:禁止同一变量在赋值的左侧多次出现。
- Yul:修复了变量多重赋值的源位置。
0.6.10 (2020-06-11)
重要的 Bug 修复:
- 修复了通过
using for
调用的具有 calldata
参数的内部库函数相关的 bug。
编译器特性:
- 命令行界面:重新组合帮助屏幕。
- 在 standard-json 中和使用
--error-codes
时输出编译错误代码。
- Yul:对于只有 default 而没有其他 case 的 switch 语句,发出警告。
Bug修复:
- SMTChecker:修复了编码元组的元组时发生的内部错误。
- SMTChecker:修复了推送到数组指针后的别名可靠性。
- 类型系统:修复了在外部调用返回具有 calldata 位置的变量的函数时发生的内部编译器错误。
- 类型系统:修复了如果将
using for
应用于显式引用类型,则找不到绑定函数的问题。
0.6.9 (2020-06-04)
语言特性:
- 允许所有变量使用 calldata 位置。
- NatSpec:支持对状态变量的 NatSpec 注释。
- Yul:EVM 指令
pc()
被标记为已弃用,将在下一个重大版本中删除。
编译器特性:
- 构建系统:将 soljson.js 构建更新到 emscripten 1.39.15 和 boost 1.73.0,并包含 Z3,用于在没有回调机制的情况下集成 SMTChecker 支持。
- 构建系统:将 emscripten 构建从 fastcomp 后端切换到上游后端。
- 代码生成器:不要为小型编译器例程引入新的内部源引用。
- 命令行界面:添加新选项
--base-path PATH
,以使用给定的路径作为源树的根(默认为文件系统的根)。
- SMTChecker:支持数组
length
。
- SMTChecker:支持数组
push
和 pop
。
- SMTChecker:对 BitVectors 和按位
and
运算符的一般支持。
Bug修复:
- 代码生成器:在某些数组复制操作上触发正确的未实现错误。
- 命令行界面:修复了将
--assemble
或 --yul
选项与 --machine ewasm
一起使用但未指定 --yul-dialect
时发生的内部错误。
- NatSpec:当遇到空行时,DocString 块将终止。
- 优化器:修复了 BlockDeDuplicator 中的一个 bug。
- 扫描器:修复了当两个空 NatSpec 注释导致扫描超过 EOL 时发生的 bug。
- SMTChecker:修复了具有参数的 try/catch 子句中的内部错误。
- SMTChecker:修复了将算术运算符应用于定点变量时发生的内部错误。
- SMTChecker:修复了在分支内分配给索引访问时发生的内部错误。
- SMTChecker:修复了状态变量初始化中使用函数调用进行短路布尔表达式时发生的内部错误。
- 类型检查器:禁止为类型为
mapping
的存储变量赋值。
- 类型检查器:禁止使用非名称类型作为内联数组。
- 类型检查器:禁止对非 public 状态变量使用 override。
- 类型检查器:修复了访问数组切片的成员时发生的内部编译器错误。
- 类型检查器:修复了从内联程序集向前引用非字面量常量时发生的内部编译器错误。
- 类型检查器:修复了尝试解码过大的静态数组时发生的错误编译器错误。
- 类型检查器:修复了在不调用覆盖函数的情况下引用覆盖函数时发生的错误编译器错误。
0.6.8 (2020-05-14)
重要的 Bug 修复:
- 向未定义构造函数但具有定义构造函数的基础的合约的创建代码添加缺少的 callvalue 检查。
- 禁止使用动态编码基本类型的数组的数组切片。
- 当活动 ABIEncoderV2 时,包含反斜杠字符的字符串字面值不再会在直接传递到函数调用或编码函数时导致生成不正确的代码。
语言特性:
- 为每个返回类型可表示的最小值和最大值的整数类型
T
实现了 type(T).min
和 type(T).max
。
编译器特性:
- 命令行界面:不要在程序集模式下忽略
--yul-optimizations
。
- 允许对没有显式强制转换的 calldata 数组切片使用 abi 编码函数。
- Wasm 二进制输出:实现
br
和 br_if
。
Bug修复:
- ABI:跳过
private
或 internal
构造函数。
- 修复了请求的函数生成两次的“Bytecode 中的程序集异常”错误。
- Natspec:修复了当没有其他开发者文档标记时忽略
@return
标记的 bug。
- 类型检查器:检查
**
运算中的字面量指数是否过大或为小数。
- 类型检查器:禁止访问包含 immutable 状态变量的合约类型的
runtimeCode
。
- Yul 汇编器:修复了没有值的变量声明的源位置。
0.6.7 (2020-05-04)
语言特性:
- 添加了对使用
type(I).interfaceId
的 EIP 165 接口标识符的支持。
- 允许抽象合约中的虚拟修饰符具有空主体。
编译器特性:
- 优化器:简化重复的 AND 和 OR 操作。
- Standard Json Input:在字段
urls
中支持前缀 file://
。
- 添加了使用命令行界面中的
--yul-optimizations
或 standard-json 中的 optimizer.details.yulDetails.optimizerSteps
指定 Yul 优化器要执行的优化步骤的选项。
Bug修复:
- SMTChecker:修复了使用定点时发生的内部错误。
- SMTChecker:修复了使用数组切片时发生的内部错误。
- 类型检查器:禁止构造函数的
virtual
和 override
。
- 类型检查器:通过在完整类型检查之前执行类型的大小和递归检查,修复了多个内部错误。
- 类型检查器:修复了分配给空元组时发生的内部错误。
- 类型检查器:修复了将一元运算符应用于具有空组件的元组时发生的内部错误。
- 类型检查器:对在文件级别声明的结构执行递归检查。
构建系统:
- soltest.sh:
SOLIDITY_BUILD_DIR
不再相对于 REPO_ROOT
,以允许源树之外的构建目录。
0.6.6 (2020-04-09)
重要的 Bug 修复:
- 修复了具有占用多个堆栈槽且左右两侧堆栈大小不同的组件的元组赋值。
Bug修复:
- AST 导出:在字段
mutability
中导出 immutable
属性。
- SMTChecker:修复了在 CHC 引擎中内部调用继承函数时发生的内部错误。
- 类型检查器:尝试编码设置了调用选项 gas 和 value 的函数时出错。
0.6.5 (2020-04-06)
重要的 Bug 修复:
- 代码生成器:在运行时创建期间,将动态内存数组的长度限制为 64 位,从而修复了可能的溢出。
语言特性:
- 允许声明没有初始化的本地存储变量,只要在访问它们之前对其进行赋值。
- 状态变量可以标记为
immutable
,这会使它们变为只读,但可以在构造函数中赋值。 该值将直接存储在代码中。
编译器特性:
- 命令行界面:启用使用
--storage-layout
输出存储布局。
- 元数据:添加了对需要在多个区块中拆分的大文件的 IPFS 哈希的支持。
Bug修复:
- 继承:允许 public 状态变量覆盖在其返回值中具有动态内存类型的函数。
- 内联汇编:修复了访问无效常量变量时发生的内部错误。
- 内联汇编:修复了访问函数时发生的内部错误。
- JSON AST:始终为内存引用类型添加指针后缀。
- 引用解析器:修复了访问无效结构成员时发生的内部错误。
- 类型检查器:修复了分配嵌套元组时发生的内部错误。
0.6.4 (2020-03-10)
语言特性:
- 常规:不推荐使用
value(...)
和gas(...)
,而推荐使用{value: ...}
和{gas: ...}
- 内联汇编:允许分配给本地存储变量指针的
_slot
。
- 内联汇编:对内联汇编执行控制流分析。 允许仅在汇编中设置存储返回值。
编译器特性:
- AssemblyStack:支持源位置(源映射),从而支持调试 Yul 源。
- 命令行界面:启用通过
--ir-optimized
输出实验性优化 IR。
Bug修复:
- 继承:修复了调用未实现的基函数时发生的错误。
- 引用解析器:修复了 try/catch 语句后的作用域问题。
- Standard-JSON-Interface:修复了与空文件名和导入相关的 bug。
- SMTChecker:修复了分析元组时发生的内部错误。
- Yul AST 导入:正确地将块作为语句、switch 语句和字符串字面量导入。
0.6.3 (2020-02-18)
语言特性:
- 允许合约类型和枚举作为映射的键。
- 允许将函数选择器用作编译时常量。
- 报告结构化文档错误的源位置。
编译器特性:
- AST:为 doxygen 样式的结构化文档添加一个新节点,该文档可以由合约、函数、事件和修饰符定义接收。
- 代码生成器:使用
calldatacopy
代替 codecopy
来清零超过输入的内存。
- 调试:在使用
--revert-strings
选项或 debug
模式下的 settings.debug.revertStrings
设置时,提供编译器生成的内部还原的原因字符串。
- Yul 优化器:删除相互调用但以其他方式未引用的函数。
- SMTChecker:CHC 支持内部函数调用。
Bug修复:
- 汇编:将缺少的
source
字段添加到旧汇编 json 输出以完成源引用。
- 解析器:修复了没有
合同
的 abstract
的内部错误。
- 类型检查器:使对不可调用类型的无效调用成为致命错误而不是常规错误。
0.6.2 (2020-01-27)
语言特性:
- 允许通过合约和接口名称访问外部函数以获取其选择器。
- 允许接口从其他接口继承
- 允许使用
c.f{gas: 10000, value: 4 ether}()
在外部函数调用中设置 gas 和 value。
- 允许使用
new C{salt: 0x1234, value: 1 ether}(arg1, arg2)
指定合约创建的 salt
,从而指定 create2
操作码。
- 内联汇编:支持字面量
true
和 false
。
编译器特性:
- LLL:LLL 编译器已被删除。
- 常规:如果运行时字节码超过 24576 字节(Spurious Dragon 中引入的限制),则发出警告。
- 常规:支持从导入的 AST 开始编译。 除此之外,它可用于突变测试。
- Yul 优化器:尝试重新物化到循环中时应用惩罚。
Bug修复:
- 命令行界面:仅当给定
--optimize
时才激活 yul 优化器。
- 修复了显式调用未实现的基本函数时发生的内部编译器错误。
构建系统:
- 切换到使用嵌入式 base64 编码的 wasm 二进制文件来构建 soljson.js。
0.6.1 (2020-01-02)
Bug修复:
- Yul 优化器:修复了冗余赋值删除器中与 break 和 continue 语句结合使用的 bug。
0.6.0 (2019-12-17)
重大变更:
- 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:将
superFunction
属性替换为 baseFunctions
。
- Natspec JSON 接口:正确支持
@dev
文档中的多个 @return
语句,并强制命名返回参数以在文档中提及。
- 源码映射:在源码映射中添加“modifier depth”作为第五个字段。
- 标准 JSON 接口:添加选项以禁用或选择字节码元数据的 IPFS 和 Swarm 之间的哈希方法。
- 语法:动态存储数组的
push(element)
不再返回新的长度。
- 语法:抽象合约需要使用
abstract
关键字显式标记为抽象。
- 语法:数组的
length
成员现在始终是只读的,即使对于存储数组也是如此。
- 类型检查器:求幂的结果类型等于底数的类型。还允许底数为有符号类型。
语言特性:
- 允许通过
payable(...)
从 address
到 address payable
的显式转换。
- 允许全局枚举和结构体。
- 允许公共变量覆盖外部函数。
- 允许在十六进制字符串中使用下划线作为分隔符。
- 允许使用
try
和 catch
对失败的外部调用做出反应。
- 引入数组切片的语法,并为动态 calldata 数组实现它们。
- 为动态存储数组引入
push()
。如果适用,它返回对新分配元素的引用。
- 引入
virtual
和 override
关键字。
- 修改动态存储数组的
push(element)
,使其不再返回新的长度。
- Yul:引入
leave
语句,该语句退出当前函数。
- JSON AST:将每个外部可见的 FunctionDefinition 的函数选择器添加到 AST JSON 导出中。
编译器特性:
- 允许使用
--revert-strings
选项或 settings.debug.revertStrings
设置从二进制文件中剥离 revert 字符串。
- ABIEncoderV2:不再警告启用的 ABIEncoderV2(但仍然需要 pragma)。
0.5.17 (2020-03-17)
Bug修复:
0.5.16 (2020-01-02)
向后移植的 Bug 修复:
- Yul 优化器:修复了与 break 和 continue 语句结合使用的冗余赋值删除器中的错误。
0.5.15 (2019-12-17)
Bug修复:
- Yul 优化器:修复了不正确的冗余加载优化,该优化跨越包含带有内存/存储写入的 for 循环的用户定义函数。
0.5.14 (2019-12-09)
语言特性:
- 允许通过成员
.selector
获取公共或外部库函数的选择器。
- 内联汇编:支持引用其他常量的常量。
- 解析器:允许将十六进制和常规字符串文字拆分为多个部分。
编译器特性:
- 命令行界面:允许使用
solc --yul --yul-dialect evm --machine ewasm
从 yul / 严格汇编转换为 EWasm
- 将默认 EVM 版本设置为“Istanbul”。
- SMTChecker:添加对构造函数的支持,包括构造函数继承。
- Yul:通过 Yul 编译时,如果每个字符都可以安全打印,则来自 Solidity 代码的字符串文字将保留为字符串文字。
- Yul 优化器:执行循环不变代码移动。
Bug修复:
- SMTChecker:修复了使用
abi.decode
时的内部错误。
- SMTChecker:修复了使用函数数组或映射时的内部错误。
- SMTChecker:修复了结构体数组类型中的内部错误。
- 版本检查器:
^0
应该匹配 0.5.0
,但不能匹配预发布版本。
- Yul:认为无限循环和递归不可删除。
构建系统:
- 更新到 emscripten 版本 1.39.3。
0.5.13 (2019-11-14)
语言特性:
- 允许使用
address(LibraryName)
获取链接库的地址。
编译器特性:
- 代码生成器:如果使用 Istanbul EVM,则对
address(this).balance
使用 SELFBALANCE 操作码。
- EWasm:通过
--ewasm
以及在 standard-json 中记录的实验性 EWasm 二进制输出。
- SMTChecker:向 CHC 引擎添加 break/continue 支持。
- SMTChecker:支持对多维数组和映射的赋值。
- SMTChecker:支持继承和函数覆盖。
- 标准 JSON 接口:当请求 artifact
storageLayout
时,输出合约的存储布局。
- 类型检查器:在重载解析失败时列出可能的候选项。
- 类型检查器:禁止库类型的变量。
Bug修复:
- 代码生成器:修复了一个错误的 assert,该 assert 会错误地为超过无符号整数的数组大小触发。
- SMTChecker:修复了访问固定字节索引时的内部错误。
- SMTChecker:修复了将函数指针用作参数时的内部错误。
- SMTChecker:修复了将字符串文字隐式转换为固定字节时的内部错误。
- 类型检查器:禁止将同一类的构造函数用作 modifier。
- 类型检查器:将魔法变量视为内联汇编中的未知标识符。
- 代码生成器:修复了尝试将
super
转换为不同类型时的内部错误
0.5.12 (2019-10-01)
语言特性:
- 类型检查器:允许赋值给外部函数参数,引用类型除外。
编译器特性:
- ABI 输出:将函数的排序顺序从选择器更改为 kind、name。
- 优化器:添加一条规则,如果第一个参数大于 31,则将 BYTE 操作码替换为 0。
- SMTChecker:向 CHC 引擎添加循环支持。
- Yul 优化器:考虑用户定义函数的无副作用性。
- Yul 优化器:删除冗余的 mload/sload 操作。
- Yul 优化器:利用分支条件在分支内具有特定值的事实。
Bug修复:
- 代码生成器:修复了弹出映射的动态存储数组时的内部错误。
- 名称解析器:修复了在导入声明中警告隐藏别名时的错误源位置。
- 扫描器:修复了当文件使用 CRLF 而不是 LF 编码时,使用三个斜杠的多行 natspec 注释解析。
- 类型系统:修复了递归结构体的数组。
- Yul 优化器:修复了与 for 循环条件中移位的 1 和 mul/div 指令相关的重新排序错误。
0.5.11 (2019-08-12)
语言特性:
编译器特性:
- ABI:字段
internalType
中的其他内部类型信息。
- eWasm:高度实验性的 eWasm 输出,使用命令行界面中的
--ewasm
或 standard-json 中的 ewasm.wast
输出选择。
- 元数据:将 swarm 哈希更新到当前规范,将
bzzr0
更改为 bzzr1
,并将 url 更改为使用 bzz-raw://
。
- 标准 JSON 接口:仅编译选定的源文件和合约。
- 标准 JSON 接口:提供辅助错误位置(例如,其他冲突声明的源位置)。
- SMTChecker:如果分配了另一个存储指针,则不要删除有关存储指针的知识。
- SMTChecker:支持字符串文字类型。
- SMTChecker:一种新的基于 Horn 的算法,通过多事务合约不变量证明断言。
- 标准 JSON 接口:即使在发生错误时也提供 AST,如果
--error-recovery
命令行开关或 StandardCompiler settings.parserErrorRecovery
为 true。
- Yul 优化器:如果内联函数会导致重复不便宜的表达式,则不要内联函数。
Bug修复:
- ABI 解码器:确保解码后的数组始终指向不同的内存位置。
- 代码生成器:正确处理 calldata 中动态编码但静态大小的数组和结构体。
- SMTChecker:修复了内联包含元组表达式的函数时的内部错误。
- SMTChecker:修复了循环中的指针知识擦除。
- SMTChecker:修复了在分支中使用复合按位赋值运算符时的内部错误。
- SMTChecker:修复了内联一个返回包含分支内不支持类型的元组的函数时的内部错误。
- SMTChecker:修复了内联使用状态变量并属于不同源文件的函数时的内部错误。
- SMTChecker:修复了报告关于来自不同源文件的状态变量的反例时的内部错误。
- SMTChecker:修复了使用字符串文字时的 SMT 排序不匹配。
- View/Pure 检查器:正确检测通过基类的状态变量访问。
- Yul 分析器:在分析阶段检查数据对象是否可用。
- Yul 优化器:修复了一个即使在程序中使用
msize
时也移除了内存访问代码的问题。
0.5.10 (2019-06-25)
重要的 Bug修复:
- ABIEncoderV2:修复了占用多个存储槽的数据类型的存储数组的不正确的 abi 编码
- 代码生成器:在分配到存储并同时转换类型时,正确地将负数数组元素中的高阶位清零。
编译器特性:
- 命令行界面:通过
--error-recovery
命令行开关或 StandardCompiler settings.parserErrorRecovery
布尔值的实验性解析器错误恢复。
- 优化器:添加一条规则,将
SUB(~0, X)
简化为 NOT(X)
。
- Yul 优化器:使优化器适用于所有 Yul 方言,包括 eWasm。
Bug修复:
- 类型检查器:将函数类型成员
gas
和 value
的状态可变性设置为 pure(而它们的返回类型从函数类型继承状态可变性)。
- Yul / 内联汇编解析器:禁止函数调用参数中出现尾随逗号。
构建系统:
- 尝试使用 stock Z3 cmake 文件来查找 Z3,并且仅回退到手动发现。
- CMake:对 boost 使用导入的目标。
- Emscripten 构建:升级到 boost 1.70。
- 为低于 5.0 的 gcc 版本生成 cmake 错误。
0.5.9 (2019-05-28)
语言特性:
- 内联汇编:恢复 0.5.7 中引入的更改:
callvalue()
指令不再需要 payable
。
- 静态分析器:禁止库在外部调用自身。
编译器特性:
- 汇编器:在已部署的字节码中编码编译器版本。
- 代码生成器:修复了将动态大小的结构体作为构造函数参数的处理。
- 内联汇编:禁止
msize()
和 Yul 优化器的组合。
- 元数据:添加源文件的 IPFS 哈希。
- 优化器:添加一条规则以简化 SHL/SHR 组合。
- 优化器:添加用于乘以和除以左移 1 的规则。
- SMTChecker:支持继承的状态变量。
- SMTChecker:支持具有多个返回值的元组和函数调用。
- SMTChecker:支持
delete
。
- SMTChecker:内联对
this
的外部函数调用。
- Yul 优化器:将单次运行
for
循环简化为 if
语句。
- Yul 优化器:优化数字的表示。
- Yul 优化器:不要内联递归函数。
- Yul 优化器:如果使用了
msize()
,则不要删除影响 msize()
的指令。
Bug修复:
- 代码生成器:在从存储加载时,将未初始化的内部函数指针显式转换为构造函数上下文中的无效函数。
- 代码生成器:修复了分配包含映射数组的结构体时的断言失败。
- 编译器内部:在每次编译之前重置 Yul 字符串存储库,释放内存。
- SMTChecker:修复了基类构造函数修饰符中的错误强制转换。
- SMTChecker:修复了访问从基类继承的状态变量时的内部错误。
- SMTChecker:修复了定点运算中的内部错误。
- SMTChecker:修复了分配给不支持的类型时的内部错误。
- SMTChecker:修复了在内联修改局部变量的函数调用时分支中的内部错误。
0.5.8 (2019-04-30)
重要的 Bug修复:
- 代码生成器:修复了构造函数上下文中未初始化的内部函数指针的初始化例程。
- Yul 优化器:修复了多重赋值的 SSA 转换。
语言特性:
- ABIEncoderV2:实现 calldata 数组和结构体的编码。
- 代码生成:实现将递归结构体从存储复制到内存。
- Yul:禁止在 for 循环初始化块中定义函数。
编译器特性:
- ABI 解码器:在使用实验性解码器时,在脏输入上引发运行时错误。
- 优化器:为君士坦丁堡添加一条将移位大于 255 的常量移位的规则。
- 优化器:添加一条简化某些 AND 和 SHL 组合的规则
- SMTChecker:支持算术复合赋值运算符。
- SMTChecker:支持数组和映射访问的单目递增和递减。
- SMTChecker:显示内联汇编块的不支持警告。
- SMTChecker:支持 mod。
- SMTChecker:支持
contract
类型。
- SMTChecker:支持
this
作为地址。
- SMTChecker:支持地址成员。
- 标准 JSON 接口:元数据设置现在重新生成编译输入中的原始
"useLiteralContent"
设置。
- Yul:向 for 循环语法添加 break 和 continue 关键字。
- Yul:支持
.
作为标识符的一部分。
- Yul 优化器:添加用于检测和删除死代码的步骤。
- Yul 代码生成器:直接跳转到一系列函数定义(而不是跳转到每个函数定义)
Bug修复:
- SMTChecker:实现布尔短路。
- SMTChecker:SSA 控制流没有考虑在内联函数中修改的状态变量,这些函数调用在分支中。
- 类型系统:在库中使用时,对事件参数中的合约使用正确的类型名称。这影响了代码生成。
- 类型系统:允许直接调用具有重载的基类函数。
- 类型系统:如果用户变量命名为
this
或 super
,则警告隐藏的内置变量。
- Yul:正确注册函数并禁止函数变量和外部作用域中的变量之间的隐藏。
构建系统:
- Soltest:向 isoltest 添加命令行选项
--test
/ -t
,该选项接受一个字符串,该字符串允许过滤单元测试。
- soltest.sh:允许环境变量
SOLIDITY_BUILD_DIR
指定构建文件夹并添加 --help
用法。
0.5.7 (2019-03-26)
重要的 Bug修复:
- ABIEncoderV2:修复了在从存储编码数组或结构体时,从存储加载短值类型相关的错误。
- ABIEncoderV2:修复了从存储编码打包数组时的缓冲区溢出问题。
- 优化器:修复了常量字节优化规则中不正确的参数排序。
语言特性:
- 具有命名参数的函数调用现在可以与重载函数一起使用。
编译器特性:
- 内联汇编:在 nonpayable 函数中使用
callvalue()
时发出错误(与 msg.value
的方式相同)。
- 标准 JSON 接口:支持“Yul”作为输入语言。
- SMTChecker:如果适用,显示调用堆栈以及模型。
- SMTChecker:支持修饰符。
- Yul 优化器:如果 Yul 优化器处于活动状态,则默认情况下启用堆栈分配优化(在
yulDetails
中禁用)。
Bug修复:
- 代码生成器:防御性地将内存填充为
type(Contract).name
的 32 的倍数。
- 类型系统:检测并禁止内部函数指针作为公共/外部库函数的参数,即使它们嵌套/包装在结构体、数组或其他类型中也是如此。
- Yul 优化器:在堆栈压缩传递期间正确确定是否可以消除变量。
- Yul / 内联汇编解析器:禁止在基于标签整数值的 switch 中使用具有相同标签的多个 case 语句。
构建系统:
- 安装脚本:修复 CentOS 6 的 boost 存储库 URL。
- Soltest:修复 soltest 中的十六进制字符串更新。
0.5.6 (2019-03-13)
重要的 Bug修复:
- Yul 优化器:修复了结构简化器的访问顺序错误。
- 优化器:修复了简化双常数移位优化规则中的溢出。
语言特性:
- 允许带有 ABIEncoderV2 的动态编码基本类型的 calldata 数组。
- 允许带有 ABIEncoderV2 的动态编码 calldata 结构体。
编译器特性:
- 优化器:添加用于带有常量的
lt
比较的规则。
- Peephole 优化器:在
jumpi
之前删除双重“iszero”。
- SMTChecker:支持没有类型转换的枚举。
- SMTChecker:支持一维数组。
- 类型检查器:为某些文字转换提供更好的错误消息。
- Yul 优化器:添加一条删除空默认 switch case 的规则。
- Yul 优化器:添加一条如果不存在默认值,则删除空 case 的规则。
- Yul 优化器:添加一条规则,用
pop(expression)
替换没有 case 的 switch。
Bug修复:
- JSON ABI:库 ABI 的 Json 描述不再包含具有内部类型(如存储结构体)的函数。
- SMTChecker:修复了合约包含太大有理数时的内部编译器错误。
- 类型系统:检测合约的基类是否使用了需要实验性 abi 编码器的类型,而合约仍然使用旧编码器。
构建系统:
- Soltest:添加对函数签名中数组的支持。
- Soltest:添加对函数签名中结构体数组的支持。
- Soltest:添加对左对齐、未填充的十六进制字符串文字的支持。
0.5.5 (2019-03-05)
语言特性:
- 添加对具有
string
或 bytes
键类型的映射的 getter 的支持。
- 元编程:提供通过
type(C).name
访问合约名称的权限。
编译器特性:
- 支持
petersburg
作为 evmVersion
并设置为默认值。
- 命令行界面:使用
-optimize-yul
激活实验性 yul 优化器的选项。
- 内联汇编:将
extcodehash
视为君士坦丁堡的一部分。
- 内联汇编:现在,当前配置的 EVM 不可用的指令是错误。
- SMTChecker:如果它们总是 revert,则不要报告下溢/溢出。这在使用
SafeMath
时消除了误报。
- 标准 JSON 接口:允许检索元数据而不触发字节码生成。
- 标准 JSON 接口:通过设置提供对优化器的细粒度控制。
- 静态分析器:当自定义类型的表达式无效时发出警告。
- 优化器:添加带有常数的新规则,包括
LT
、GT
、AND
和 BYTE
。
- 优化器:为君士坦丁堡添加带有常数的移位规则。
- 优化器:将具有恒定移位值的多个移位组合为一个。
- 优化器:不要在
CREATE
和 CREATE2
之后用 160 位掩码,因为保证它们返回地址或 0。
- 优化器:支持君士坦丁堡的常量优化器中的移位。
- Yul 优化器:添加一条规则,用匹配的 case 主体替换带有字面量的 switch 语句。
Bug修复:
- ABIEncoderV2:修复了与裸 delegatecall 相关的内部错误。
- ABIEncoderV2:修复了与 ecrecover 相关的内部错误。
- ABIEncoderV2:修复了与映射作为库参数相关的内部错误。
- ABIEncoderV2:修复了在库中发出的包含结构体的事件的无效签名。
- 内联汇编:缺少变量的正确错误消息。
- 优化器:修复了跨程序集未使用的标签删除相关的内部错误。这从未生成任何无效代码。
- SMTChecker:修复了与静态大小数组相关的崩溃。
- 类型检查器:修复内部错误并禁止对合约和库的索引访问。
- Yul:正确检测声明之前与函数的名称冲突。
- Yul:在可编译性检查器中考虑内置函数。
- Yul 优化器:在表达式简化器中替换时,正确考虑对子表达式中变量的重新赋值。
构建系统:
- Soltest:添加了对左对齐、填充的十六进制字面量的支持。
- Soltest:添加了对右对齐、填充的布尔字面量的支持。
0.5.4 (2019-02-12)
语言特性:
- 允许使用 ABIEncoderV2 的没有动态编码成员的 calldata 结构。
编译器特性:
- ABIEncoderV2:实现打包编码。
- C API (
libsolc
/ raw soljson.js
):引入 solidity_free
方法,该方法释放所有内部缓冲区以节省内存。
- 命令行界面:添加新选项
--new-reporter
以改进诊断格式 along 与 --color
和 --no-color
以强制(或显式禁用)着色输出。
Bug修复:
- 代码生成器:防御性地将 creationCode 和 runtimeCode 的分配填充为 32 字节的倍数。
- 命令行界面:仅允许 yul 优化器用于严格的汇编。
- 解析器:禁止空导入语句。
- 类型检查器:禁止数据位置不是
storage
的映射。
- 类型检查器:修复了结构体数组索引不适合 uint256 时的内部错误。
- 类型系统:正确报告数组和结构体的打包编码大小(到目前为止主要未使用)。
构建系统:
- 添加了通过 Google oss-fuzz 对持续 fuzzing 的支持
- SMT:如果使用 Z3,则需要 4.6.0 或更高版本。
- Soltest:添加了在基于文件的单元测试环境中使用的解析器。
- Ubuntu PPA 软件包:使用 CVC4 作为 SMT 求解器,而不是 Z3
0.5.3 (2019-01-22)
语言特性:
- 通过
type(C).creationCode
/ type(C).runtimeCode
提供对合约的创建和运行时代码的访问。
编译器特性:
- 控制流图:警告有关无法访问的代码。
- SMTChecker:支持没有截断的基本类型转换。
- SMTChecker:支持外部函数调用并删除有关存储变量和引用的所有知识。
Bug修复:
- Emscripten:进一步拆分了简化规则初始化,以解决某些浏览器中 soljson.js 的问题。
- 类型检查器:禁止 calldata 结构,直到实现为止。
- 类型检查器:如果尝试进行定点编码,则返回类型错误,而不是抛出
UnimplementedFeatureError
。
- Yul:检查
dataoffset
和 datasize
的参数是否为解析时的字面量,并在优化器中正确考虑这一点。
- Yul:解析数字字面量以检测重复的 switch case。
- Yul:要求 switch case 具有相同的类型。
构建系统:
- Emscripten:在 travis 和 circleci 上升级到 emscripten 1.38.8。
0.5.2 (2018-12-19)
语言特性:
编译器特性:
- 内联汇编:改进了围绕无效函数参数计数的错误消息。
- 代码生成器:如果所有函数都是 non-payable,则仅检查一次 callvalue。
- 代码生成器:更积极地对字符串常量使用 codecopy。
- 代码生成器:如果效率更高,则使用二进制搜索来分派函数。可以使用
--optimize-runs
调整大小/速度权衡。
- SMTChecker:以未解释的方式支持数学和密码学函数。
- SMTChecker:支持一维映射。
- 标准 JSON 接口:禁止标准 JSON 输入中存在未知键。
- 标准 JSON 接口:仅在请求时才运行代码生成。这可能导致仅在你请求字节码时才报告不受支持的功能错误。
- 静态分析器:对于具有空主体的函数,不要警告未使用的变量或状态可变性。
- 类型检查器:添加在类型转换失败时要显示的附加原因。
- Yul:在独立汇编模式下支持通过
datasize
、dataoffset
和 datacopy
进行对象访问。
Bug修复:
- 标准 JSON 接口:报告 json 输入错误的特定错误消息,而不是内部编译器错误。
构建系统:
- 将 trusty PPA 构建替换为 cosmic 上的静态构建,该构建用于 trusty 软件包。
- 删除对 Visual Studio 2015 的支持。
0.5.1 (2018-12-03)
语言特性:
- 允许公共和外部库函数的参数和返回变量使用映射类型。
- 允许公共函数覆盖外部函数。
编译器特性:
- 代码生成器:从 calldata 加载时,不要对无符号整数执行冗余的双重清理。
- 命令行界面:用于汇编模式(
--strict-assembly
和 --yul
)的实验性 --optimize
选项。
- SMTChecker:SMTLib2 查询和响应通过标准 JSON 编译器接口传递。
- SMTChecker:支持
msg
、tx
和 block
成员变量。
- SMTChecker:支持
gasleft()
和 blockhash()
函数。
- SMTChecker:支持内部绑定函数调用。
- Yul:在
--assemble
、--strict-assembly
和 --yul
命令行选项中支持 Yul 对象。
Bug修复:
- 汇编输出:不要将 in/out 跳转注释与参数混合在一起。
- 命令行界面:修复了在空运行时代码上使用
--ast
时的崩溃。
- 代码生成器:将从 calldata 解码器到函数的跳转注释为“jump in”。
- 代码生成器:修复了通过基合约名称访问函数类型状态变量相关的内部错误。
- 优化器:修复了与 boost 版本和常量表示相关的非确定性错误。该错误仅导致了不太理想但仍然正确的代码,因为生成的例程始终被验证是正确的。
- 类型检查器:当使用公共合约函数覆盖外部接口函数时,正确检测不同的返回类型。
- 类型检查器:除非新的 ABI 编码器处于活动状态,否则禁止公共状态变量的 getter 使用结构体返回类型。
- 类型检查器:修复了函数类型中用作参数的结构体的字段具有不存在的类型时的内部编译器错误。
- 类型检查器:即使没有函数调用,也禁止函数
sha3
和 suicide
。
- 类型检查器:修复了基合约函数未实现时
super
的内部编译器错误。
- 类型检查器:修复了在某些情况下尝试创建抽象合约时的内部错误。
- 类型检查器:修复了与事件重复声明相关的内部错误。
- 类型检查器:禁止映射类型的内联数组。
- 类型检查器:考虑由公共状态变量实现的抽象函数。
构建系统:
- CMake:默认情况下不再构建 LLL。必须使用 CMake 作为
-DLLL=ON
进行配置。
- Docker:包含 Scratch 和 Alpine 镜像。
- Emscripten:升级到 Emscripten SDK 1.37.21 和 boost 1.67。
Solc-Js:
- 修复了在命令行可执行文件中处理 standard-json 的问题。
- 删除对 nodejs 4 的支持。
0.5.0 (2018-11-13)
如何更新你的代码:
- 将每个
.call()
更改为 .call("")
,并将每个 .call(signature, a, b, c)
更改为使用 .call(abi.encodeWithSignature(signature, a, b, c))
(最后一个仅适用于值类型)。
- 将每个
keccak256(a, b, c)
更改为 keccak256(abi.encodePacked(a, b, c))
。
- 将
public
添加到每个函数,并将 external
添加到每个尚未指定其可见性的回退或接口函数。
- 使你的回退函数为
external
。
- 显式声明所有结构体、数组或映射类型变量(包括函数参数)的数据位置,例如,将
uint[] x = m_x
更改为 uint[] storage x = m_x
。请注意,external
函数需要数据位置为 calldata
的参数。
- 在使用
address
成员之前,显式地将合约类型的值转换为地址。示例:如果 c
是合约,请将 c.transfer(...)
更改为 address(c).transfer(...)
。
- 如果要调用
transfer
,请将变量(尤其是函数参数)声明为 address payable
。
重大更改:
- ABI 编码器:正确填充来自 Calldata 的数据 (
msg.data
和外部函数参数)。使用 abi.encodePacked
进行非填充编码。
- C API (
libsolc
/ raw soljson.js
):移除了 version
, license
, compileSingle
, compileJSON
, compileJSONCallback
方法
并将其替换为 solidity_license
, solidity_version
和 solidity_compile
方法。
- 代码生成器:有符号右移使用正确的算术移位,即向负无穷大方向舍入。警告:这可能会在不发出提示的情况下更改现有代码的语义!
- 代码生成器:如果 Calldata 太短或超出范围,则在运行时 Revert。这在
ABI decoder
内部完成,因此也适用于 abi.decode()
。
- 代码生成器:为
pure
和 view
函数使用 STATICCALL
。这在实验性的 0.5.0 模式下已经是这种情况。
- 命令行界面:移除过时的
--formal
选项。
- 命令行界面:将
--julia
选项重命名为 --yul
。
- 命令行界面:如果标准输入用作源,则需要
-
。
- 命令行界面:使用库名称的哈希作为链接占位符,而不是名称本身。
- 编译器界面:不允许使用空前缀进行重映射。
- 控制流分析器:在检查未初始化的返回值时,也考虑映射。
- 控制流分析器:将关于返回未初始化存储指针的警告变成错误。
- 常规:
do...while
循环中的 continue
跳转到条件(过去跳转到循环体)。警告:这可能会在不发出提示的情况下更改现有代码的语义。
- 常规:不允许声明空结构体。
- 常规:不允许原始
callcode
(已在 0.4.12 中弃用)。仍然可以通过内联汇编使用它。
- 常规:不允许
var
关键字。
- 常规:不允许
sha3
和 suicide
别名。
- 常规:不允许
throw
语句。这在实验性的 0.5.0 模式下已经是这种情况。
- 常规:不允许
years
单位(已在 0.4.24 中弃用)
- 常规:引入
emit
作为关键字,而不是将其解析为标识符。
- 常规:新关键字:
calldata
和 constructor
- 常规:新的保留关键字:
alias
, apply
, auto
, copyof
, define
, immutable
,
implements
, macro
, mutable
, override
, partial
, promise
, reference
, sealed
,
sizeof
, supports
, typedef
和 unchecked
。
- 常规:移除汇编指令别名
sha3
和 suicide
- 常规:现在强制执行 C99 风格的作用域规则。这在实验性的 0.5.0 模式下已经是这种情况。
- 常规:不允许将十六进制数字与单位组合(例如
0x1e wei
)。这在实验性的 0.5.0 模式下已经是这种情况。
- JSON AST:移除
constant
和 payable
字段(该信息已编码在 stateMutability
字段中)。
- JSON AST:将
isConstructor
字段替换为一个新的 kind
字段,该字段可以是 constructor
、fallback
或 function
。
- 接口:移除“克隆合约”功能。
--clone-bin
和 --combined-json clone-bin
命令行选项不再可用。
- 名称解析器:在查找冲突声明时,不要排除公共状态变量。
- 优化器:移除无操作
PUSH1 0 NOT AND
序列。
- 解析器:不允许尾随的、没有数字的点。
- 解析器:移除
constant
作为函数状态可变性修饰符。
- 解析器:不允许在十六进制数字文字中使用大写 X
- 类型检查器:不允许具有不同组件数量的元组之间的赋值。这在实验性的 0.5.0 模式下已经是这种情况。
- 类型检查器:不允许常量的值不是编译时常量。这在实验性的 0.5.0 模式下已经是这种情况。
- 类型检查器:不允许对布尔变量进行算术运算。
- 类型检查器:不允许紧密打包文字。这在实验性的 0.5.0 模式下已经是这种情况。
- 类型检查器:不允许在没有括号的情况下调用基类构造函数。这在实验性的 0.5.0 模式下已经是这种情况。
- 类型检查器:不允许在不同大小的
bytesX
和 uintY
之间进行转换。
- 类型检查器:不允许在不相关的合约类型之间进行转换。通过
address
进行显式转换仍然可以实现它。
- 类型检查器:不允许具有一个或多个返回值的函数使用空返回语句。
- 类型检查器:不允许使用空元组组件。这在实验性的 0.5.0 模式下部分已经是这种情况。
- 类型检查器:不允许使用不匹配的值数量的多变量声明。这在实验性的 0.5.0 模式下已经是这种情况。
- 类型检查器:不允许在同一继承层次结构中多次指定基类构造函数参数。这在实验性的 0.5.0 模式下已经是这种情况。
- 类型检查器:不允许使用错误的参数计数调用构造函数。这在实验性的 0.5.0 模式下已经是这种情况。
- 类型检查器:不允许未初始化的存储变量。这在实验性的 0.5.0 模式下已经是这种情况。
- 类型检查器:变量和结构体中检测循环依赖关系的递归限制为 256。
- 类型检查器:要求所有变量(包括函数参数)都具有显式数据位置。这在实验性的 0.5.0 模式下部分已经是这种情况。
- 类型检查器:仅接受单个
bytes
类型用于 .call()
(及其系列)、keccak256()
、sha256()
和 ripemd160()
。
- 类型检查器:Fallback 函数必须是 external。这在实验性的 0.5.0 模式下已经是这种情况。
- 类型检查器:接口函数必须声明为 external。这在实验性的 0.5.0 模式下已经是这种情况。
- 类型检查器:地址成员不再包含在合约类型中。现在需要进行显式转换,然后才能从合约调用
address
成员。
- 类型检查器:完全不允许使用“松散汇编”语法。这意味着不再可以使用跳转标签、跳转和非功能指令。
- 类型系统:不允许从十进制文字显式和隐式转换为
bytesXX
类型。
- 类型系统:不允许将十六进制文字显式和隐式转换为不同大小的
bytesXX
类型。
- 类型系统:区分 payable 和 non-payable 地址类型。
- View Pure 检查器:不允许在 non-payable 函数中使用
msg.value
(或通过修饰符将其引入)。
- 从 Solidity 存储库中移除过时的
std
目录。这意味着无法访问 https://github.com/ethereum/solidity/blob/develop/std/*.sol
(或 Remix 中的 https://github.com/ethereum/solidity/std/*.sol
)。
- 引用解析器:将缺失的存储位置变成错误。这在实验性的 0.5.0 模式下已经是这种情况。
- 语法检查器:不允许没有实现的函数使用修饰符。这在实验性的 0.5.0 模式下已经是这种情况。
- 语法检查器:函数类型中的命名返回值是一个错误。
- 语法检查器:严格要求函数的可见性说明符。这在实验性的 0.5.0 模式下已经是这种情况。
- 语法检查器:不允许使用一元
+
。这在实验性的 0.5.0 模式下已经是这种情况。
- 语法检查器:不允许在不是块的 if/while/for 主体中使用单语句变量声明。
- View Pure 检查器:严格执行状态可变性。这在实验性的 0.5.0 模式下已经是这种情况。
语言特性:
- 常规:将
staticcall
添加到 address
。
- 常规:允许将
calldata
关键字附加到类型,以显式指定外部函数参数的数据位置。
- 常规:支持存储数组的
pop()
。
- 常规:作用域规则现在遵循 C99 风格。
- 常规:允许在接口中使用
enum
。
- 常规:允许在所有内部函数中使用
mapping
存储指针作为参数和返回值。
- 常规:允许在接口中使用
struct
。
- 常规:通过
abi.decode(bytes memory data, (...))
提供对 ABI 解码器的访问。
- 常规:不允许固定大小数组的长度为零。
- 解析器:在解析期间接受
address payable
类型。
编译器特性:
- 构建系统:添加了对 macOS Mojave 版本的支持。
- 代码生成器:
CREATE2
指令已更新以匹配 EIP1014(又名“Skinny CREATE2”)。它也被接受为 Constantinople 的一部分。
- 代码生成器:已根据 EIP1052 添加了
EXTCODEHASH
指令。
- 类型检查器:当尝试引用内联汇编中的重载标识符时,会显示更友好的错误消息。
- 类型检查器:在发生错误时显示命名参数。
- 类型系统:IntegerType 在内部拆分为 IntegerType 和 AddressType。
- 测试:确定 IPC 调用的事务状态。
- 代码生成器:根据局部变量的作用域分配和释放局部变量。
- 移除了
pragma experimental "v0.5.0";
。
- 语法检查器:改进了函数类型中查找的错误消息。
- 名称解析器:更新了名称建议查找函数以考虑标识符的长度:1:不搜索,2-3:最多更改一次,4-:最多更改两次
- SMTChecker:支持对返回 none 或单个值的内部函数的调用。
Bug 修复:
- 构建系统:支持链接到 CLN 而不是 GMP 的 CVC4 版本。如果由于实验性 SMT 求解器支持而出现编译问题,则可以使用 CMake 使用
-DUSE_CVC4=OFF
或 -DUSE_Z3=OFF
配置项目来禁用求解器。
- 测试:修复链参数以使 ipc 测试适用于较新版本的 cpp-ethereum。
- 代码生成器:修复字节数组的分配(清零了过多的内存)。
- 代码生成器:正确处理 ABIEncoderV2 中的负数文字。
- 代码生成器:不要在使用多维固定大小数组的长度为零时崩溃。
- 命令行界面:正确处理 Windows 上带有反斜杠的路径。
- 控制流分析器:在检测未初始化的存储指针返回时忽略未实现的函数。
- 修复合约定义上
@notice
和 @dev
标签的 NatSpec json 输出。
- 优化器:正确估计特殊情况的常量 gas 成本。
- 优化器:修复了出现在某些 emscripten 平台上的简化规则初始化错误。
- 引用解析器:不要在使用带有
_slot
和 _offset
后缀时崩溃。
- 引用解析器:强制执行
storage
作为映射的数据位置。
- 引用解析器:正确处理与
_slot
和 _offset
一起使用的无效引用。
- 引用解析器:当 FunctionType 具有未声明的类型作为参数时,报告错误而不是断言失败。
- 引用解析器:修复使用大型变量名称问题时的高 CPU 使用率。仅当标识符短于 80 个字符时才建议使用相似的名称。
- 类型检查器:类型转换(例如,从文字)的默认数据位置是 memory 而不是 storage。
- 类型检查器:禁止在元组赋值中对映射进行赋值。
- 类型检查器:不允许对结构体数组进行打包编码。
- 类型检查器:允许对映射类型的局部变量进行赋值。
- 类型检查器:在检查递归结构体时考虑固定大小的数组。
- 类型检查器:修复了在无法确定右手边类型的错误元组赋值中发生的崩溃。
- 类型检查器:修复了非常接近
0
的负定点文字(例如 -1e-100
)的冻结。
- 类型检查器:公共映射的动态类型键返回错误而不是断言失败。
- 类型检查器:修复数组索引值太大时的内部错误。
- 类型检查器:修复固定大小数组太大而无法编码时的内部错误。
- 类型检查器:修复数组类型转换的内部错误。
- 类型检查器:修复数组索引不是无符号数时的内部错误。
- 类型系统:允许尾数为零的文字使用任意指数。
- 解析器:修复无名参数的不正确的源位置。
- 命令行界面:修复在编译没有内容且带有 --ast 选项的 stdin 时的内部错误。
### 0.4.26 (2019-04-29)
重要 Bug 修复:
- 代码生成器:修复构造函数上下文中未初始化的内部函数指针的初始化例程。
- 类型系统:在库中使用时,对事件参数中的合约使用正确的类型名称。这会影响代码生成。
Bug 修复:
- ABIEncoderV2:拒绝生成已知可能存在 bug 的代码。
- 常规:拆分规则列表,以便具有小堆栈的 JavaScript 环境可以使用编译器。
注意:上述更改未包含在 0.5.0 中,因为它们已被向后移植。
### 0.4.25 (2018-09-12)
重要 Bug 修复:
- 代码生成器:正确执行求幂和非 256 位类型的清理。
- 类型检查器:在使用实验性 ABIEncoderV2 的事件中,使用索引结构体时报告错误。这过去会记录错误的值。
- 类型检查器:在使用没有实验性 ABIEncoderV2 的事件中,使用结构体时报告错误。这过去会崩溃或记录错误的值。
- 解析器:考虑所有 Unicode 行终止符(LF、VF、FF、CR、NEL、LS、PS)用于单行注释
和字符串文字。它们在字符串中无效并且将结束注释。
- 解析器:不允许在输入结尾处未终止的多行注释。
- 解析器:将
/** /
视为未终止的多行注释。
### 0.4.24 (2018-05-16)
语言特性:
- 代码生成器:在目标 Constantinople 上使用本机移位指令。
- 常规:允许将多个变量声明为元组赋值的一部分,例如
(uint a, uint b) = ...
。
- 常规:从文档和测试中删除已弃用的
constant
作为函数状态修饰符(但仍然将其作为有效的特性保留)。
- 类型检查器:弃用
years
单位,并为其引发警告(或作为实验性 0.5.0 特性的错误)。
- 类型检查器:使文字(没有显式类型转换)成为紧密打包的错误,作为实验性 0.5.0 特性。
- 类型检查器:警告通配符元组赋值(这将在 0.5.0 版本中变成错误)。
- 类型检查器:警告
keccak256
、sha256
和 ripemd160
未与单个字节参数一起使用(建议使用 abi.encodePacked(...)
)。这将在 0.5.0 版本中变成错误。
编译器特性:
- 构建系统:将 jsoncpp 的内部依赖项更新到 1.8.4,这引入了更严格的限制并减少了内存使用。
- 控制流图:添加控制流图作为分析结构。
- 控制流图:警告返回未初始化的存储指针。
- Gas 估算器:仅探索具有较高 gas 成本的路径。这降低了准确性,但大大提高了 gas 估算的速度。
- 优化器:删除已知短指令(
ADDRESS
、CALLER
、ORIGIN
和 COINBASE
)结果的不必要的掩码。
- 解析器:通过显示实际Token而不是内部名称来显示更友好的错误消息。
- 解析器:使用Token的整个位置而不是仅使用其起始位置作为解析器错误的源位置。
- SMT 检查器:支持整数和布尔类型的状态变量。
Bug 修复:
- 代码生成器:修复从状态或本地字符串变量中获取原因的
revert
。
- 类型检查器:尝试
emit
非事件时显示正确的错误。
- 类型检查器:警告空的元组组件(这将在 0.5.0 版本中变成错误)。
- 类型检查器:ABI 编码函数是 pure,因此可以用于常量。
### 0.4.23 (2018-04-19)
特性:
- 构建系统:支持 Ubuntu Bionic。
- SMTChecker:与 CVC4 SMT 求解器集成
- 语法检查器:警告名为“constructor”的函数。
Bug 修复:
- 类型检查器:改进函数重载解析失败的错误消息。
- 类型检查器:不要抱怨新式构造函数和 fallback 函数具有相同的名称。
- 类型检查器:检测新语法和旧语法中的多个构造函数声明。
- 类型检查器:正确地不允许
bytesXX
到 contract
的显式转换。
### 0.4.22 (2018-04-16)
特性:
- 代码生成器:初始化数组而不使用
msize()
。
- 代码生成器:对于
x.push(...)
,实现更专业且因此优化的实现
- 命令行界面:检测到缺少或无法访问的文件时出错。使用
--ignore-missing
标志来禁止它。
- 常量评估器:修复单元素元组的评估。
- 常规:添加编码例程
abi.encodePacked
、abi.encode
、abi.encodeWithSelector
和 abi.encodeWithSignature
。
- 常规:添加全局函数
gasleft()
并弃用 msg.gas
。
- 常规:添加全局函数
blockhash(uint)
并弃用 block.hash(uint)
。
- 常规:允许为
revert()
和 require()
提供原因字符串。
- 常规:引入使用
constructor
关键字的新构造函数语法作为实验性 0.5.0 特性。
- 常规:将单次运行中输出的错误数量限制为 256。
- 常规:允许在 post-byzantium EVM 中访问动态返回数据。
- 常规:允许在数字和十六进制文字中使用下划线来分隔千位和四位。
- 继承:当基类构造函数需要参数时,使用空括号会出错,作为实验性 0.5.0 特性。
- 继承:在修饰符样式的构造函数调用中使用无括号会出错,作为实验性 0.5.0 特性。
- 接口:允许在接口中使用 public 在实现合约中覆盖外部函数。
- 优化器:仅优化涉及常量的
SHL
和 SHR
(仅 Constantinople)。
- 优化器:删除位于交换指令之前的无用
SWAP1
指令(例如 ADD
、MUL
等)。
- 优化器:如果前面有
SWAP1
,则用相反的操作数替换比较运算符(LT
、GT
等),例如 SWAP1 LT
被替换为 GT
。
- 优化器:如果未使用
msize()
,则跨 mload
进行优化。
- 静态分析器:在重复的超级构造函数调用时出错,作为实验性 0.5.0 特性。
- 语法检查器:为空结构体发出警告(或作为实验性 0.5.0 特性的错误)。
- 语法检查器:警告没有实现的函数上的修饰符(这将在 0.5.0 版本中变成错误)。
- 语法测试:将源位置添加到语法测试预期。
- 类型检查器:改进有关访问从
address
继承的合约成员的文档和警告。
Bug 修复:
- 代码生成器:允许在不被调用的情况下使用
block.blockhash
。
- 代码生成器:不要包括仅在构造函数中引用的运行时字节码中的内部函数。
- 代码生成器:在不减少长度时,正确跳过不需要的存储数组清理。
- 代码生成器:库中修饰符查找中的 Bug 修复。
- 代码生成器:实现外部函数类型的打包编码。
- 代码生成器:将空基类构造函数参数列表视为未提供。
- 代码生成器:正确强制清除用于缩短转换的 bytesXX 类型。
- 命令行界面:修复导入的不存在文件的错误消息。
- 命令行界面:正确支持
--evm-version constantinople
。
- DocString 解析器:修复空描述的错误消息。
- Gas 估算器:正确忽略其他函数的 fallback 函数的成本。
- JSON AST:删除类型名称字符串的存储限定符。
- 解析器:修复解析没有标识符的
var
声明时的内部编译器错误。
- 解析器:修复函数类型变量的 getter 解析。
- 标准 JSON:正确支持
constantinople
作为 evmVersion
。
- 静态分析器:修复未使用变量警告的非确定性顺序。
- 静态分析器:使用常量表达式的无效算术会导致错误。
- 类型检查器:修复递归结构体的检测。
- 类型检查器:修复与字面数字比较时的不对称性错误。
- 类型系统:改进尝试按小数量移位时显示的错误消息。
- 类型系统:使外部库函数可访问。
- 类型系统:防止对奇异类型进行编码。
- 类型系统:将有理数限制为 4096 位。
### 0.4.21 (2018-03-07)
特性:
- 代码生成器:断言
k != 0
对于 mulmod(a, b, k)
和 addmod(a, b, k)
作为实验性 0.5.0 特性。
- 代码生成器:不要在调用中保留任何 gas(除非 EVM 版本设置为 homestead)。
- 代码生成器:使用
STATICCALL
操作码来调用 view
和 pure
函数作为实验性 0.5.0 特性。
- 常规:C99/C++ 风格的作用域规则(而不是 JavaScript 函数作用域)作为实验性 v0.5.0 特性生效。
- 常规:改进了错误跨越源文件多行的消息传递
- 常规:支持并建议使用
emit EventName();
来显式调用事件。
- 内联汇编:强制执行严格模式作为实验性 0.5.0 特性。
- 接口:提供选择目标 EVM 版本的能力(homestead 或 byzantium,byzantium 是默认值)。
- 标准 JSON:拒绝格式错误的无效 JSON 输入。
- 类型检查器:不允许未初始化的存储指针作为实验性 0.5.0 特性。
- 语法分析器:如果实验性特性不涉及代码生成,则不警告实验性特性。
- 语法分析器:不警告
pragma experimental "v0.5.0"
并且不为此在字节码中设置实验性标志。
- 语法检查器:将
throw
标记为错误作为实验性 0.5.0 特性。
- 语法检查器:如果在合约函数上未指定可见性,则发出错误作为实验性 0.5.0 特性。
- 语法检查器:使用合约实例上的
address
的重载时发出警告。
- 类型检查器:不允许将十六进制数字和单位面额组合作为实验性 0.5.0 特性。
Bug 修复:
- 汇编:在汇编中对超大数字文字引发错误。
- JSON-AST:将“documentation”属性添加到函数、事件和修饰符定义。
- 解析器:正确确定带有别名的导入的阴影。
- 独立汇编:不要忽略顶级块的右大括号后的输入。
- 标准 JSON:在传递无效的“sources”时正确捕获错误。
- 标准 JSON:确保提供的库地址长度正确并且以十六进制作为前缀。
- 类型检查器:正确检测旧的 ABI 编码器不支持哪些数组和结构体类型。
- 类型检查器:正确警告在内联汇编中使用
_offset
和 _slot
作为常量。
- 命令行界面:如果选项未知,则抛出错误
### 0.4.20 (2018-02-14)
特性:
- 代码生成器:防止库中的非 view 函数被调用。
直接(而不是通过 delegatecall)。
- 命令行界面:支持汇编的严格模式(不允许跳转、。
指令操作码等),带有
--strict-assembly
开关。
- 内联汇编:对使用跳转标签发出警告(已经存在于跳转指令中)。
- 内联汇编:支持一些受限制的Token(return、byte、address)作为 Iulia 模式下的标识符。
- 优化器:将
x % 2**i
替换为 x & (2**i-1)
。
- 解析器:在第一个错误之后继续解析引用。
- 解析器:如果找不到给定的标识符,则建议使用替代标识符。
- SMT 检查器:在程序 SMT 编码中考虑 if-else 分支条件。
变量。
- 语法检查器:弃用
var
关键字(并将其标记为实验性 0.5.0 特性的错误)。
- 类型检查器:允许
this.f.selector
是一个纯表达式。
- 类型检查器:对于接口函数使用
public
可见性发出警告。
- 类型检查器:限制为创建抽象合约引发的警告数量。
Bug 修复:
- 错误输出:截断中间的巨大数字文字以避免输出爆炸。
- 解析器:不允许没有参数列表的事件声明。
- 标准 JSON:填充错误列表中的
sourceLocation
字段。
- 标准 JSON:正确支持包含冒号的合约和库文件名(例如 URL)。
- 类型检查器:如果在使用
struct
作为函数参数时,建议使用实验性 ABI 编码器。
(而不是内部编译器错误)。
- 类型检查器:改进错误的结构体初始化的错误消息。
### 0.4.19 (2017-11-30)
特性:
- 代码生成器:新的 ABI 解码器,支持结构体和任意嵌套。
数组并检查输入大小(使用
pragma experimental ABIEncoderV2;
激活)。
- 常规:允许常量变量用作数组长度。
- 内联汇编:
if
语句。
- 标准 JSON:支持
outputSelection
字段,用于选择性编译目标工件。
- 语法检查器:将
callcode
的使用转换为实验性 0.5.0 特性的错误。
- 类型检查器:改进地址校验和警告。
- 类型检查器:更详细的无效数组长度错误(例如除以零)。
Bug 修复:
### 0.4.18 (2017-10-18)
特性:
- 代码生成器:始终使用所有可用的 gas 进行调用,作为实验性 0.5.0 特性。
(以前,为了在 pre-Tangerine-Whistle 中工作,保留了一定的数量)
EVM 版本)
- 解析器:更好的参数列表中的意外尾随逗号的错误消息。
- 标准 JSON:支持
outputSelection
字段,用于选择性编译提供的源。
- 语法检查器:一元
+
现在是语法错误,作为实验性 0.5.0 特性。
- 类型检查器:不允许使用实验性 0.5.0 特性的非纯常量状态变量。
- 类型检查器:不要将
address
的成员添加到合约作为实验性 0.5.0 特性。
- 类型检查器:强制接口函数作为实验性 0.5.0 特性的外部函数。
- 类型检查器:需要本地变量的
storage
或 memory
关键字作为实验性 0.5.0 特性。
- 编译器接口:对于长源代码片段,格式化更好的错误消息
Bug 修复:
- 代码生成器:为每个 memory 字节数组元素分配一个字节,而不是 32 个字节。
- 代码生成器:不要接受小于四个字节的数据(截断的函数)。
签名)用于常规函数调用 - 而是调用 fallback 函数。
- 优化器:删除未使用的堆栈计算结果。
- 解析器:修复 VariableDeclarationStatement 的源位置。
- 类型检查器:允许在 view 函数中使用
gas
。
- 类型检查器:不要将事件参数标记为阴影状态变量。
- 类型检查器:防止重复的事件声明。
- 类型检查器:正确检查数组长度,不要依赖代码生成中的断言。
- 类型检查器:正确支持覆盖从
address
继承的合约中的成员。
(例如 balance
、transfer
等)
- 类型检查器:即使未分配,也验证元组表达式中的每个数字文字。
### 0.4.17 (2017-09-21)
特性:
- 汇编解析器:支持多重赋值 (
x, y := f()
)。
- 代码生成器:在使用实验性“ABIEncoderV2”时,保留编码函数的单个副本。
- 代码生成器:部分支持将
structs
作为参数和返回参数传递(现在需要 pragma experimental ABIEncoderV2;
)。
- 常规:支持
pragma experimental "v0.5.0";
来激活即将到来的重大更改。
- 常规:在外部函数类型上添加了
.selector
成员来检索它们的签名。
- 优化器:添加新的优化步骤以删除未使用的
JUMPDEST
s。
- 静态分析器:警告使用已弃用的内置函数
sha3
和 suicide
(分别由 keccak256
和 selfdestruct
替换,分别在 0.4.2 和 0.2.0 中引入)。
- 语法检查器:如果未在合约函数上指定可见性,则发出警告。
- 类型检查器:为未使用的函数参数/返回参数显示有用的警告。
- 类型检查器:不要为事件多次显示相同的错误。
- 类型检查器:大大减少了为重复的构造函数和函数显示的重复错误数量。
- 类型检查器:在使用
keccak256
、sha3
、sha256
和 ripemd160
中将文字作为紧密打包参数放置时发出警告。
- 类型检查器:强制执行
view
和 pure
。
- 类型检查器:强制执行带有错误的
view
/ constant
作为实验性 0.5.0 特性。
- 类型检查器:强制 fallback 函数作为实验性 0.5.0 特性的
external
。
Bug 修复:
- ABI JSON:包括所有重载的事件。
- 解析器:与 parseTypeName 相关的崩溃修复。
- 类型检查器:允许常量字节数组。
### 0.4.16 (2017-08-24)
特性:
- ABI JSON:包括新字段
stateMutability
,其值为 pure
、view
、
nonpayable
和 payable
。
- 分析器:对 Z3 SMT 检查器(“SMTChecker”)的实验性部分支持。
- 构建系统:构建过程中不再生成共享库(
libsolutil
、libevmasm
、libsolidity
和 liblll
)。
- 代码生成器:可以编码任意嵌套数组(“ABIEncoderV2”)的 ABI 编码器的实验性新实现
- 元数据:将实验性标志存储在元数据 CBOR 中。
- 解析器:如果在错误中找到多个可见性说明符,则显示之前的可见性说明符。
- 解析器:为函数引入
pure
和 view
关键字,
constant
仍然是 view
的别名,纯度尚未强制执行,。
因此请谨慎使用。
- 静态分析器:警告大型存储结构。
- 语法检查器:支持
pragma experimental <feature>;
以启用。
实验性功能。
- 类型检查器:无效覆盖的更详细的错误消息。
- 类型检查器:警告移动文字。
Bug 修复:
- 汇编解析器:对数字文字更加严格。
- 汇编解析器:限制最大递归深度。
- 解析器:在数组和元组元素之间强制使用逗号。
- 解析器:限制最大递归深度。
- 类型检查器:与
using
相关的崩溃修复。
- 类型检查器:不允许在库中使用构造函数。
- 类型检查器:拒绝使用
new
语句创建接口合约 。
### 0.4.15 (2017-08-08)
特性:
- 类型检查器:如果尝试实例化一个抽象类,则展示未实现的函数。
Bug 修复:
- 代码生成器:
.delegatecall()
应该总是返回执行结果。
- 代码生成器:为 low-level 的
callcode
和 delegatecall
提供 "new account gas"。
- 类型检查器:如果已声明,则必须实现构造函数。
- 类型检查器:不允许在
ecrecover
、sha256
和 ripemd160
上使用 .gas()
修饰符。
- 类型检查器:不要将重载函数标记为阴影其他函数。
- 类型检查器:如果已声明,则必须实现内部库函数。
### 0.4.14 (2017-07-31)
```特性:
* C API (``jsonCompiler``): 导出 ``license`` 方法。
* 代码生成器:优化回退函数,通过移除一个无用的跳转。
* 内联汇编:如果尝试访问 calldata 变量,则显示有用的错误消息。
* 内联汇编:支持没有初始值的变量声明(默认为 0)。
* 元数据:仅包括用于编译给定合约的文件。
* 类型检查器:禁止向没有 payable 回退函数的合约进行价值转移。
* 类型检查器:在显式转换错误消息中包含类型。
* 类型检查器:对于对于 ABI 编码来说太大的数组,引发适当的错误。
* 类型检查器:如果在构造函数中使用 ``this``,则发出警告。
* 类型检查器:当覆盖现有符号(包括内置符号)时,发出警告。
Bug修复:
* 代码生成器:正确清除 ecrecover 的返回内存区域。
* 类型检查器:修复对非左值赋值时发生的崩溃。
* 类型检查器:修复结构体引用成员的无效“指定 storage 关键字”警告。
* 类型检查器:将修饰器标记为 internal。
* 类型检查器:重新允许每个函数多次提及相同的修饰器。
### 0.4.13 (2017-07-06)
特性:
* 语法检查器:弃用 "throw",推荐使用 require()、assert() 和 revert()。
* 类型检查器:如果本地 storage 引用变量没有显式使用关键字 ``storage``,则发出警告。
Bug修复:
* 代码生成器:正确注销修饰器变量。
* 编译器接口:仅在分析成功时输出 AST。
* 错误输出:不要省略错误类型。
### 0.4.12 (2017-07-03)
特性:
* 汇编:添加 ``CREATE2`` (EIP86), ``STATICCALL`` (EIP214), ``RETURNDATASIZE`` 和 ``RETURNDATACOPY`` (EIP211) 指令。
* 汇编:在汇编输出中显示辅助数据。
* 汇编:将 ``SHA3`` 重命名为 ``KECCAK256``。
* AST:将所有属性导出为 JSON 格式。
* C API (``jsonCompiler``): 在内部使用 Standard JSON I/O。
* 代码生成器:添加了 Whiskers 模板系统。
* 内联汇编:``for`` 和 ``switch`` 语句。
* 内联汇编:函数定义和函数调用。
* 内联汇编:引入 ``keccak256`` 作为一个操作码。``sha3`` 仍然是一个有效的别名。
* 内联汇编:当没有为函数指令提供足够的参数时,显示适当的错误消息。
* 内联汇编:当指令隐藏 Solidity 变量时,发出警告。
* 内联汇编:当使用 ``jump``s 时,发出警告。
* 移除过时的 Why3 输出。
* 类型检查器:强制执行严格的 UTF-8 验证。
* 类型检查器:警告 storage 中的副本可能会意外覆盖。
* 类型检查器:警告从字面数字进行类型推断。
* 静态分析器:警告 ``callcode`` 的弃用。
Bug修复:
* 汇编:标记 ``MLOAD`` 在优化器中具有副作用。
* 代码生成器:修复空字面字符串的 ABI 编码。
* 代码生成器:修复负堆栈大小检查。
* 代码生成器:对于生成的输入验证例程,使用 ``REVERT`` 代替 ``INVALID``。
* 内联汇编:在解析函数指令时,强制执行函数参数。
* 优化器:不允许涉及 ``MLOAD`` 的优化,因为它会更改 ``MSIZE``。
* 静态分析器:不再为内联汇编中使用的变量发出未使用变量警告。
* 类型检查器:修复地址字面量未被视为编译时常量的问题。
* 类型检查器:修复了关于不可调用类型的崩溃。
* 类型检查器:修复了带常量函数参数的段错误。
* 类型检查器:不允许在映射和非 internal 函数类型之间进行比较。
* 类型检查器:不允许多次调用相同的修饰器。
* 类型检查器:不要将看起来像地址的字符串视为地址。
* 类型检查器:支持有效但被错误拒绝的 UTF-8 序列。
### 0.4.11 (2017-05-03)
特性:
* 实现 Standard JSON Input / Output API
* 支持 ``interface`` 合约。
* C API (``jsonCompiler``): 添加 ``compileStandard()`` 方法来处理 Standard JSON I/O。
* 命令行界面:添加 ``--standard-json`` 参数来处理 Standard JSON I/O。
* 命令行界面:支持 ``--allow-paths`` 来定义受信任的导入路径。注意:提供的源文件的路径始终是受信任的。
* 内联汇编:使用 ``_slot`` 和 ``_offset`` 后缀访问 Storage 变量。
* 内联汇编:不允许使用不平衡堆栈的块。
* 静态分析器:警告没有效果的语句。
* 静态分析器:警告未使用的局部变量、参数和返回参数。
* 语法检查器:对一元 '+' 发出弃用警告
Bug修复:
* 汇编输出:实现缺少的 AssemblyItem 类型。
* 编译器接口:修复了一个错误,该错误导致在使用不同编译器(clang vs. gcc)或编译器设置编译的 Solidity 之间,源索引可能不一致。该错误在 AST 和源映射中可见。
* Gas 估算器:反映最新的费用计划。
* 类型系统:从具有未实现构造函数的基础继承的合约应该是抽象的。
* 优化器:修复了常量优化器中的数字表示错误。
### 0.4.10 (2017-03-15)
特性:
* 添加 ``assert(condition)``,如果条件为假则抛出(用于内部错误)。
* 添加 ``require(condition)``,如果条件为假则抛出(用于无效输入)。
* 命令行界面:除非强制,否则不要覆盖文件。
* 引入 ``.transfer(value)`` 用于发送 Ether。
* 代码生成器:支持 ``revert()`` 中止并回滚,但不消耗所有 gas。
* 内联汇编:支持 ``revert`` (EIP140) 作为一个操作码。
* 解析器:支持数字中的科学计数法(例如 ``2e8`` 和 ``200e-2``)。
* 类型系统:支持外部函数到地址的显式转换。
* 类型系统:如果指数的底是字面量,则发出警告(结果类型可能出乎意料)。
* 类型系统:如果常量状态变量不是编译时常量,则发出警告。
Bug修复:
* 命令行界面:始终转义文件名(将 ``/``, ``:`` 和 ``.`` 替换为 ``_``)。
* 命令行界面:不要尝试创建路径 ``.`` 和 ``..``。
* 命令行界面:允许长库名称。
* 解析器:不允许八进制字面量。
* 类型系统:修复了由于继续代码中的致命错误而导致的崩溃。
* 类型系统:不允许对元组进行复合赋值。
* 类型系统:检测常量之间的循环依赖关系。
* 类型系统:不允许使用负长度的数组。
* 类型系统:修复了与无效二元运算符相关的崩溃。
* 类型系统:不允许使用空元组类型的 ``var`` 声明。
* 类型系统:正确地将函数参数类型转换为成员函数的指针。
* 类型系统:将构造函数的私有性移到 AST 本身。
* 内联汇编:在分析期间,为非价值类型收取一个堆栈槽。
* 汇编输出:在操作引用之前打印源位置,而不是之后。
* 优化器:停止尝试优化棘手的常量一段时间后。
### 0.4.9 (2017-01-31)
特性:
* 编译器接口:合约和库可以使用 ``file:`` 前缀引用,以使其唯一。
* 编译器接口:报告 "stack too deep" 错误的源位置。
* AST:使用确定性的节点标识符。
* 内联汇编:引入 ``invalid`` (EIP141) 作为一个操作码。
* 类型系统:引入类型标识符字符串。
* 类型检查器:警告地址的无效校验和,并从有效校验和中推断类型。
* 元数据:不要在版本号中包含平台。
* 元数据:添加选项以将源存储为字面内容。
* 代码生成器:将数组工具提取到低级函数中。
* 代码生成器:内部错误(数组越界等)现在通过使用无效指令(0xfe - EIP141)而不是无效跳转来导致恢复。无效跳转仍然保留用于显式抛出。
Bug修复:
* 代码生成器:允许递归结构体。
* 内联汇编:不允许命名为操作码的变量。
* 类型检查器:允许具有相同名称的多个事件(但具有不同的元数或参数类型)
* Natspec 解析器:修复了 ``@param`` 解析和空格的错误。
### 0.4.8 (2017-01-13)
特性:
* 优化器:性能改进。
* 输出:以新的标准化 Solidity 汇编格式打印汇编。
Bug修复:
* 重映射:优先选择更长的上下文而不是更长的前缀。
* 类型检查器,代码生成器:启用对基础合约名称的事件的访问。
* 导入:``import ".dir/a"`` 不是相对路径。相对路径以目录 ``.`` 或 ``..`` 开头。
* 类型检查器,不允许继承同名成员的不同类型(例如,函数和修饰符)。
### 0.4.7 (2016-12-15)
特性:
* 位移运算符。
* 类型检查器:当 ``msg.value`` 在 non-payable 函数中使用时,发出警告。
* 代码生成器:将元数据文件的 Swarm 哈希注入到字节码中。
* 代码生成器:用简单的汇编循环替换昂贵的 memcpy 预编译。
* 优化器:一些死代码消除。
Bug修复:
* 代码生成器:如果在内存(数组)复制期间调用身份预编译失败,则抛出。
* 类型检查器:不是有效 UTF-8 的字符串字面量无法转换为字符串类型
* 代码生成器:作为布尔参数给出的任何非零值现在都转换为 1。
* AST Json 转换器:用 ``VariableDeclarationStatement`` 节点替换 ``VariableDefinitionStatement``
* AST Json 转换器:修复 ``ElementaryTypeNameExpression`` 中的驼峰式命名
* AST Json 转换器:在函数定义节点中用 ``visibility`` 替换 ``public`` 字段
### 0.4.6 (2016-11-22)
Bug修复:
* 优化器:关于状态的知识没有为 JUMPDEST 正确清除(在 0.4.5 中引入)。
### 0.4.5 (2016-11-21)
特性:
* 函数类型
* Do-while 循环:支持 ``do <block> while (<expr>);`` 控制结构
* 内联汇编:支持 ``invalidJumpLabel`` 作为一个跳转标签。
* 类型检查器:现在更积极地搜索具有混合类型的内联数组的通用类型
* 代码生成器:当超出范围的值转换为枚举类型时,生成运行时错误。
Bug修复:
* 内联汇编:即使使用局部变量,也能正确计算堆栈高度警告。
* 代码生成器:检查 non-payable 构造函数中的价值转移。
* 解析器:不允许空的枚举定义。
* 类型检查器:不允许在不同的枚举类型之间进行转换。
* 接口 JSON:不包括尾随换行符。
### 0.4.4 (2016-10-31)
Bug修复:
* 类型检查器:禁止有符号指数,这会导致 EXP 操作码的不正确使用。
* 代码生成器:在存储到 storage 之前,正确清理高阶字节。
### 0.4.3 (2016-10-25)
特性:
* 内联汇编:支持 ``suicide`` 和 ``selfdestruct`` 操作码(注意:``suicide`` 已弃用)。
* 内联汇编:如果块后堆栈不平衡,则发出警告。
* 包括 ``keccak256()`` 作为 ``sha3()`` 的别名。
* 支持移动常量数字。
Bug修复:
* 命令行界面:不允许 ``solc`` 中存在未知选项。
* 名称解析器:允许继承 ``enum`` 定义。
* 类型检查器:为绑定函数进行适当的类型检查。
* 类型检查器:修复了与无效定点常量相关的崩溃
* 类型检查器:修复了与无效字面数字相关的崩溃。
* 类型检查器:``super.x`` 不会在当前合约中查找 ``x``。
* 代码生成器:在 ``super`` 作为表达式之后,期望零堆栈增加。
* 代码生成器:修复了库 ``L`` 中定义的 ``enum Foo`` 的 ``L.Foo`` 的内部编译器错误。
* 代码生成器:允许继承 ``enum`` 定义。
* 内联汇编:支持 ``address`` 操作码。
* 内联汇编:修复了标签后分配的解析。
* 内联汇编:不支持类型的外部变量(例如 ``this``, ``super`` 等)被正确检测为不可用。
* 内联汇编:支持修饰符中的变量。
* 优化器:修复了与 SHA3 操作的陈旧知识相关的问题
### 0.4.2 (2016-09-17)
Bug修复:
* 代码生成器:修复了从 payable 函数调用的库函数。
* 类型检查器:修复了关于无效数组类型的崩溃。
* 代码生成器:修复了在 0.4.0 版本之后可见的调用 gas 错误,该错误发生在输出大于输入的调用中。
### 0.4.1 (2016-09-09)
* 构建系统:修复以允许库编译。
### 0.4.0 (2016-09-08)
此版本故意破坏向后兼容性,主要是为了强制执行一些安全功能。最重要的更改是,你必须显式指定函数是否可以通过 ``payable`` 修饰符接收 ether。此外,更多情况会导致抛出异常。
升级所需的最小更改:
- 将 ``payable`` 添加到所有想要接收 Ether 的函数(包括构造函数和回退函数)。
- 在修饰符中将 ``_`` 更改为 ``_;``。
- 将版本 pragma 添加到每个文件:``pragma solidity ^0.4.0;``
重大更改:
* 源文件必须指定它们兼容的编译器版本,例如 ``pragma solidity ^0.4.0;`` 或 ``pragma solidity >=0.4.0 <0.4.8;``
* 想要接收 Ether 的函数必须指定新的 ``payable`` 修饰符(否则它们会抛出)。
* 想要通过普通的 "send" 接收 Ether 的合约必须实现带有 ``payable`` 修饰符的回退函数。如果未定义 payable 回退函数且没有函数匹配签名,则合约现在会抛出。
* 通过 "new" 创建合约失败会抛出异常。
* 除以零 / 取模除以零会抛出异常。
* 如果目标合约没有代码,函数调用会抛出异常
* 修饰符必须包含 ``_``(如果需要,可以使用 ``if (false) _`` 作为解决方法)。
* 修饰符:返回不会跳过 ``_`` 之后的修饰符部分。
* 修饰符中的占位符语句 `_` 现在需要显式的 `;`。
* 如果输入格式错误,``ecrecover`` 现在返回零(之前返回垃圾)。
* ``constant`` 关键字不能用于构造函数或回退函数。
* 删除了 ``--interface`` (Solidity 接口) 输出选项
* JSON AST:常规清理,重命名了许多节点以匹配其 C++ 名称。
* JSON 输出:``srcmap-runtime`` 重命名为 ``srcmapRuntime``。
* 将标准库合约从编译器内部移动(并重新设计)到 github.com/ethereum/solidity/std(``import "std";`` 或 ``import owned;`` 不再有效)。
* 删除了令人困惑且未记录的关键字 ``after``。
* 新的保留字:``abstract``, ``hex``, ``interface``, ``payable``, ``pure``, ``static``, ``view``。
特性:
* 十六进制字符串字面量:``hex"ab1248fe"``
* Internal: 代码生成器可用的内联汇编。
* 命令行界面:使用 ``-`` 作为文件名允许从 stdin 读取。
* 接口 JSON:回退函数现在是 ABI 的一部分。
* 接口:版本字符串现在与 *SemVer* 兼容。
* 代码生成器:如果我们知道被调用的帐户存在,则不提供“新帐户 gas”。
Bug修复:
* JSON AST:节点被添加到错误的父节点
* Why3 转换器:指数的崩溃修复
* 命令行界面:链接名称中带有下划线的库。
* 类型检查器:回退函数不能再返回数据。
* 代码生成器:修复了在不支持的类型上使用 ``sha3()`` 时发生的崩溃。
* 代码生成器:为 ``.send(0)`` 手动设置 gas 津贴。
文档进行了大量更改,主要由自愿的外部贡献者完成。
### 0.3.6 (2016-08-10)
特性:
* 形式化验证:考虑外部对合约的影响。
* 类型检查器:关于低级调用和发送的未使用返回值的警告。
* 输出:作为 AST 输出一部分的源位置和节点 id
* 输出:字节码的源位置映射
* 输出:作为 json 编译器输出的一部分的形式化验证。
Bug修复:
* 命令行界面:如果从 stdin 获取输入,则不会崩溃。
* 扫描器:正确支持字符串中的 Unicode 转义码。
* JSON 输出:修复了关于相对 / 绝对源文件名的错误。
* JSON 输出:修复了关于无效 utf8 字符串的错误。
* 代码生成器:空数组的动态分配导致无限循环。
* 代码生成器:正确计算 memcpy 预编译的 gas 要求。
* 优化器:如果连接了两个代码路径,则清除已知状态。
### 0.3.5 (2016-06-10)
特性:
* 上下文相关的路径重映射(不同的模块可以使用不同版本的相同库)
Bug修复:
* 类型检查:从外部调用获取数据时,动态返回类型被删除,现在它们被替换为“不可用”类型。
* 类型检查:构造函数的覆盖被认为是使函数成为非抽象的。
### 0.3.4 (2016-05-31)
文档之外没有变化。
### 0.3.3 (2016-05-27)
* 允许调用(通过“内联”)内部库函数
* 分数/有理常数(仅可与仍在开发中的定点类型一起使用)
* 内联汇编可以访问内部函数(作为跳转标签)
* 在终端上不带参数运行 `solc` 将打印帮助。
* Bug修复:消除代码生成中的一些不确定性。
* Bug修复:更正了内联汇编中 not / bnot / iszero 的用法
* Bug修复:在比较之前正确清理 bytesNN 类型
### 0.3.2 (2016-04-18)
* Bug修复:内联汇编解析器:`byte` 操作码不可用
* Bug修复:错误报告:可变大小类型的 token 没有正确转换为字符串
* Bug修复:结构体的动态数组未正确删除。
* Bug修复:构造函数参数列表中的静态数组未正确解码。
### 0.3.1 (2016-03-31)
* 内联汇编
* Bug修复:代码生成:使用窄类型的数组访问未清理高阶位
* Bug修复:错误报告:具有未知源位置的错误报告导致崩溃
### 0.3.0 (2016-03-11)
重大更改:
* 添加了新的关键字 `assembly`、`foreign`、`fixed`、`ufixed`、`fixedNxM`、`ufixedNxM`(对于 M 和 N 的各种值)、`timestamp`
* 数字常量除法不会四舍五入为整数,而是四舍五入为定点类型(例如 `1 / 2 != 1`,但 `1 / 2 == 0.5`)。
* 库调用现在默认使用 DELEGATECALL(例如,对于 `msg.value` 和 `msg.sender`,调用的库函数看到的值与调用函数相同)。
* `<address>.delegatecall` 作为低级调用接口
Bug修复:
* 修复了优化器中的一个错误,该错误导致比较错误。
### 0.2.2 (2016-02-17)
* 类型 `bytes1`、...、`bytes32` 的索引访问(目前仅限读取访问)。
* Bug修复:基本构造函数参数数量错误的类型检查器崩溃。
### 0.2.1 (2016-01-30)
* 内联数组,即 `var y = [1,x,f()];` 如果 `1`、`x` 和 `f()` 有一个共同的类型。 请注意,结果始终是固定长度的内存数组,并且尚无法转换为动态长度的内存数组。
* 类似于 ECMAScript6 导入的导入(`import "abc.sol" as d` 和 `import {x, y} from "abc.sol"`)。
* 命令行编译器 solc 自动解析缺少的导入并允许"include directories"。
* 条件:`x ? y : z`
* Bug修复:修复了优化器生成无效代码的几个错误。
* Bug修复:枚举和结构体无法被其他合约访问。
* Bug修复:修复了与函数参数类型相关的段错误,出现在 gas 估算期间。
* Bug修复:基本构造函数参数数量错误的类型检查器崩溃。
* Bug修复:允许具有不同数组类型的函数重载。
* Bug修复:允许类型 `(x) = 7` 的赋值。
* Bug修复:类型 `uint176` 不可用。
* Bug修复:修复了与构造函数调用相关的类型检查期间的崩溃。
* Bug修复:修复了与结构体类型的无效访问器相关的代码生成期间的崩溃。
* Bug修复:修复了与计算结构体类型的哈希相关的代码生成期间的崩溃。
### 0.2.0 (2015-12-02)
* **重大更改**:`new ContractName.value(10)()` 必须写为 `(new ContractName).value(10)()`
* 添加了 `selfdestruct` 作为 `suicide` 的别名。
* 使用 `new` 分配内存数组。
* 通过 `using x for y` 将库函数绑定到类型
* `addmod` 和 `mulmod`(具有任意中间精度的模加法和模乘法)
* Bug修复:未正确读取固定数组类型的构造函数参数。
* Bug修复:包含数组或字符串的结构体的内存分配。
* Bug修复:库中显式内存参数的数据位置设置为storage。
### 0.1.7 (2015-11-17)
* 改进了意外 token 的错误消息。
* 概念验证性地将合约转译为 why3 以进行形式化验证。
* Bug修复:数组(也是字符串)作为事件的索引参数。
* Bug修复:写入 `bytes` 或 `string` 的元素会覆盖其他元素。
* Bug修复:Windows 上的"Successor block not found"。
* Bug修复:在元组中使用字符串字面量。
* Bug修复:处理库版本中的无效提交哈希。
* Bug修复:Windows 上的一些测试框架修复。
### 0.1.6 (2015-10-16)
* 动态 storage 数组的 `.push()`。
* 元组表达式(`(1,2,3)` 或 `return (1,2,3);`)
* 多个变量的声明和赋值(`var (x,y,) = (1,2,3,4,5);` 或 `var (x,y) = f();`)
* 解构赋值(`(x,y,) = (1,2,3)`)
* Bug修复:关于使用具有无效类型的库函数的内部错误。
* Bug修复:正确解析语句级别的 `Library.structType a`。
* Bug修复:正确报告带括号表达式的源位置(作为"元组"故事的一部分)。
### 0.1.5 (2015-10-07)
* storage 编码中的重大更改:将短字节数组和字符串及其长度一起编码到 storage 中。
* 报告警告
* 允许公共库函数的 storage 引用类型。
* 通过 `.` 访问在其他合约和库中声明的类型。
* 库运行时字节码开头的版本戳记。
* Bug修复:已初始化的字符串状态变量和构造函数中的动态数据的问题。
* Bug修复:自动解析关于 `new` 的依赖项。
* Bug修复:允许匿名事件的四个索引参数。
* Bug修复:检测接受任意参数的函数中太大的整数常量。
### 0.1.4 (2015-09-30)
* Bug修复:返回固定大小的数组。
* Bug修复:solc 的 combined-json 输出。
* Bug修复:访问固定大小的数组返回值。
* Bug修复:禁止从字面字符串赋值给 storage 指针。
* 重构:将类型检查移动到自己的模块中。
### 0.1.3 (2015-09-25)
* `throw` 语句。
* 包含通过 CALLCODE 调用的函数的库。
* 编译器用于插入其他合约地址的链接器阶段(用于库)。
* 编译器选项,用于输出合约的运行时部分。
* 编译时对通过整数常量访问固定大小数组的越界检查。
* 版本字符串包含 libevmasm/libethereum 的版本(包含优化器)。
* Bug修复:常量公共状态变量的访问器。
* Bug修复:在克隆合约中传播异常。
* Bug修复:现在可以正确处理空单行注释。
* Bug修复:正确检查事件的索引参数数量。
* Bug修复:结构体构造函数中的字符串。
### 0.1.2 (2015-08-20)
* 改进的命令行界面。
* `bytes` 和 `string` 之间的显式转换。
* Bug修复:克隆合约中使用的价值转移。
* Bug修复:字符串作为映射键的问题。
* Bug修复:防止使用某些运算符。
### 0.1.1 (2015-08-04)
* 字符串可以用作映射键。
* 克隆合约。
* 为内存中的结构体跳过映射成员。
* 仅为 storage 引用使用单个堆栈槽。
* 改进的错误参数计数消息。 (#2456)
* Bug修复:修复了 `bytesXX` 类型之间的比较。 (#2087)
* Bug修复:不允许整数文字的浮点数。 (#2078)
* Bug修复:许多局部变量的一些问题。 (#2478)
* Bug修复:正确初始化 `string` 和 `bytes` 状态变量。
* Bug修复:正确计算 callcode 的 gas 要求。
### 0.1.0 (2015-07-10)
>- 原文链接: [github.com/ethereum/soli...](https://github.com/ethereum/solidity/blob/develop/Changelog.md)
>- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~