一种智能合约模糊测试的方法、装置及存储介质转让专利

申请号 : CN202011010716.1

文献号 : CN112131115B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 周勇钧

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本申请提供一种智能合约模糊测试的方法、装置及存储介质,涉及区块链技术领域,用以提高区块链中智能合约的安全性,避免不必要的损失。对智能合约进行AST扫描分析,生成智能合约方法协议;结合智能合约方法协议,对测试用例样本进行变异操作,生成测试用例变异数据,其中测试用例变异数据中包含被测智能合约的方法名称,以及测试用例变异样本;将测试用例变异数据请求到区块链服务中,根据被测智能合约的方法名称,在区块链服务中确定被测智能合约;在被测智能合约上执行测试用例变异样本,并收集被测智能合约针对测试用例样本的执行结果,以根据执行结果中的异常数据确定被测智能合约的漏洞。

权利要求 :

1.一种智能合约模糊测试的方法,其特征在于,该方法包括:对智能合约进行抽象语法树AST扫描分析,生成智能合约方法协议;

结合所述智能合约方法协议,对测试用例样本进行变异操作,生成测试用例变异数据,其中所述测试用例变异数据中包含被测智能合约的方法名称,以及测试用例变异样本;

将所述测试用例变异数据请求到区块链服务中,根据所述被测智能合约的方法名称,在区块链服务中确定被测智能合约;

在所述被测智能合约上执行所述测试用例变异样本,并收集所述被测智能合约针对所述测试用例变异样本的执行结果,以根据所述执行结果中的异常数据确定所述被测智能合约的漏洞;

其中,所述结合所述智能合约方法协议,对测试用例样本进行变异操作,生成测试用例变异数据,其中所述测试用例变异数据中包含被测智能合约的方法名称,以及测试用例变异样本,包括:

根据所述智能合约方法协议中的类型列表,确定测试用例样本中参数的数据类型;

根据所述数据类型对应的预设变异方法,对所述测试用例样本进行变异操作,生成所述测试用例变异样本;

将所述智能合约方法协议中的智能合约的名称,作为所述被测智能合约的方法名称;

将所述测试用例变异样本和所述被测智能合约的方法名称结合,生成所述测试用例变异数据。

2.如权利要求1所述的方法,其特征在于,所述对被测智能合约进行AST扫描分析,生成智能合约方法协议,包括:

对所述被测智能合约进行AST扫描分析,生成AST结构;

通过所述AST结构提取出智能合约的方法名称、参数名称以及对应的参数类型;

根据所述智能合约方法名称、参数名称以及对应的参数类型,生成智能合约方法协议。

3.如权利要求1所述的方法,其特征在于,所述执行结果中包括:测试结果和执行路径中的之一或组合;

其中,所述执行路径包括被测智能合约的执行路径、执行所述被测智能合约的虚拟机的执行路径中的之一或组合;

所述测试结果包括错误码,交易哈希hash,Gas消耗值中的之一或组合。

4.如权利要求3所述的方法,其特征在于,若所述执行结果中包括所述被测智能合约的执行路径,则所述区块链服务中的被测智能合约为经过插桩处理后的智能合约;

所述插桩处理后的智能合约中包含有通过智能合约调用锚点方法。

5.如权利要求3所述的方法,其特征在于,若所述执行结果中包括执行所述被测智能合约的虚拟机的执行路径,则所述虚拟机是经过面向切面编程AOP或Hook处理后的虚拟机;

所述AOP或Hook处理为插入动态代码执行路径收集桩。

6.如权利要求1~5任一所述的方法,其特征在于,该方法还包括:若通过变异生成器确定所述执行结果异常时,则将所述测试用例变异样本收录到测试用例样本库中作为测试用例样本,且根据异常的执行结果正向调整变异生成器的变异方法。

7.一种智能合约模糊测试的装置,其特征在于,该装置包括:第一生成单元,用于对智能合约进行AST扫描分析,生成智能合约方法协议;

第二生成单元,用于结合所述智能合约方法协议,对测试用例样本进行变异操作,生成测试用例变异数据,其中所述测试用例变异数据中包含被测智能合约的方法名称,以及测试用例变异样本;

确定单元,用于将所述测试用例变异数据请求到区块链服务中,根据所述被测智能合约的方法名称,在区块链服务中确定被测智能合约;

执行单元,用于在所述被测智能合约上执行所述测试用例变异样本,并收集所述被测智能合约针对所述测试用例样本的执行结果,以根据执行结果中的异常数据确定被测智能合约的漏洞;

其中,第二生成单元具体用于:

所述根据所述智能合约方法协议中的类型列表,确定测试用例样本中参数的数据类型;根据所述数据类型对应的预设变异方法,对所述测试用例样本进行变异操作,生成所述测试用例变异样本;将所述智能合约方法协议中的智能合约的名称,作为所述被测智能合约的方法名称;将所述测试用例变异样本和所述被测智能合约的方法名称结合,生成所述测试用例变异数据。

8.一种电子设备,其特征在于,其包括处理器和存储器,其中,所述存储器存储有程序代码,当所述程序代码被所述处理器执行时,使得所述处理器执行权利要求1~6中任一所述方法的步骤。

9.一种计算机可读介质,其特征在于,其存储有可由计算设备执行的计算机程序,当所述程序在计算设备上运行时,使得所述计算设备执行权利要求1~6任一所述方法的步骤。

说明书 :

一种智能合约模糊测试的方法、装置及存储介质

技术领域

[0001] 本申请涉及区块链技术领域,提供一种智能合约模糊测试的方法、装置及存储介质。

背景技术

[0002] 智能合约是在区块链网络上执行的程序。与传统程序不同,智能合约部署在区块链之后就没有办法修改了。由于智能合约的开发过程中存在纰漏,导致部署在区块链服务
中的智能合约存在安全漏洞,此时任何人都可对智能合约存在的安全漏洞发起攻击,使智
能合约频发安全事故,造成不可避免的损失。

发明内容

[0003] 本申请实施例提供一种智能合约模糊测试的方法、装置及存储介质,用以提高区块链中智能合约的安全性,避免不必要的损失。
[0004] 第一方面,本申请实施例提供一种智能合约模糊测试的方法,该方法包括:
[0005] 对智能合约进行AST(Abstract Syntax Tree,抽象语法树)扫描分析,生成智能合约方法协议;
[0006] 结合智能合约方法协议,对测试用例样本进行变异操作,生成测试用例变异数据,其中测试用例变异数据中包含被测智能合约的方法名称,以及测试用例变异样本;
[0007] 将测试用例变异数据请求到区块链服务中,根据被测智能合约的方法名称,在区块链服务中确定被测智能合约;
[0008] 在被测智能合约上执行测试用例变异样本,并收集被测智能合约针对测试用例样本的执行结果,以根据执行结果中的异常数据确定被测智能合约的漏洞。
[0009] 第二方面,本申请实施例提供一种智能合约模糊测试的装置,该装置包括:
[0010] 第一生成单元,用于对智能合约进行AST扫描分析,生成智能合约方法协议;
[0011] 第二生成单元,用于结合智能合约方法协议,对测试用例样本进行变异操作,生成测试用例变异数据,其中测试用例变异数据中包含被测智能合约的方法名称,以及测试用
例变异样本;
[0012] 确定单元,用于将测试用例变异数据请求到区块链服务中,根据被测智能合约的方法名称,在区块链服务中确定被测智能合约;
[0013] 执行单元,用于在被测智能合约上执行测试用例变异样本,并收集被测智能合约针对测试用例样本的执行结果,以根据执行结果中的异常数据确定被测智能合约的漏洞。
[0014] 在一种可能的实现方式中,第一生成单元具体用于:
[0015] 对被测智能合约进行AST扫描分析,生成AST结构;
[0016] 通过AST结构提取出智能合约的方法名称、参数名称以及对应的参数类型;
[0017] 根据智能合约方法名称、参数名称以及对应的参数类型,生成智能合约方法协议。
[0018] 在一种可能的实现方式中,第二生成单元具体用于:
[0019] 根据智能合约方法协议中的类型列表,确定测试用例样本中参数的数据类型;
[0020] 根据数据类型对应的预设变异方法,对测试用例样本进行变异操作,生成测试用例变异样本;
[0021] 将智能合约方法协议中的智能合约的名称,作为被测智能合约的方法名称;
[0022] 将测试用例变异样本和被测智能合约的方法名称结合,生成测试用例变异数据。
[0023] 在一种可能的实现方式中,执行结果中包括:测试结果和执行路径中的之一或组合;
[0024] 其中,执行路径包括被测智能合约的执行路径、执行被测智能合约的虚拟机的执行路径中的之一或组合;
[0025] 测试结果包括错误码,交易hash,Gas消耗值中的之一或组合。
[0026] 在一种可能的实现方式中,若执行结果中包括被测智能合约的执行路径,则区块链服务中的被测智能合约为经过插桩处理后的智能合约;
[0027] 插桩处理后的智能合约中包含有通过智能合约调用锚点方法。
[0028] 在一种可能的实现方式中,若执行结果中包括执行被测智能合约的虚拟机的执行路径,则虚拟机是经过AOP(Aspect Oriented Programming,面向切面编程)或Hook处理后
的虚拟机;
[0029] AOP或Hook处理为插入动态代码执行路径收集桩。
[0030] 在一种可能的实现方式中,该装置还包括收录单元,收录单元用于:
[0031] 若通过变异生成器确定执行结果异常时,则将测试用例变异样本收录到测试用例样本库中作为测试用例样本,且根据异常的执行结果正向调整变异生成器的变异方法。
[0032] 第三方面,本申请实施例提供一种计算装置,包括至少一个处理器、以及至少一个存储器,其中,存储器中存储有程序代码,处理器用于读取存储器中存储的程序代码,并执
行如本申请实施例提供的智能合约模糊测试的方法。
[0033] 第四方面,本申请实施例提供一种计算机可读存储介质,计算机可读存储介质存储有计算机指令,计算机指令被处理器执行时实现本申请实施例提供的智能合约模糊测试
的方法。
[0034] 本申请有益效果如下:
[0035] 本申请提供一种智能合约模糊测试的方法、装置及存储介质,特别的提供一种通过模糊测试的方式,在智能合约上线之前对其进行安全测试,并根据测试的结果确定智能
合约是否安全,在确定智能合约存在安全漏洞时,以根据确定的安全漏洞对智能合约进行
修改,保证上线的智能合约的安全性,避免不必要的损失。
[0036] 在本申请中,先对智能合约进行AST扫描,生成智能合约方法协议,并结合智能合约方法协议,对测试用例样本库中选择的测试用例样本进行变异操作,生成包含有被测智
能合约的方法名称以及测试用例变异样本的测试用例变异数据,将测试用例变异数据请求
到区块链服务器中,根据携带的被测智能合约的方法名称,在区块链服务器中部署的智能
合约中确定被测智能合约,在被测智能合约上执行测试用例变异样本,并收集被测智能合
约针对测试用例变异样本的执行结果,以根据执行结果中的异常数据确定被测智能合约的
漏洞。在测试阶段,构造各种不同类型异常的、非预期的甚至随机的测试用例变异样本,通
过智能合约执行测试用例变异样本获得的异常数据,来发现智能合约漏洞的方式,提高漏
洞挖掘的准确性、效率和自动化程度,充分分析智能合约潜在的安全漏洞,提高智能合约的
安全性,避免不必要的损失。
[0037] 本申请的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请而了解。本申请的目的和其他优点可通过在所写的说明
书、权利要求书、以及附图中所特别指出的结构来实现和获得。

附图说明

[0038] 为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本
领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其
他的附图。
[0039] 图1为本申请实施例提供的一种应用场景示意图;
[0040] 图2为本申请实施例提供的一种智能合约模糊测试的方法流程图;
[0041] 图3为本申请实施例提供的一种对智能合约生成对应的智能合约方法协议及测试用例样本的示意图;
[0042] 图4为本申请实施例提供的一种结合智能合约方法协议对测试用例样本进行变异的示意图;
[0043] 图5为本申请实施例提供的一种将插桩处理后的智能合约部署到区块链服务中的示意图;
[0044] 图6为本申请实施例提供的一种区块链服务中虚拟机执行智能合约的示意图;
[0045] 图7为本申请实施例提供的一种根据执行结果更新测试用例样本库的示意图;
[0046] 图8为本申请实施例提供的一种智能合约模糊测试的整体方法的示意图;
[0047] 图9为本申请实施例提供的一种智能合约模糊测试的装置结构图;
[0048] 图10为本申请实施例提供的一种计算设备。

具体实施方式

[0049] 为了使本申请的目的、技术方案及有益效果更加清楚明白,以下将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施
例仅仅是本申请一部分实施例,并不是全部的实施例。基于本申请中的实施例,本领域普通
技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范
围。
[0050] 本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情
况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外
的顺序实施。
[0051] 以下对本申请实施例中的部分用语进行解释说明,以便于本领域技术人员理解。
[0052] 1、区块链:
[0053] 区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(Blockchain),本质上是一个去中心化的数据库,是一串使用密码学方法
相关联产生的数据块,每一个数据块中包含了一批次网络交易的信息,用于验证其信息的
有效性(防伪)和生成下一个区块。区块链可以包括区块链底层平台、平台产品服务层以及
应用服务层。
[0054] 区块链底层平台可以包括用户管理、基础服务、智能合约以及运营监控等处理模块。其中,智能合约模块负责合约的注册发行以及合约触发和合约执行,开发人员可以通过
某种编程语言定义智能合约逻辑,发布到区块链上即智能合约注册,根据智能合约的逻辑,
调用密钥或者其它的事件触发执行,完成智能合约逻辑,同时还提供对智能合约升级注销
的功能。
[0055] 2、智能合约:
[0056] 智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约的目
的是提供优于传统合约的安全方法,并减少交易成本。
[0057] 3、AST(Abstract Syntax Tree,抽象语法树):
[0058] AST是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构。说是抽象的,是因为抽象语法树并不会表示出真实语法出现的每一个细节,比如,
嵌套括号被隐含在树的结构中,并没有以节点的形式呈现;而类似于if‑condition‑then这
样的条件跳转语句,可以使用带有两个分支的节点来表示。
[0059] 4、插桩:
[0060] 插桩即代码插桩技术,在被测程序中插入完成相应工作的代码。
[0061] 在实现覆盖测试的过程中,往往需要知道某些信息,如:程序中可执行语句被执行(即被覆盖)的情况,程序执行的路径,变量的引用、定义等。要想获取这类信息,需要由计算
机在被测程序执行的过程中自动记录,因此需要在被测程序中插入完成相应工作的代码。
程序插桩技术是在被测程序中插入探针,然后通过探针的执行来获得程序的控制流和数据
流信息,以此来实现测试的目的。
[0062] 插桩指在保证原有程序逻辑完整性的基础上,在程序中插入探针,通过探针采集代码中的信息(方法本身、方法参数值、返回值等)在特定的位置插入代码段,从而收集程序
运行时的动态上下文信息。在本申请中,是在智能合约的程序代码中插入用于收集智能合
约的执行路径的代码,以在智能合约执行时,通过插入的代码收集智能合约的执行路径。
[0063] 5、模糊测试:
[0064] 模糊测试是一种高效的自动化测试技术,通过随机的方式来生成大量的测试数据,基于覆盖信息来决定是否保留新生成的测试数据,通过执行生成的测试数据发现智能
合约中的漏洞。
[0065] 6、AOP(Aspect Oriented Programming,面向切面编程):
[0066] AOP可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP具有日志记录,性能统计,安全控制,事务处理,异常处
理等主要功能。在本申请中通过AOP技术对执行智能合约的虚拟机动态插入收集虚拟机执
行路径的代码,实现虚拟机执行路径的收集。
[0067] 7、Hook:
[0068] Hook技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数可以加工处理(改变)该函数的执行行为。在本申
请中,在没有调用虚拟机执行智能合约的执行函数之前,先捕获该虚拟机的执行函数,并对
执行函数进行处理,插入包含收集虚拟机执行路径的功能,使虚拟机通过该执行函数执行
智能合约时,实现虚拟机执行路径的收集。
[0069] 8、演化算法(evolutionary algorithms):
[0070] 演化算法是一个“算法簇”,尽管它有很多的变化,有不同的遗传基因表达方式,不同的交叉和变异算法,特殊算法的引用,以及不同的再生和选择方法,但它们产生的灵感都
来自于大自然的生物进化。与传统的基于微积分的方法和穷举法等优化算法相比,进化计
算是一种成熟的具有高鲁棒性和广泛适用性的全局优化方法,具有自组织、自适应、自学习
的特性,能够不受问题性质的限制,有效地处理传统优化算法难以解决的复杂问题。
[0071] 下面对本申请实施例的设计思想进行简要介绍。
[0072] 智能合约极大地扩展了区块链的应用场景与现实意义,但频发的安全事故严重阻碍了智能合约的发展,智能合约安全性问题的研究就显得尤为关键。
[0073] 智能合约存在如下安全问题:
[0074] 智能合约一旦被部署上线便无法修改,任何人都可对智能合约存在的安全漏洞发起攻击,比如每一个暴露在开放网络上的智能合约都有可能成为专业黑客团队的攻击目
标,严重损害智能合约本身的价值,造成不可避免的损失;
[0075] 智能合约的开发过程存在纰漏。由于起步晚,发展时间短,智能合约本身就有很多不足;同时专业的技术人员严重匮乏,不严谨的代码参考、拷贝和修改等因素都会引起漏
洞。
[0076] 综上,智能合约在上线使用后存在大量的安全问题,造成不可避免的损失。
[0077] 基于上述问题,本申请提供一种智能合约模糊测试的方法、装置及存储介质,本申请在智能合约上线之前对智能合约进行模糊测试,减少发布上线后的安全问题,避免不必
要的损失。
[0078] 在本申请中,对智能合约进行AST扫描分析,生成智能合约方法协议,将智能合约方法协议及测试用例样本库中的测试用例样本结合,生成出测试用例变异数据,把测试用
例变异数据请求到区块链服务中,根据测试用例变异数据中的被测智能合约的方法名称,
在区块链服务中部署的智能合约中,确定被测智能合约方法名称对应的被测智能合约,在
被测智能合约上执行测试用例变异数据中的测试用例变异样本,并收集被测智能合约针对
测试用例变异样本的执行结果,根据执行结果中的异常数据确定被测智能合约的漏洞。在
智能合约上线之前通过模糊测试的方式对智能合约进行测试;且在测试阶段,通过智能合
约执行测试用例变异样本的执行结果中的异常数据,来发现智能合约漏洞的方式,提高漏
洞挖掘的准确性、效率和自动化程度,充分分析智能合约潜在的安全威胁,提高智能合约的
安全性,减少不必要的损失。
[0079] 在一种可能的实现方式中,执行结果中包含有被测智能合约的执行路径,因此区块链服务中部署的该被测智能合约是进行插桩处理后,部署到区块链服务中的智能合约,
有利于模糊测试过程中智能合约代码路径覆盖,即收集智能合约的执行路径。
[0080] 在一种可能的实现方式中,智能合约在区块链服务的虚拟机沙箱环境下执行,沙箱环境不允许对外输入输出操作,当执行结果中包含有执行被测智能合约的虚拟机的执行
路径时,该虚拟机是进行了AOP或Hook技术注入函数调用收集方法的虚拟机,在执行过程
中,可以收集虚拟机的执行路径。
[0081] 在介绍完本申请实施例的设计思想之后,下面对本申请设置的应用场景进行简要说明。
[0082] 图1示例性的给出了本申请实施例的应用场景,该应用场景中包括终端设备10和服务器20;
[0083] 其中,终端设备10为支持各种应用安装,且能够运行各种应用的硬件设备,可以是PC(Personal Computer,个人电脑)、平板电脑、PDA(Personal Digital Assistant,个人数
字助理)、笔记本和手机等终端设备,也可以是具有移动终端设备的计算机,包括各种便携
式、袖珍式、手持式、计算机内置的或者车载的移动装置,它们能够向用户提供语音、数据或
语音和数据连通性的设备,以及与无线接入网交换语音、数据或语音和数据。
[0084] 服务器11是用于执行各种智能合约的服务器。该服务器可以是独立的,也可以是任何能够提供互联网服务的单个后台运行设备或者多个后台运行设备构成的集群或者分
布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中
间件服务、域名服务、安全服务、CDN(Content Delivery Network,内容分发网络)、以及大
数据和人工智能平台等基础云计算服务的设备。
[0085] 在实际应用中,终端设备10和服务器11进行通信连接,如图1所示,终端设备可包括终端设备101和终端设备102等,服务器11可以是由至少一台服务器组成的云服务器,其
中终端设备102通过无线接入点12或因特网与服务器11进行通信连接。
[0086] 在一种可能的应用场景中,为了便于降低通信时延,可以在各个地区部署服务器11,或为了负载均衡,可以由不同的服务器11分别去服务各个终端设备10对应的地区。多个
服务器11以通过区块链实现数据的共享,多个服务器11相当于多个服务器11组成的数据共
享系统。例如终端设备10位于地点a,与服务器11之间进行通信连接,终端设备10位于地点
b,与其他服务器11之间通信连接。
[0087] 对于数据共享系统中的每个服务器11,均具有与该服务器11对应的节点标识,数据共享系统中的每个服务器11均可以存储有数据共享系统中其他服务器11的节点标识,以
便后续根据其他服务器11的节点标识,将生成的区块广播至数据共享系统中的其他服务器
11。每个服务器11中可维护一个如下表所示的节点标识列表,将服务器11名称和节点标识
对应存储至该节点标识列表中。其中,节点标识可为IP(Internet Protocol,网络之间互联
的协议)地址以及其他任一种能够用于标识该节点的信息,表1中仅以IP地址为例进行说
明。
[0088] 表1
[0089]服务器名称 节点标识
节点1 119.115.151.174
节点2 118.116.189.145
… …
节点N 119.124.789.258
[0090] 下面结合上述描述的应用场景,参考附图来描述本申请示例性实施方式提供的文本分类的方法,需要注意的是,上述应用场景仅是为了便于理解本申请的精神和原理而示
出,本申请的实施方式在此方面不受任何限制。
[0091] 图2示例性的给出了本申请实施例的一种智能合约模糊测试的方法,该方法中包括如下步骤:
[0092] 步骤S200,对智能合约进行AST扫描分析,生成智能合约方法协议。
[0093] 在本申请中,对智能合约进行AST扫描分析,生成AST结构。如图3中示出了AST扫描分析,生成的AST树状结构。且从AST结构可以提取出智能合约方法名称,比如方法A、方法B
等。
[0094] 在本申请中,针对提取出的智能合约方法名称,进一步提取该智能合约方法名称中的参数及对应的数据类型。比如方法A中共有3个参数:第一个参数为P0,对应的数据类型
为64位整数;第二个参数为P1,对应的数据类型为字符串;第三个参数为P2,对应的数据类
型为地址。
[0095] 因此,根据从AST结构中提取的智能合约方法名称、参数以及对应的参数类型,可以生成智能合约方法协议;以方法A进行举例,生成的智能合约方法协议为方法A(P0 
int64,P1 string,P2 address)。
[0096] 在一种可能的实现方式中,在生成智能合约方法协议的过程中,还可以通过自动化测试的方式整理出一批测试用例样本,如某个测试用例样本为方法A(P0 10,P1“hello”,
P2“1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa”)。
[0097] 如图3所示,为本申请实施例提供的一种对智能合约生成对应的智能合约方法协议及测试用例样本的示意图。
[0098] 需要说明的是,对智能合约生成对应的智能合约方法协议及测试用例样本时,可以同时生成、可以先生成智能合约方法协议,还可以先生成测试用例样本。
[0099] 步骤S201,结合智能合约方法协议,对测试用例样本进行变异操作,生成测试用例变异数据,其中测试用例变异数据中包含被测智能合约的方法名称,以及测试用例变异样
本。
[0100] 在本申请中,在确定了智能合约方法协议后,根据智能合约方法协议中的参数对应的数据类型,确定测试用例样本中各个参数的数据类型。
[0101] 需要说明的是,在本申请中智能合约方法协议是根据AST结构获取到的,AST包含智能合约的具体参数的数据类型,具体是字符串,整数,字节流、地址等都会明确声明,因此
使用智能合约方法协议确定测试用例样本中各个参数的数据类型更容易,也更精确。
[0102] 在确定了数据类型之后,根据数据类型对应的预设变异方法,对测试用例样本数据中该数据类型对应的参数进行变异操作,生成测试用例变异样本。
[0103] 在本申请中,变异方法中包括但不限于下列变异操作中的之一或组合:
[0104] 根据位或字节进行翻转的变异操作;以单字节、双字节、四字节为单位进行加减操作的变异操作;删除、复制、重写、插入新的字节块的变异操作;进行正负取值的变异操作;
转换浮点数的变异操作;两个测试用例样本随机选取位置进行交叉互换的变异操作。
[0105] 在本申请中,不同的数据类型中包含的变异操作不同,即预设的变异方法不同。比如,数据类型为数值类型,变异方法为对测试用例样本中的参数进行加一或减一的变异操
作、进行正负取值的变异操作、转换浮点数的变异操作中的之一或组合;数据类型为字符
串,变异方法为对测试用例样本中的参数进行删除变异操作、复制变异操作、重写变异操
作、插入新的字节块的变异操作中的之一或组合。
[0106] 在一种可能的实现方式中,由于生成多个智能合约方法协议,因此在结合智能合约方法协议,对测试用例样本进行变异操作时,从多个智能合约方法协议中选择一个智能
合约方法协议,比如选择方法A(P0 int64,P1 string,P2address);此时根据方法A进行变
异处理;选定变异方法后,会从多个测试用例样本中选择一个测试用例样本,比如方法A(P0 
10,P1“hello”,P2“1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa”);接着在该测试用例样本中选
取其中一个参数进行变异操作,生成测试用例变异样本,比如,方法A(P0 10,P1“hello”,P2
“1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa”)中的参数P2,此时对参数P2进行变异操作,知道
p2为地址,也为字符串类型,为此可以对p2的字符串进行单个字符的随机转换,把最后的字
符从a转换为A,此时测试用例变异样本为方法A(P0 10,P1“hello”,P2“1A1zP1eP5QGefi2D
MPTfTL5SLmv7DivfNA”)。如图4所示,为本申请实施例提供的一种结合智能合约方法协议对
测试用例样本进行变异的示意图。
[0107] 在进行变异操作过程中,结合参数类型对应的预设变异方法及样本值进行不同方式变异。
[0108] 在本申请中,多个智能合约方法协议中选择一个智能合约方法协议的规则为:随机选择、根据有效权重选择;其中有效权重是根据所新发现的执行路径信息多与少调整不
同变异方法的选择权重,或人为设置选择权重。
[0109] 在本申请中,在多测试用例样本中选择一个测试用例样本的规则为:随机选择测试用例样本,或根据有效权重选择测试用例样本。
[0110] 需要说明的是,变异操作是在变异生成器中执行的,且上述不同数据类型对应的不同变异方法中包含的不同的变异操作仅是举例说明。
[0111] 在本申请中,测试用例变异数据中除了测试用例变异样本,还包含有被测智能合约的方法名称,该被测智能合约的方法名称为智能合约方法协议中的智能合约的名称。
[0112] 需要说明的是,在测试用例变异数据中除了测试用例变异样本即智能合约方法的具体参数值,和被测智能合约的方法名称外,还包含有请求方式,比如采用交易请求的方式
请求被测智能合约的方法名称对应的被测智能合约。
[0113] 步骤S202,将测试用例变异数据请求到区块链服务中,根据被测智能合约的方法名称,在区块链服务中确定被测智能合约。
[0114] 在本申请中,区块链服务中部署有智能合约,区块链服务在接收到测试用例变异数据请求后,根据测试用例变异数据中的被测智能合约的方法名称,在部署的智能合约中
选择被测智能合约的方法名称对应的智能合约,并作为被测智能合约,之后在区块链服务
的虚拟机中执行该被测智能合约。
[0115] 步骤S203,在被测智能合约上执行测试用例变异样本,并收集被测智能合约针对测试用例样本的执行结果,以根据执行结果中的异常数据确定被测智能合约的漏洞。
[0116] 在本申请中,执行结果包括测试结果和执行路径中的之一或组合;
[0117] 执行路径包括被测智能合约的执行路径、执行被测智能合约的虚拟机的执行路径中的之一或组合;
[0118] 测试结果包括错误码,交易哈希hash,Gas消耗值中的之一或组合。
[0119] 在一种可能的实现方式中,当执行结果中包含有被测智能合约的执行路径时,本申请为了在被测智能合约执行过程中,可以收集到被测智能合约的执行路径,在将被测智
能合约部署到区块链服务中之前,对被测智能合约进行插桩处理,即在不改变被测智能合
约的执行逻辑的前提下,在智能合约中插入通过合约调用上报代码执行信息的锚点方法,
之后再将插桩处理后的被测智能合约部署到区块链服务中,如图5所示,为本申请实施例提
供的一种将插桩处理后的智能合约部署到区块链服务中的示意图。
[0120] 需要说明的是,被测智能合约的执行路径根据每个测试用例异常数据对应的交易hash查询获得的,或根据被测智能合约地址或标识符查询到智能合约代码执行情况获得
的。
[0121] 在一种可能的实现方式中,当执行结果中包含有执行被测智能合约的虚拟机的执行路径时,由于智能合约在区块链中虚拟机沙箱环境下执行,沙箱环境不允许对外输入输
出操作,当执行完毕后环境就会被销毁,无法感知到智能合约执行对虚拟机执行所产生的
异常情况,即无法确定执行被测智能合约的虚拟机的执行路径的异常情况;
[0122] 因此,为收集执行被测智能合约的虚拟机的执行路径,对区块链服务通过AOP或Hook技术进行注入函数调用收集方法,即插入动态代码执行路径收集桩,可以收集虚拟机
执行路径。
[0123] 当智能合约在区块链中虚拟机沙箱环境下执行时,开启一个特殊渠道来输出虚拟机代码执行信息。其中,“特殊渠道”是指通过虚拟机本身的特征记录执行信息,后续可以通
过对智能合约的查询,获取到所记录的执行信息,执行信息即执行被测智能合约的虚拟机
的执行路径。如图6所示,为本申请实施例提供的一种区块链服务中虚拟机执行智能合约的
示意图。
[0124] 在本申请中,当收集到被测智能合约针对测试用例变异样本的执行结果后,将执行结果反馈给变异生成器,通过变异生成器确定执行结果是否异常,即变异生成器根据反
馈的执行结果中的测试结果确定是否发现新的异常测试结果或发现的新执行路径。若通过
变异生成器确定执行结果异常,则将测试用例变异样本收录到测试用例样本库中作为测试
用例样本,且根据异常的执行结果正向调整变异生成器的变异方法。如图7所示,为本申请
实施例提供的一种根据执行结果更新测试用例样本库的示意图。
[0125] 需要说明的是,测试用例异常数据请求到区块链服务,每个测试用例异常数据都会有唯一的交易hash。在智能合约针对该测试用例异常数据执行完成后,会收集到测试结
果、智能合约方法执行路径及虚拟机执行路径反馈变异生成器。当变异生成器发现反馈的
信息有新的异常或新发现的执行路径,变异生成器就会把相应hash的测试用例变异数据中
的测试用例变异样本收录到测试用例样本中,后续变异生成器会继续演化这些变异测试用
例。
[0126] 图8示例性的提供了本申请实施例的一种智能合约模糊测试的整体方法的示意图,从图8中可知,在该智能合约模糊测试的过程中,主要包含如下几个部分:
[0127] 部分一:智能合约进行AST扫面生成对应的智能合约方法协议,以及创建测试用例样本,智能合约方法协议可以明确的确定参数的数据类型,以被测智能合约的方法名称,测
试用例样本为智能合约的具体参数;
[0128] 部分二:对智能合约进行插桩处理,获得插桩板的智能合约,将插桩板的智能合约部署到区块链服务中,以在区块链服务中执行该合约时,可以收集该智能合约的执行路径;
[0129] 部分三:对区块链服务中的虚拟机部分进行AOP或Hook处理,插入动态代码执行路径收集桩,以通过区块链服务中的虚拟机执行智能合约时,可以发现虚拟机执行路径;
[0130] 部分四:变异生成器根据智能合约方法协议及测试用例样本进行变异,生成多个测试用例变异数据,并将该测试用例变异数据请求到区块链服务中,以在区块链服务中执
行测试用例变异数据对应的被测智能合约;
[0131] 部分五:收集被测智能合约的测试结果、智能合约的执行路径以及虚拟机执行路径,并反馈给变异生成器,对能发现异常测试结果、异常执行路径的测试用例变异情况正向
作用到变异生成的演化算法中,主要是作用到演化算法的变异算法中。
[0132] 本申请提供一种智能合约模糊测试的方法、装置及存储介质,特别的提供一种通过模糊测试的方式,在智能合约上线之前对其进行安全测试,并根据测试的结果确定智能
合约是否安全,在确定智能合约存在安全漏洞时,以根据确定的安全漏洞对智能合约进行
修改,保证上线的智能合约的安全性,避免不必要的损失。且通过对智能合约方法进行模糊
测试时,构造各种不同类型异常的、非预期的甚至随机的输入参数,并通过测试结果及执行
路径作用于变异生成算法,触发更多难以构造的场景及执行分支,进一步保证智能合约的
安全性。
[0133] 基于同一发明构思,本申请实施例还提供了一种智能合约模糊测试的装置900,如图9所示,该装置900包括:
[0134] 第一生成单元901,用于对智能合约进行AST扫描分析,生成智能合约方法协议;
[0135] 第二生成单元902,用于结合智能合约方法协议,对测试用例样本进行变异操作,生成测试用例变异数据,其中测试用例变异数据中包含被测智能合约的方法名称,以及测
试用例变异样本;
[0136] 确定单元903,用于将测试用例变异数据请求到区块链服务中,根据被测侧智能合约的方法名称,在区块链服务中确定被测智能合约;
[0137] 执行单元904,用于在被测智能合约上执行测试用例变异样本,并收集被测智能合约针对测试用例样本的执行结果,以根据执行结果确定被测智能合约的漏洞。
[0138] 在一种可能的实现方式中,第一生成单元901具体用于:对被测智能合约进行AST扫描分析,生成AST结构;通过AST结构提取出智能合约的方法名称、参数名称以及对应的参
数类型;根据智能合约方法名称、参数名称以及对应的参数类型,生成智能合约方法协议。
[0139] 在一种可能的实现方式中,第二生成单元902具体用于:根据智能合约方法协议中的类型列表,确定测试用例样本的数据类型;根据数据类型对应的预设变异方法,对测试用
例样本进行变异操作,生成测试用例变异样本;将智能合约方法协议中的智能合约的名称,
作为被测智能合约的方法名称;将测试用例变异样本和被测智能合约的方法名称结合,生
成测试用例变异数据。
[0140] 在一种可能的实现方式中,该装置还包括收录单元905,收录单元905用于:
[0141] 若通过变异生成器确定执行结果异常时,则将测试用例变异样本收录到测试用例样本库中作为测试用例样本,且根据异常的执行结果正向调整变异生成器的变异方法。
[0142] 为了描述的方便,以上各部分按照功能划分为各单元(或模块)分别描述。当然,在实施本申请时可以把各单元(或模块)的功能在同一个或多个软件或硬件中实现。
[0143] 在介绍了本申请示例性实施方式智能合约模糊测试方法和装置之后,接下来,介绍根据本申请的另一示例性实施方式的智能合约模糊测试过程中的计算装置。
[0144] 所属技术领域的技术人员能够理解,本申请的各个方面可以实现为系统、方法或程序产品。因此,本申请的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完
全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统
称为“电路”、“模块”或“系统”。
[0145] 在一种可能的实现方式中,本申请实施例提供的计算装置可以至少包括处理器和存储器。其中,存储器存储有程序代码,当程序代码被处理器执行时,使得处理器执行本申
请中各种示例性实施方式的智能合约模糊测试的方法中的任一步骤。
[0146] 在一些可能的实施方式中,本申请实施例还提供一种计算机可读存储介质,其包括程序代码,当程序产品在电子设备上运行时,程序代码用于使电子设备执行上述实施例
中任一种智能合约模糊测试的方法的步骤。
[0147] 下面参照图10来描述根据本申请的这种实施方式的计算装置1000。图10的计算装置1000仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
[0148] 如图10,计算装置1000以通用计算装置的形式表现。计算装置1000的组件可以包括但不限于:上述至少一个处理器1001、上述至少一个存储单元1002、连接不同系统组件
(包括存储单元1002和处理器1001)的总线1003。
[0149] 总线1003表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器、外围总线、处理器或者使用多种总线结构中的任意总线结构的局域总线。
[0150] 存储单元1002可以包括易失性存储器形式的可读介质,例如随机存取存储器(RAM)10021和/或高速缓存存储单元10022,还可以进一步包括只读存储器(ROM)10023。
[0151] 存储单元1002还可以包括具有一组(至少一个)程序模块10024的程序/实用工具10025,这样的程序模块10024包括但不限于:操作系统、一个或者多个应用程序、其它程序
模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
[0152] 计算装置1000也可以与一个或多个外部设备1004(例如键盘、指向设备等)通信,还可与一个或者多个使得用户能与计算装置1000交互的设备通信,和/或与使得该计算装
置1000能与一个或多个其它计算装置进行通信的任何设备(例如路由器、调制解调器等等)
通信。这种通信可以通过输入/输出(I/O)接口1005进行。并且,计算装置1000还可以通过网
络适配器1006与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如
因特网)通信。如图所示,网络适配器1006通过总线1003与用于计算装置1000的其它模块通
信。应当理解,尽管图中未示出,可以结合计算装置1000使用其它硬件和/或软件模块,包括
但不限于:微代码、设备驱动器、冗余处理器、外部磁盘驱动阵列、RAID系统、磁带驱动器以
及数据备份存储系统等。
[0153] 在一些可能的实施方式中,本申请提供智能合约模糊测试的方法的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当程序产品在计算机设备上运行时,程序
代码用于使计算机设备执行本说明书上述描述的根据本申请各种示例性实施方式的智能
合约模糊测试的方法。
[0154] 程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以是但不限于电、磁、光、电磁、红外线、或半导
体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列
表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储
器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD‑
ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
[0155] 以上参照示出根据本申请实施例的方法、装置(系统)和/或计算机程序产品的框图和/或流程图描述本申请。应理解,可以通过计算机程序指令来实现框图和/或流程图示
图的一个块以及框图和/或流程图示图的块的组合。可以将这些计算机程序指令提供给通
用计算机、专用计算机的处理器和/或其它可编程数据处理装置,以产生机器,使得经由计
算机处理器和/或其它可编程数据处理装置执行的指令创建用于实现框图和/或流程图块
中所指定的功能/动作的方法。
[0156] 相应地,还可以用硬件和/或软件(包括固件、驻留软件、微码等)来实施本申请。更进一步地,本申请可以采取计算机可使用或计算机可读存储介质上的计算机程序产品的形
式,其具有在介质中实现的计算机可使用或计算机可读程序代码,以由指令执行系统来使
用或结合指令执行系统而使用。在本申请上下文中,计算机可使用或计算机可读介质可以
是任意介质,其可以包含、存储、通信、传输、或传送程序,以由指令执行系统、装置或设备使
用,或结合指令执行系统、装置或设备使用。
[0157] 显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围
之内,则本申请也意图包含这些改动和变型在内。