Solidity v0.7.0中断更改
本节重点介绍Solidity版本0.7.0中引入的主要突破性更改,以及更改背后的推理以及如何更新受影响的代码。对于完整列表检查 the release changelog .
语义的无声变化
非文字的指数和位移(例如。
1 << x或2 ** x)将始终使用uint256(对于非负数字面值)或int256(对于负数字面值)执行操作。以前,操作是以移位量/指数的类型执行的,这可能会造成误导。
语法的更改
在外部函数和协定创建调用中,现在使用新语法指定乙醚和气体:
x.f{{gas: 10000, value: 2 ether}}(arg1, arg2). 旧的语法--x.f.gas(10000).value(2 ether)(arg1, arg2)--将导致错误。全局变量
now已弃用,block.timestamp应该改为使用。单一标识符now对于全局变量来说太泛型了,可能会给人一种在事务处理过程中发生更改的印象,而block.timestamp正确地反映了它只是块的一个属性。变量上的NatSpec注释只允许用于公共状态变量,而不允许用于局部或内部变量。
代币
gwei是一个关键字now(用于指定,例如。2 gwei作为数字),不能用作标识符。字符串文字现在只能包含可打印的ASCII字符,这还包括各种转义序列,如十六进制 (
\xff)unicode转义 (\u20ac)现在支持Unicode字符串文本来容纳有效的UTF-8序列。它们与
unicode前缀:unicode"Hello 😃".状态可变性:现在可以在继承期间限制函数的状态可变性:具有默认状态可变性的函数可以被重写
pure和view函数whileview函数可以被重写pure功能。同时考虑了公共状态变量view甚至pure如果它们是常数。
内联程序集
不允许的
.在内联程序集中的用户定义函数和变量名中。如果在“仅Yul”模式下使用Solidity,则它仍然有效。存储指针变量的槽和偏移量
x通过访问x.slot和x.offset而不是x_slot和x_offset.
移除未使用的或不安全的特征
存储外部映射
如果结构或数组包含映射,则只能在存储中使用。以前,映射成员在内存中被无提示地跳过,这是令人困惑和容易出错的。
如果存储中的结构或数组包含映射,则对它们的分配将不起作用。以前,在复制操作过程中,映射会被无提示地跳过,这很容易产生误导和错误。
功能和事件
可见性 (
public/internal构造函数不再需要):要防止创建合同,可以将其标记为abstract。这使得构造函数的可见性概念过时了。类型检查器:不允许
virtual对于库函数:由于库不能从继承,因此库函数不应是虚拟的。不允许在同一继承层次结构中具有相同名称和参数类型的多个事件。
using A for B仅影响中提到的合同。以前,这种影响是遗传的。现在,你必须重复using所有使用该功能的派生契约中的语句。
表达
不允许按有符号类型的移位。以前,允许负数的移位,但在运行时恢复。
这个
finney和szabo面额被删除。它们很少被使用,而且不容易看到实际的用量。相反,显式值1e20或者很普通的gwei可以使用。
声明
关键词
var不能再使用了。以前,此关键字将进行解析,但会导致类型错误和有关使用哪种类型的建议。现在,它会导致解析器错误。
接口更改
JSON AST:用标记十六进制字符串文本
kind: "hexString".JSON AST:具有值的成员
null从JSON输出中移除。NatSpec:构造函数和函数具有一致的userdoc输出。
如何更新代码
本节详细说明了如何为每次中断更改更新先前的代码。
变化
x.f.value(...)()到x.f{{value: ...}}(). 同样地(new C).value(...)()到new C{{value: ...}}()和x.f.gas(...).value(...)()到x.f{{gas: ..., value: ...}}().变化
now到block.timestamp.将移位运算符中右操作数的类型更改为无符号类型。例如变更
x >> (256 - y)到x >> uint(256 - y).重复
using A for B所有派生合同中的语句(如果需要)。移除
public来自每个构造函数的关键字。移除
internal关键字从每个构造函数和添加abstract合同(如果尚未提交)。变化
_slot和_offset内联程序集中的后缀.slot和.offset,分别。