2020 年 7 月 28 日,Solidity 编译器的次要版本升至 0.7.0. 变更日志[3]上包含 32 个修改要点。在 Solidity 文档上也用了一整页介绍 0.7.0 的突破性更新[4]。
因此值得花一些时间深入研究以下其中的变更内容,并思考这些更改在实践中如何影响 Solidity 智能合约代码。
下面,我将综合上面提到的变更日志和文档中的重大更新,重新陈述相关类型,尽量尝试澄清和做有益的补充,同时,我会尝试按变化程度进行分组排序。
contract.function.gas(1000).value(2 ether)(arg1,arg2)
,新语法是contract.function{gas:1000, value:2 ether}(arg1,arg2)
。对于使用过 Web3.js 的 Soldity 开发人员来说,应该不会感到陌生。public
/external
)现在被省略,因此不再需要指定。解析器现在将对此发出警告。为了防止合约部署,可以在合约上标记关键字abstract
(例如,abstract Contract {}
)。now
,而推荐使用block.timestamp
。这已经是一段时间以来推荐的使用方法,因为它有助于避免now
一词产生的误导性(指的是区块时间而不是当前时间)。@notice
NatSpec 注释(例如/// 注释
或/// @notice 注释
)会转换为显式@dev
注释(例如/// @dev 注释
)或简单的行内注释(例如// 注释
)。gwei
关键字,因此gwei
不能再作为变量或函数名称。在0.6.x
版本中,gwei 即可用作面额*,还可以用作标识符,这会让人产生困惑,如下面不好的示例:// 以前的行为
uint gwei = 5;
uint value = gwei * 1 gwei; // value: 5000000000
现在这样与gwei
造成的混淆,会触发编译器的解析错误提示。
finney
和szabo
已停用,因此,现在可以将其用作标识符。(尽管建议不要立即使用它们,以免造成潜在的混乱。)unicode
前缀标识(例如,unicode"Text, including emoji! ?"
)。var
关键字声明变量,用来隐式分配类型,已在多个版本中弃用了,现在完全禁止使用,只能使用显式声明类型的变量。view
,那么它可以被pure
函数重写。 // 现在的写法
contract Parent {
function show() public virtual returns(uint){
return 100;
}
}
contract Child is Parent {
function show() public pure override returns(uint){ // 可以用 pure 重写
return 25;
}
}
250 << x
或250 ** x
中,使用 x 的类型)。现在,将使用uint256
(用于非负常量)或int256
(用于负常量)来执行操作。// 之前
uint8 x = 2;
uint shift = 250 << x; // shift: 232
uint exp = 250 ** x; // exp: 36
// 现在
uint8 x = 2;
uint shift = 250 << x; // shift: 1000
uint exp = 250 ** x; // exp: 62500
注意之前如何将两个结果隐式转换为x
类型,即 uint8,因此会发生溢出。
现在,两个结果均为uint256
类型,因此在此案例中避免溢出。
shiftThis >> amount
和 shiftThis << amount
)。以前,允许负移,但会在运行时回退。virtual
。因为库事实上是无法继承的,这实际上说的通。.
(_ period _)的用户定义标识符,除非在 Solidity Yul-only 模式下运行。.
访问(例如stor.slot
和stor.offset
),而不再使用下划线_(例如 stor_slot 和 stor_offset)。.
。你可能想知道什么是pc
指令?如黄皮书中所定义,它应该:在与该指令相对应的增量之前获取程序计数器的值。
Solidity 0.7 还有一些不影响编码的修改和 Bug 的修复。
如你所见,Solidity 在往更加明确的语义前进。这对于智能合约的安全性是绝对有利,保持升级 Solidity 也是成为熟练的 Soldity 开发人员的重要组成部分。
如果你需要更新代码,可以看看突破性更新[6]中提到的技巧,并推荐你使用solidity-upgrade 工具[7]。
本翻译由 Cell Network[8] 赞助支持。
来源:https://forum.openzeppelin.com/t/changes-in-solidity-0-7-0/3758
[1]
登链翻译计划: https://github.com/lbc-team/Pioneer
[2]
Tiny 熊: https://learnblockchain.cn/people/15
[3]
变更日志: https://github.com/ethereum/solidity/releases/tag/v0.7.0
[4]
介绍0.7.0的突破性更新: https://learnblockchain.cn/docs/solidity/070-breaking-changes.html
[5]
ASCII字符和各种转义序列: https://solidity.readthedocs.io/en/latest/types.html?highlight=ascii#string-literals-and-types
[6]
突破性更新: https://learnblockchain.cn/docs/solidity/070-breaking-changes.html
[7]
solidity-upgrade工具: https://solidity.readthedocs.io/en/latest/using-the-compiler.html#solidity-upgrade
[8]
Cell Network: https://www.cellnetwork.io/?utm_souce=learnblockchain