一种形式验证Solidity智能合约的方法技术

技术编号:20424705 阅读:33 留言:0更新日期:2019-02-23 08:20
本发明专利技术公开一种形式验证Solidity智能合约的方法,从Solidity智能合约中建立模型,使用Boogie语言对该模型进行描述,然后利用Z3证明器进行验证。本发明专利技术的方法设计了一套通用的智能合约模型规范语言,解决了Solidity智能合约和数学模型之间的转化问题,同时对于形式验证其他语言的智能合约也具有重要的参考价值;该方法帮助智能合约的开发者快速、全面、严谨地验证智能合约的功能,定位智能合约的漏洞,保证智能合约的安全。

【技术实现步骤摘要】
一种形式验证Solidity智能合约的方法
本专利技术涉及区块链技术、智能合约技术、形式验证、Solidity合约语言、Boogie模型语言、Z3定理证明器,尤其涉及形式验证Solidity智能合约的方法。
技术介绍
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。2008年由中本聪提出区块链的概念,在随后几年中,成为了电子货币比特币的核心组成部分。到2014年,区块链2.0成为关于去中心化区块链数据库的术语。作为第二代可编程区块链,它的主要特点是允许用户写出更精密和智能的协议,也就是所谓的智能合约。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约相对传统合约能自动执行原定协议,减少其他交易成本。但是由于区块链上的智能合约是所有用户都能看见的,并且一旦部署无法篡改,所以如果智能合约本身存在漏洞,那么就可能被人发现并进行攻击。这样的攻击往往难以迅速解决,例如著名的TheDao攻击造成了5000万美元的损失,当维护人员试图解决漏洞时黑客已经成功完成了资金回收。很明显,如何编写安全的智能合约已经成为区块链应用开发者关心的问题。传统的流程测试和静态检验确实是一种发现漏洞的有效手段,但它们只能查找漏洞,却无法证明没有漏洞。形式验证是一种从数学上完备地证明或验证某一模型是否实现了规范所述功能的方法,它可以成为保障智能合约安全的一个有效手段。形式验证可以对指定描述的所有可能的情况进行验证,借用数学上的方法将程序和规范直接进行比较,发现问题或证明没有问题。形式验证方法分为等价性验证、模型验证和定理证明等。但是等价性验证和定理证明存在转化方案上的困难,而模型验证也存在状态爆炸等问题,因此就目前的技术来看,形式验证对于某些形式的程序仍然无法很好地进行验证。虽然很难设计一个通用的智能合约形式验证方案,但是针对某种特定语言的智能合约,比如Solidity智能合约,是可以在满足其大部分语义和功能的前提下,进行形式验证的。Solidity是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了C++、Python和Javascript语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。目前这门语言是智能合约开发的主流语言,用它可以在区块链上实现投票、众筹、秘密竞拍(盲拍)、多重签名的钱包以及其他应用。Boogie是一种模型验证语言,用于描述程序的验证条件。Boogie是一种介于SMT语言和程序语言之间的中间语言,用Boogie语言描述程序验证条件后将转化为SMT语言,然后由SMT证明器进行验证。目前基于Boogie开发的程序语言有Dafny、F*、Koka等。Z3定理证明器是一种SMT证明器,它可以用于验证逻辑表达式的可满足性。Z3作为一个底层工具,具有一套脚本语言作为输入,而这个脚本符合SMT-LIB2.0标准。一旦输入符合标准的脚本,Z3可以高效的对输入的逻辑表达式进行验证,并输出满足、不满足或未知,如果是可满足的,还可以输出一个满足条件的解。利用Z3这个底层工具,就可以开发出程序的形式验证功能,关键就在于将程序语言一步步等价转化为符合SMT-LIB2.0标准的脚本,而这个过程,本质是将程序抽象成数学模型的过程。Antlr4是一种语法解析工具,可以通过定义语法文件,实现将某一程序代码转化为语法树,并在该语法树的基础上对程序代码进行处理的功能。
技术实现思路
本专利技术的目的是针对Solidity智能合约,提供一种形式验证的实现方案,将程序语言Solidity等价转化为Boogie语言,所谓等价转化是指在转化过程中保持Solidity程序语义和功能的一致性,最终形成的Boogie程序能够忠实地刻画原来Solidity合约所实现的功能。本专利技术的目的是通过以下技术方案来实现的:一种形式验证Solidity智能合约的方法,其特征在于,该方法具体包括如下步骤:S1:首先利用Anltr4语法设计SolidityModelLanguage规范,所述的规范包括SML语句规范和SML函数规范,SML语句规范以符号'//@'开头,后跟假设语句或断言语句;SML函数规范以符号'//@'开头,后跟规范体;或者以符号'/*@'开头,后跟规范体,最后以符号'*/'结尾;其中,所述的规范体包括前置条件语句、后置条件语句、修改权限语句;SML循环规范以符号'//@'开头,后跟循环语句。所述的假设语句、断言语句、前置条件语句、后置条件语句、修改权限语句和循环语句都由相应语句的关键字和谓词组成;S2:按照S1所述的SML语法规范在Solidity智能合约中添加详细的注解规范;S3:如果智能合约开发者进行形式化验证的智能合约的目标文件依赖其他多个Solidity智能合约文件时,首先将依赖文件和目标文件合并成一个文件;S4:将S3的合并后的文件中的代码由Solidity转化为Boogie,采用弱化继承、弱化封装、增强多态、去可见性的方式以去除面向对象的语言特性,并将Solidity语法中的类型、语句和表达式转换为Boogie语法中相对应的类型、语句和表达式;S5:采用S4中同样的方法将S2中为Solidity智能合约添加的注解规范转换为Boogie语法的规范;S6:将通过S4和S5转换后的带有详细注解规范的Boogie代码保存在文件名后缀为.bpl的文件中;S7:利用集成Boogie编译器和Z3定理证明器的Boogie工具对S6获得的文件进行验证,获得验证结果;S8:读取验证结果,并将其解析为更为可读的结果,并将更为可读的结果返回给Solidity智能合约开发者。进一步地,所述的S3中将依赖文件和目标文件合并成一个文件的具体操作为:对所有`*.sol`文件,获取文件import信息,将其替换为合约名所对应的源码,确保最终所有文件都不再有import信息,否则重复以上操作直至所有文件不再包含import信息;若合并过程中存在同名的合约、库、接口,则将其按照一定规则修改为不同名的合约、库、接口,同时相应的使用该合约、库、接口处也修改为对应名称;并将以上名称修改操作进行记录,后续步骤能够对以上修改进行反向查找。进一步地,所述的弱化继承,即采用去继承的方式将父合约中的状态变量声明、结构体定义、构造函数定义、修饰器定义、函数定义和枚举定义写入到子合约中;所述的去继承的方式是指去掉子合约与父合约语法之间的继承关系,对于父合约中的状态变量声明,若不与子合约中的状态变量产生命名冲突,则直接写入子合约;若存在命名冲突,则按照`父合约名称`+`$`+`相关名称`的方式写入子合约中;Solidity中结构体定义及枚举定义直接写入子合约当中;函数定义及构造函数定义,若不存在命名冲突,则直接写入子合约中,当存在命名冲突,则按照`父合约名称`+`$`+`相关名称`的方式进行命名写入子合约中;修饰器定义,若子合约中无同名修饰器,则将修饰器定义写入子合约中,否则不做操作。进一步地,所述的弱化封装,即指首先在Boogie中定义指针类型Ref`typeRef=int及范型域类型Field`typeFieldT,通过堆的方式对Solidity中对象进行管理`varHeap:[Ref]<T>[FieldT]本文档来自技高网
...

【技术保护点】
1.一种形式验证Solidity智能合约的方法,其特征在于,该方法具体包括如下步骤:S1:首先利用Anltr4语法设计Solidity Model Language规范,所述的规范包括SML语句规、SML函数规范和SML循环规范,SML语句规范以符号'//@'开头,后跟假设语句或断言语句;SML函数规范以符号'//@'开头,后跟规范体;或者以符号'/*@'开头,后跟规范体,最后以符号'*/'结尾;所述的规范体包括前置条件语句、后置条件语句、修改权限语句;SML循环规范以符号'//@'开头,后跟循环语句。所述的假设语句、断言语句、前置条件语句、后置条件语句、修改权限语句和循环语句都由相应语句的关键字和谓词组成。S2:按照S1所述的SML语法规范在Solidity智能合约中添加详细的注解规范。S3:如果智能合约开发者进行形式化验证的智能合约的目标文件依赖其他多个Solidity智能合约文件时,首先将依赖文件和目标文件合并成一个文件。S4:将S3的合并后的文件中的代码由Solidity转化为Boogie,采用弱化继承、弱化封装、增强多态、去可见性的方式以去除面向对象的语言特性,并将Solidity语法中的类型、语句和表达式转换为Boogie语法中相对应的类型、语句和表达式。S5:采用S4中同样的方法将S2中为Solidity智能合约添加的注解规范转换为Boogie语法的规范;S6:将通过S4和S5转换后的带有详细注解规范的Boogie代码保存在文件名后缀为.bpl的文件中;S7:利用集成Boogie编译器和Z3定理证明器的Boogie工具对S6获得的文件进行验证,获得验证结果;S8:读取验证结果,并将其解析为更为可读的结果,并将更为可读的结果返回给Solidity智能合约开发者。...

【技术特征摘要】
1.一种形式验证Solidity智能合约的方法,其特征在于,该方法具体包括如下步骤:S1:首先利用Anltr4语法设计SolidityModelLanguage规范,所述的规范包括SML语句规、SML函数规范和SML循环规范,SML语句规范以符号'//@'开头,后跟假设语句或断言语句;SML函数规范以符号'//@'开头,后跟规范体;或者以符号'/*@'开头,后跟规范体,最后以符号'*/'结尾;所述的规范体包括前置条件语句、后置条件语句、修改权限语句;SML循环规范以符号'//@'开头,后跟循环语句。所述的假设语句、断言语句、前置条件语句、后置条件语句、修改权限语句和循环语句都由相应语句的关键字和谓词组成。S2:按照S1所述的SML语法规范在Solidity智能合约中添加详细的注解规范。S3:如果智能合约开发者进行形式化验证的智能合约的目标文件依赖其他多个Solidity智能合约文件时,首先将依赖文件和目标文件合并成一个文件。S4:将S3的合并后的文件中的代码由Solidity转化为Boogie,采用弱化继承、弱化封装、增强多态、去可见性的方式以去除面向对象的语言特性,并将Solidity语法中的类型、语句和表达式转换为Boogie语法中相对应的类型、语句和表达式。S5:采用S4中同样的方法将S2中为Solidity智能合约添加的注解规范转换为Boogie语法的规范;S6:将通过S4和S5转换后的带有详细注解规范的Boogie代码保存在文件名后缀为.bpl的文件中;S7:利用集成Boogie编译器和Z3定理证明器的Boogie工具对S6获得的文件进行验证,获得验证结果;S8:读取验证结果,并将其解析为更为可读的结果,并将更为可读的结果返回给Solidity智能合约开发者。2.根据权利要求1所述的形式验证Solidity智能合约的方法,其特征在于,所述的S3中将依赖文件和目标文件合并成一个文件的具体操作为:对所有`*.sol`文件,获取文件import信息,将其替换为合约名所对应的源码,确保最终所有文件都不再有import信息,否则重复以上操作直至所有文件不再包含import信息;若合并过程中存在同名的合约、库、接口,则将其按照一定规则修改为不同名的合约、库、接口,同时相应的使用该合约、库、接口处也修改为对应名称;并将以上名称修改操作进行记录,后续步骤能够对以上修改进行反向查找。3.根据权利要求1所述的形式验证Solidity智能合约的方法,其特征在于,所述的弱化继承,即采用去继承的方式将父合约中的状态变量声明、结构体定义、构造函数定义、修饰器定义、函数定义和枚举定义写入到子合约中;所述的去继承的方式是指去掉子合约与父合约语法之间的继承关系,对于父合约中的状态变量声明,若不与子合约中的状态变量产生命名冲突,则直接写入子合约;若存在命名冲突,则按照`父合约名称`+`$`+`相关名称`的方式写入子合约中;Solidity中结构体定义及枚举定义直接写入子合约当中;函数定义及构造函数定义,若不存在命名冲突,则直接写入子合约中,当存在命名冲突,则按照`父合约名称`+`$`+`相关名称`的方式进行命名写入子合约中;修饰器定义,若子合约中无同名修饰器,则将修饰器定义写入子合约中,否则不做操作。4.根据权利要求1所述的形式验证Solidity智能合约的方法,其特征在于,所述的弱化封装,即指首先在Boogie中定义指针类型typeRef=int及范型域类型typeFieldT,通过堆的方式对Solidity中对象进行管理varHeap:[Ref]<T>[FieldT]T,将所有智能合约中的域都直接暴露在文件内成为状态变量、函数、构造函数、修饰器、结构体、枚举。5.根据权利要求1所述的形式验证Solidity智能合约的方法,其特征在于,所述的增强多态包括多态定义和多态实现两步,即在该合约实例c的构造函...

【专利技术属性】
技术研发人员:张丁文曹辉梁秀波邱炜伟李伟李启雷尹可挺
申请(专利权)人:杭州趣链科技有限公司
类型:发明
国别省市:浙江,33

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1