LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > Solidity 0.6新特性解析

Solidity 0.6新特性解析

2020-09-30 FISCO BCOS开源社区 来源:火星财经
FISCO BCOS已支持Solidity 0.6

Solidity是一门为实现智能合约而创建的高级编程语言,在区块链领域非常流行。FISCOBCOS从开始就支持使用Solidity进行合约开发,在FISCOBCOSv2.6.0中,社区使用evmone替换了原有的EVM解释器以获得更好的性能表现,同时也实现了对Solidity0.6版本支持。本文将简要解读Solidity0.6版本中的新特性和重要变更,以便社区开发者了解。

新特性解析

本节重点介绍Solidity0.6版本中新加入的特性。

1.引入新的try/catch特性

Solidity0.6版本引入了新的try/catch特性,能够捕获外部函数调用或者合约创建时候的错误。

下面是一个例子。

创建CharitySplitter合约对象时,需要传入owner的地址,如果传入全0的地址,就会出现错误。如果错误出现在try后边的表达式中或者是表达式涉及的内部函数中,则不能够被捕获。

另一个需要注意的点是catch语句后的参数区别: catchError(stringmemoryreason)用于捕获revert("reasonString")和require(false,"reasonString") catch(bytesmemorylowLevelData)用于捕获除上一种情况之外的异常,例如assert()或者除以0或者异常没有错误信息的情况

catch{...}用于不关心异常信息的情况

//SPDX-License-Identifier:MITpragmasolidity^0.6.1;
contractCharitySplitter{addresspublicowner;
constructor(address_owner)public{require(_owner!=address(0),"no-owner-provided");owner=_owner;}}
contractCharitySplitterFactory{mapping(address=>CharitySplitter)publiccharitySplitters;uint256publicerrorCount;eventLog(stringreason);eventLogBytes(bytesreason);
functioncreateCharitySplitter(addresscharityOwner)public{trynewCharitySplitter(charityOwner)returns(CharitySplitternewCharitySplitter){charitySplitters[msg.sender]=newCharitySplitter;}catchError(stringmemoryreason){//catchfailingrevert()andrequire()errorCount++;emitLog(reason);}catch(bytesmemoryreason){//catchfailingassert()errorCount++;emitLogBytes(reason);}}}

2.struct和enum现在可以在合约文件中声明,不再限制在contract或library中


//SPDX-License-Identifier:MITpragmasolidity^0.6.1;
enumActionChoices{GoLeft,GoRight,GoStraight,SitStill

3.数组切片可以作为calldata数组,例如


abi.decode(msg.data[4:],(uint,uint))

4.注释描述规范了Natspec在开发文档中支持多返回值,并强制执行与@param同名的检查

5.Yul和内联汇编有一个名为leave的新语句,该语句退出当前函数

6.现在可以通过payable(x)把address转换为addresspayable,x需要为地址类型

需要明确指定的更改

本节列出了该版本中需要更明确显示代码的更改。 仅当函数被标记为virtual或在接口中定义,才可以被override,在接口外部没有实现的函数必须标记为virtual,覆盖函数或修饰符时,必须使用新关键字override标注,当覆盖的函数或修饰符在多个基类定义时,需要在override关键字后的括号中列出,例如override(Base1,Base2)。 数组的长度现在是只读的,即便是storage类型的数组,不再能通过修改数组length来调整数组的大小,请使用push(),push(value)或pop()替代,或者赋值一个新的数组给原数组。 新关键字abstract用来标记一个抽象合约,如果一个合约有未实现的函数,需要使用abstract标记,抽象合约不能通过new创建,并且编译时不会生成字节码。 库需要实现所有的函数,不再仅仅是内部函数。 内联汇编中声明的变量名可以不再以_slot或_offset结尾。 内联汇编中的变量声明可能不会屏蔽在内联汇编代码块之外声明的变量,如果变量名包含一个点,则该点之前的前缀可能与内联汇编块外部的任何声明都没有冲突。

子类合约不能屏蔽父类的状态变量,如果父类声明了非private的变量x,那么子类不能再声明同名状态变量。

语义和句法变化

本节描述了该版本中必须要修改代码的变更。 禁止从外部函数类型到address的转换,外部函数类型从这个版本起具有address的成员,类似于现有的selector成员。 对于动态storage类型的数组,函数push(value)不再返回新的长度。 未命名的函数通常称为fallback函数,被拆分为一个使用fallback关键字定义的回调函数和使用关键字receive定义的接受以太函数。 1.如果有receive函数,每当调用数据为空时,该函数会被调用,无论是否有以太接收,receive函数隐含带有payable。

2.当没有其他函数匹配时,新的回调函数会被调用(如果不存在receive函数,则当调用数据为空时,也会调用回退函数)。回调函数可以选择是否标记为payable,如果没有payable那么附加以太且匹配不到其他函数的调用会回滚。只有在实现升级或代理模式的合约时,才需要实现新的回调函数。

小结

为了实现对国密的支持,FISCOBCOS对FISCO-BCOS/solidity项目做了部分更改,主要是在国密模式将哈希算法替换为SM3。当前FISCO-BCOS/solidity项目有0.4.25、0.5.2、0.6.10三个版本,支持win、mac、Linux-generic64和Linux-aarch64四种平台,分别提供国密和非国密的solc编译器,相应的console项目也提供0.4、0.5和0.6三个版本的发布包。

FISCOBCOS版本

最低支持Solidity版本

最高支持Solidity版本

v2.0.0-v2.5.0

0.4.25

0.5.2

v2.6.0

0.4.25

0.6.10

FISCOBCOS开源社区会持续关注Solidity的进展,及时添加对新特性的支持,目前FISCOBCOS开发工作仍在持续进行,新版本需求也在持续收集规划中,欢迎大家共同探讨交流。



FISCOBCOS的代码完全开源且免费

下载地址↓↓↓

https://github.com/FISCO-BCOS/FISCO-BCOS


本文来源:FISCO BCOS开源社区
原文标题:Solidity 0.6新特性解析

—-

编译者/作者:FISCO BCOS开源社区

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

知识 以太 解析
LOADING...
LOADING...