热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cleanmymac3.9.6_Solidity0.6新特性解析

Solidity是一门为实现智能合约而创建的高级编程语言,在区块链领域非常流行。FISCOBCOS从开始就支持使用Solidity进行合约开发,在FIS

12edee185602d679bae81355e51b1f13.png

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

新特性解析

30f9a8f09a11a15da8350bb0c1b01fc4.png

本节重点介绍Solidity 0.6版本中新加入的特性。

1. 引入新的try/catch特性

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

下面是一个例子。

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

另一个需要注意的点是catch语句后的参数区别:
  • catch Error(string memory reason)用于捕获revert("reasonString") 和 require(false, "reasonString") 
  • catch (bytes memory lowLevelData)用于捕获除上一种情况之外的异常,例如assert()或者除以0或者异常没有错误信息的情况
  • catch { ... }用于不关心异常信息的情况

// SPDX-License-Identifier: MITpragma solidity ^0.6.1;contract CharitySplitter { address public owner; constructor(address _owner) public { require(_owner != address(0), "no-owner-provided"); owner = _owner; }}contract CharitySplitterFactory { mapping(address => CharitySplitter) public charitySplitters; uint256 public errorCount; event Log(string reason);    event LogBytes(bytes reason); function createCharitySplitter(address charityOwner) public { try new CharitySplitter(charityOwner) returns ( CharitySplitter newCharitySplitter) { charitySplitters[msg.sender] = newCharitySplitter; } catch Error(string memory reason) { // catch failing revert() and require() errorCount++; emit Log(reason); } catch (bytes memory reason) { // catch failing assert() errorCount++; emit LogBytes(reason); } }}

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

// SPDX-License-Identifier: MITpragma solidity ^0.6.1;enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill

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

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

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

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

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

需要明确指定的更改

30f9a8f09a11a15da8350bb0c1b01fc4.png

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

语义和句法变化

30f9a8f09a11a15da8350bb0c1b01fc4.png

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

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

小结

30f9a8f09a11a15da8350bb0c1b01fc4.png

为了实现对国密的支持,FISCO BCOS对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三个版本的发布包。

FISCO BCOS版本

最低支持Solidity版本

最高支持Solidity版本

v2.0.0-v2.5.0

0.4.25

0.5.2

v2.6.0

0.4.25

0.6.10

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

58079b79f39e008021779288829f4963.png

FISCO BCOS的代码完全开源且免费

下载地址↓↓↓

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

6460dcf0534d515e5cc8a2b0e3cef669.png




推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
author-avatar
keleisibuo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有