掌桥专利:专业的专利平台
掌桥专利
首页

一种智能合约资损测试方法及系统

文献发布时间:2023-06-19 11:02:01


一种智能合约资损测试方法及系统

技术领域

本说明书实施例涉及区块链技术领域,特别涉及一种智能合约资损测试方法及系统。

背景技术

智能合约是指由计算机程序定义并自动执行的承诺协议,其可以部署于区块链网络中的节点上,运行在虚拟机环境中。由于智能合约天生具有金融属性,因此,当智能合约存在缺陷时,其在执行交易时可能会导致资金损失(即资损)。

为此,本说明书实施例提供一种智能合约资损测试方法及系统。

发明内容

本说明书实施例的一个方面提供一种智能合约资损测试方法,包括:获取待测试的智能合约;确定所述智能合约中与资金处理相关的变量和/或代码;确定所述智能合约的测试变量及其取值,向所述智能合约中所述测试变量输入所述取值,以触发所述智能合约执行;获取执行反馈信息,所述执行反馈信息至少反映所述智能合约执行后,所述与资金处理相关的变量和/或代码的执行覆盖情况;基于所述执行反馈信息,调整测试变量中至少一个的取值,以再次触发所述智能合约执行,直至满足预设的测试终止条件。

本说明书实施例的一个方面提供一种智能合约资损测试系统,包括:合约获取模块,用于获取待测试的智能合约;第一确定模块,用于确定所述智能合约中与资金处理相关的变量和/或代码;第二确定模块,用于确定所述智能合约的测试变量及其取值,向所述智能合约中所述测试变量输入所述取值,以触发所述智能合约执行;反馈获取模块,用于获取执行反馈信息,所述执行反馈信息至少反映所述智能合约执行后,所述与资金处理相关的变量和/或代码的执行覆盖情况;调整模块,用于基于所述执行反馈信息,调整测试变量中至少一个的取值,以再次触发所述智能合约执行,直至满足预设的测试终止条件。

本说明书实施例的一个方面提供一种智能合约资损测试装置,包括至少一个存储介质和至少一个处理器,所述至少一个存储介质用于存储计算机指令;所述至少一个处理器用于执行所述计算机指令以实现如前所述的方法。

附图说明

本说明书将以示例性实施例的方式进一步描述,这些示例性实施例将通过附图进行详细描述。这些实施例并非限制性的,在这些实施例中,相同的编号表示相同的结构,其中:

图1是根据本说明书的一些实施例所示的区块链网络的示例性示意图;

图2是根据本说明书的一些实施例所示的智能合约资损测试方法的流程图;

图3是根据本说明书的一些实施例所示的确定智能合约中与资金处理相关的变量和/或代码的流程图;

图4是根据本说明书的一些实施例所示的智能合约资损测试系统的模块图。

具体实施方式

为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单的介绍。显而易见地,下面描述中的附图仅仅是本说明书的一些示例或实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图将本说明书应用于其它类似情景。除非从语言环境中显而易见或另做说明,图中相同标号代表相同结构或操作。

应当理解,本说明书中所使用的“系统”、“装置”、“单元”和/或“模组”是用于区分不同级别的不同组件、元件、部件、部分或装配的一种方法。然而,如果其他词语可实现相同的目的,则可通过其他表达来替换所述词语。

如本说明书和权利要求书中所示,除非上下文明确提示例外情形,“一”、“一个”、“一种”和/或“该”等词并非特指单数,也可包括复数。一般说来,术语“包括”与“包含”仅提示包括已明确标识的步骤和元素,而这些步骤和元素不构成一个排它性的罗列,方法或者设备也可能包含其它的步骤或元素。

本说明书中使用了流程图用来说明根据本说明书的实施例的系统所执行的操作。应当理解的是,前面或后面操作不一定按照顺序来精确地执行。相反,可以按照倒序或同时处理各个步骤。同时,也可以将其他操作添加到这些过程中,或从这些过程移除某一步或数步操作。

智能合约资损测试是为了发现区块链的智能合约中可能引起资损的代码(即程序缺陷),而执行智能合约的过程。区块链是分布式、去中心化的数据库,区块链的数据具有不可纂改、全程留痕、可以追溯等特点,被应用于各个数据存证场景。智能合约是指是由计算机程序定义并自动执行的承诺协议。智能合约可以部署于区块链网络中的节点上,运行在虚拟机环境中。智能合约由合约开发者编写并部署,智能合约开发者可以根据需求编写智能合约。智能合约被成功部署后,节点可以接收调用智能合约的交易,并对已部署的智能合约进行执行(调用)。虚拟机是指通过软件模拟的具有完整硬件系统功能的、运行在一个隔离环境中的完整计算机系统。在一些实施例中,虚拟机可以包括但不限于以太坊虚拟机(Embedded Virtural Machine,EVM)、EOS虚拟机(Web Assembly,WASM)、比原链虚拟机(Bottos Virtural Machine,BVM)等。

在一些实施例中,可以获取在区块链上已部署好的智能合约线上运行产生的交易数据,并通过人工制定一系列的资损监控规则来判断是否造成了资金损失。然而,该方式存在以下特点:人工制定的资损监控规则处理复杂且种类繁多的智能合约时,容易出错;该方式的资损测试主要针对已在线上实际运行的智能合约,当监控到资金损失时资损往往已经发生,而智能合约由于区块链的不可篡改性,即使被发现存在资损问题,交易的回滚和合约的修复却非常困难;在智能合约线上运行时,绝大多数时候都处于正常业务逻辑下,而资损往往发生在一些边界情况下,这导致资损测试需要持续运行非常久的时间,才偶尔发现一个资损点,效率较低。

因此,本说明书实施例披露了一种智能合约资损测试方法,将智能合约部署于测试用区块链网络的节点上,自动化的确定智能合约的测试变量及其取值,触发智能合约执行;且基于智能合约的反馈信息不断调整测试变量的取值,以触发智能合约的边界运行条件,从而最大效率的覆盖到可能发生资损的合约运行场景,将与资损有关的程序缺陷点在合约部署前提前暴露出来。

图1是根据本说明书的一些实施例所示的区块链网络的示例性示意图。

如图1所示,区块链网络100可以包括多个区块链节点110和网络120。在一些实施例中,区块链网络100可以是测试用区块链网络,是由合约开发者为了测试智能合约(例如,测试智能合约是否存在导致资损的代码)搭建的区块链环境,其与正式部署应用的区块链网络结构相同。可以理解的,由于测试用区块链网络并未真正上线应用,区块链的数据并不是真实使用的,因此,测试用区块链网络的数据是可以更改的。

较为一般的,在区块链中,多个区块链节点110中的每个包括对应的虚拟机。任一节点可以接收上传的合约部署交易,并在运行共识机制后存储相应的智能合约。相应的,任一节点可以接收上传(或广播)至链的合约执行交易,并在运行共识机制后调用(或执行)相应的智能合约以完成交易的执行,交易以及交易执行的结果被写入区块保存到区块链数据中。例如,区块链节点110可以接收测试变量和/或其取值,调用相应的智能合约以完成交易的执行,执行产生的交易数据被写入区块保存到区块链数据中。

共识机制是区块链网络正常运行的必要组件,用于保证各节点保存的区块链数据维持一致。多个节点可以通过运行共识协议,对接收(对应代码的输入)、产生(对应代码的输出或中间结果)的数据和/或执行的操作达成一致,参与共识的节点可称为共识节点。例如,对于新区块涉及的多个交易,各共识节点可以通过运行共识协议对所述多个交易的执行顺序达成一致。

区块链数据(也可称为链上数据)可包括通过共识的区块数据和状态数据(也可称为全局状态或世界状态),区块链数据的写入也被叫作上链。其中,区块数据包括持续生成且按时序链接的区块,各共识节点可通过运行共识协议将新区块上链。共识通过意味着每个共识节点可将相同的新区块写入区块链数据。仅作为示例,在一些实施例中,共识通过的条件包括超过预设比例(如2/3)的共识节点同意将新区块上链。状态数据可包括关联于各账户的状态变量,例如,个人、组织控制的外部账户的余额,又如,合约账户的合约状态。

值得说明的是,区块链具有公开透明的特性,因此,任一节点可以获得区块链网络中广播的交易,如果将对账方的账目数据以明文形式放入对账交易中,可能存在泄密风险。有鉴于此,在一些实施例中,可以将交易数据(如第一经营流水)以密文形式上传区块链,经授权的数据使用方(如投资方)可以使用数据来源方提供的密钥对从链上获取的相应数据解密。

在一些实施例中,区块链节点110可以是各类计算设备,如膝上型计算机、台式计算机、服务器等等。

网络120可以连接区块链网络100的各组成部分,使得各部分之间可以进行通讯。例如,接收交易的节点可以通过网络120在链上广播该交易,又例如,共识节点可以通过网络120完成共识。

网络120可以包括电缆网络、有线网络、光纤网络、电信网络、内部网络、互联网、局域网络(LAN)、广域网络(WAN)、无线局域网络(WLAN)、城域网(MAN)、公共交换电话网络(PSTN)、蓝牙网络、紫蜂网络(ZigBee)、近场通信(NFC)、设备内总线、设备内线路、线缆连接等或其任意组合。

图2是根据本说明书的一些实施例所示的智能合约资损测试方法的流程图。如图2所示,该智能合约资损测试方法200可以包括如下步骤:

步骤202,获取待测试的智能合约。在一些实施例中,步骤202可以由合约获取模块410执行。

在一些实施例中,待测试的智能合约可以是需要测试是否存在造成资损的代码的智能合约,即测试是否存在与资损有关的程序缺陷的智能合约。智能合约是合约开发者按照需求编写的可由计算机执行的程序。智能合约可以通过高级语言编写而成,例如,C语言、C++语言、java语言或VC++语言等。

在一些实施例中,智能合约可以包含一组代码,一组代码可以包括多个代码段,即智能合约可以包括多个代码段。代码段是指一组代码中的由一行或多行代码组成的代码片段,一个代码段可以对应智能合约中的一个指令或一个功能。

在一些实施例中,智能合约中的不同代码段可以实现不同的指令或功能。例如,智能合约的一个代码段A:FILE*p_file=fopen("1.txt","w")实现读取文件的功能,智能合约的另一个代码段B:if(p_file){for(num=0;num<=4;num++){fprintf(p_file,“%d-”,arr[num]);}实现存储数据的功能,其中p_file表示文件指针。

在一些实施例中,待测试的智能合约部署于测试用区块链网络的节点上。测试用区块链网络可以是合约开发者预先搭建的区块链环境,用于进行智能合约测试。测试用区块链网络与正式上线应用的区块链网络的结构及工作机制相同。可以理解的,由于测试用区块链网络并未真正上线应用,区块链的数据并不是真实使用的,因此,测试用区块链网络中的区块链数据是可以更改的。关于区块链网络的更多细节可以参见图1及其相关描述,在此不再赘述。

在一些实施例中,合约获取模块410可以从存储区块链智能合约相关数据的空间中获取待测试的智能合约,也可以通过终端上传获取待测试的智能合约。本说明书实施例并不对待测试的智能合约的获取方式做任何限制。

步骤204,确定所述智能合约中与资金处理相关的变量和/或代码。在一些实施例中,步骤204可以由第一确定模块420执行。

在一些实施例中,变量是指能够存储或代表智能合约中参与运算或处理的数据的抽象概念。变量可以包括变量值、变量名称、变量类型等要素。变量的变量值(或称为取值)可以变化,可以通过变量名称查看变量或更改变量值,不同类型的变量可以存储不同类型的数据。例如,可以在智能合约中创建一个名为Click Count的变量,用于存储用户访问某个文件的次数,Click Count的取值即表示次数。在一些实施例中,智能合约可以具有不同类型的变量,例如指针类变量,整型类变量。

在一些实施例中,与资金处理相关的变量可以包括资金转账操作或者资金金额运算涉及的变量。字段可以理解为描述某一特征或对象的数据项。在一些实施例中,可以基于区块链涉及的用户的转账操作相关的字段确定资金转账操作涉及的变量。例如,用户A向用户B转账,则资金转账操作涉及的变量可以包括“from”字段、“to”字段以及“value”字段等字段对应的变量;其中,“from”字段表示转账发起者,其内容可以是“用户A”的账户地址;“to”字段表示转账接收者,如“用户B”的账户地址,“value”字段表示转账金额。在一些实施例中,字段与变量可以互换。

对应的,资金金额运算涉及的变量可以基于与资金金额计算相关的字段确定。例如,用户的余额计算、转账的手续费计算、转账的汇率计算等。仍以上述示例为例,若智能合约的字段“bal”表征用户A的余额,则资金金额运算涉及的变量可以包括字段“bal”对应的变量。可以理解的,资金转账操作一般会导致资金金额的变化,即包括资金金额运算,因此,在一些实施例中,资金转账操作涉及的变量可以包括资金金额运算涉及的变量。

在一些实施例中,与资金处理相关的代码可以包括实现资金转账操作或者资金金额运算的代码。在一些实施例中,与资金处理相关的代码可以是一行或多行代码,多行代码可以是智能合约中相同或不同代码段包括的代码。一般地,一行代码可以是一句指令,指令包括操作码和操作数。操作码表示该指令应进行什么操作,操作数表示指令的操作对象。操作数可以包括如下类型:整型、字符型、浮点型、数组、指针类型等。

在一些实施例中,第一确定模块420可以基于资损核对规则和数据流分析技术确定智能合约中与资金处理相关的变量和/或代码。关于确定智能合约中与资金处理相关的变量和/或代码的具体细节可以参见图3及其相关描述,在此不再赘述。

在一些实施例中,第一确定模块420还可以对确定的与资金处理相关的变量和/或代码进行标记。例如,利用不同颜色进行标记或利用不同字体进行标记等。在一些实施例中,可以将标记后的智能合约称为染色智能合约。

步骤206,确定所述智能合约的测试变量及其取值,向所述智能合约中所述测试变量输入所述取值,以触发所述智能合约执行。在一些实施例中,步骤206可以有第二确定模块430执行。

一般来说,智能合约包括一个或多个输入参数。在调用智能合约时(如向区块链发起执行某智能合约的交易时),需要给出各输入参数的具体取值,以触发智能合约执行。在智能合约的测试阶段,智能合约的输入参数也可以称为测试变量,在一些测试场景下,可以使智能合约具有比正式上线运行时更多的变量,以满足不同的测试需要。在一些实施例中,可以向各测试变量分别输入相应的取值,可以触发智能合约中不同代码段的执行,这些代码段可能包含(或覆盖)与资金处理相关的变量和/或代码执行,也可能不包含与资金处理相关的变量和/或代码执行。

在一些实施例中,第二确定模块430可以随机设置智能合约的测试变量的取值。通过对智能合约中的相应变量输入某一具体取值,可以触发不同的代码段执行。进一步,可以不断的调整测试变量的取值,改变代码执行覆盖范围,进而触发包含与资金处理相关的变量和/代码的代码段执行。

在一些实施例中,第二确定模块430可以基于预先确定的变量与代码段的对应关系,确定智能合约的测试变量。例如,首先可以随机确定智能合约的测试变量及其取值,然后根据执行反馈信息,确定不同的测试变量与代码段的对应关系,仅作为示例,变量a可以触发代码段A,变量b、c能够触发代码段B。基于所述对应关系可以直接确定能够有效触发资金处理相关的变量和/代码所在代码段的测试变量及其取值,进而提高测试效率。

本说明书实施例通过自动确定智能合约的测试变量,无需人工介入或仅需要很少的人工介入的情况下,通过程序自动生成智能合约的测试变量,减少了人工的劳动力,且提高了生成的测试变量的准确性。

步骤208,获取执行反馈信息,所述执行反馈信息至少反映所述智能合约执行后,所述与资金处理相关的变量和/或代码的执行覆盖情况。在一些实施例中,步骤208可以有反馈获取模块440执行。

在一些实施例中,执行反馈信息可以是反映智能合约执行状态的信息。其中,智能合约执行状态的信息可以是变量或代码被执行覆盖的情况,或者是程序行为变化情况。在一些实施例中,执行反馈信息可以反映执行覆盖情况的信息。例如,指示智能合约中的哪些代码被触发执行了。在一些实施例中,执行反馈信息至少反映智能合约执行后,与资金处理相关的变量和/或代码的执行覆盖情况。执行覆盖可以是指当智能合约执行时,与资金处理相关的变量和/或代码被触发执行。相应的,执行覆盖情况可以反映与资金处理相关的变量和/或代码是否被触发执行。又例如,执行反馈信息指示智能合约的程序行为是否发生变化。程序行为可以反映执行过程中程序的变量状态或者程序执行结束后的输出数据状态。以智能合约为例,程序行为可以反映智能合约执行时其相关变量的取值状态,或者反应智能合约执行完后对世界状态的改变,例如,对世界状态中存储的变量的取值的改变。示例性地,以与资金处理相关的代码“Y=bal+b”为例,其中,bal表征用户A的当前余额,b为转账金额,且与测试变量a相关;若在第一次测试时测试变量a=1,变量b=1;若在第二次测试时测试变量a=2,变量b=0;可以认为通过改变测试变量a的取值,改变了智能合约中变量b的取值状态,进而认为改变了智能合约或智能合约中与资金处理相关的变量和/或代码的程序行为。

在一些实施例中,反馈获取模块440可以通过对智能合约的代码采取代码插桩技术获取代码的执行状态信息。代码插桩技术是在被测程序代码中插入探针,然后通过探针的执行来获得程序代码的控制流和数据流信息,以此来得到程序代码的代码执行覆盖情况或者程序行为变化情况。

在一些实施例中,执行反馈信息还可以通过打印的日志信息获取。在一些实施例中,打印的日志信息可以记录智能合约执行的流程,即智能合约执行了哪些代码以及代码相关变量的取值状态。从而,通过打印的日志信息可以确定与资金处理相关的变量和/或代码的执行覆盖情况或者程序行为变化情况。在一些实施例中,可以通过打印工具获取打印的日志信息。

步骤210,基于所述执行反馈信息,调整所述测试变量中至少一个的取值,以再次触发所述智能合约执行,直至满足预设的测试终止条件。在一些实施例中,步骤210可以由调整模块450执行。

在一些实施例中,调整模块450可以基于执行反馈信息,调整测试变量中至少一个的取值,以再次触发智能合约执行。例如,修改测试变量中部分的取值,再次向智能合约中的所述测试变量输入所述取值以再次触发智能合约执行。

例如,可以调整所述智能合约测试变量中的一个或多个的取值,以增加与资金处理相关的变量和/代码的执行覆盖率。示例性的,可以对测试变量中部分或全部测试变量的取值进行变化,以再次触发智能合约执行。所述执行覆盖率可以理解为,一次测试中,被执行覆盖的代码段中,与资金处理相关的变量和/或代码的占比;或者一次测试中,被执行覆盖的与资金处理相关的变量和/或代码,占总代码的比率;又或者,已经完成的多次测试中,在各次测试中被执行覆盖的与资金处理相关的变量和/或代码的并集占总代码的比率。其中,确定智能合约各测试变量对应的具体取值,并输入以触发智能合约完成一次执行,这一过程可以看作一次测试。

又例如,还可以调整所述智能合约的测试变量中的一个或多个的取值,以增加与资金处理相关的变量和/或代码的程序行为覆盖率。鉴于步骤208中关于程序行为的相关说明,所述与资金处理相关的变量和/或代码的程序行为覆盖率可以与,已完成的多次测试中,与资金处理相关的变量的取值状态数量,正相关。其中,一种与资金处理相关的变量的取值组合可以被看作一种取值状态。如,第一次测试得到的与资金处理相关的变量的取值组合与第二次测试得到的与资金处理相关的变量的取值组合不同,则状态数量为2;又如,第一次测试得到的与资金处理相关的变量的取值组合与第二次测试得到的与资金处理相关的变量的取值组合不同,但与第三次测试得到的与资金处理相关的变量的取值组合相同,则状态数量依然为2。增加与资金处理相关的变量和/或代码的程序行为覆盖率可以是改变测试变量的部分或全部的取值,以至少增加与资金处理相关的变量的取值状态数量。

可以理解,代码的执行覆盖率的变化一般会导致程序行为的变化,但在一些场景中,代码的执行覆盖率不变的情况下,程序行为也可能变化。例如,当改变测试变量中部分或全部的取值后,智能合约执行时触发的代码与上一次测试相同,但是相关变量的取值状态却发生了变化。本说明书实施例通过执行反馈信息不断调整测试变量取值,以再次触发智能合约执行,使得智能合约到达正常执行很难到达的执行状态,制造出更多的合约边界运行条件,高效率的检测出潜在的资损缺陷;同时,将可能的资损缺陷点在合约部署前暴露出来,避免了智能合约正式上线应用时造成资损。

在一些实施例中,执行反馈信息还可以反映智能合约执行产生的交易数据的核对结果。在一些实施例中,交易数据可以是与区块链中产生的交易相关的数据。在本说明书实施例中,向智能合约中的测试变量输入取值,触发智能合约执行相当于产生并执行了一次交易,进而得到交易数据。因此,交易数据可以是向智能合约中的测试变量输入取值,触发智能合约执行后产生的数据,例如智能合约执行后,新增的数据或者更改的数据。交易数据可以与资金相关,例如,交易数据可以是智能合约涉及的多个资金账户在智能合约执行后的账户余额。又例如,交易数据可以是资金账户之间的转账金额。

在一些实施例中,核对结果可以表征交易数据对应的交易是否发生了资损。在一些实施例中,在执行反馈信息反映的核对结果为出现资损时,可以认为以当前测试变量的取值作为智能合约输入时,被执行覆盖的这部分与资金处理相关的变量和/或代码的执行情况是有问题的,智能合约存在易出现资损的代码缺陷,此时可以记录测试结果以便对该智能合约进行优化或修复。

在一些实施例中,当所述执行反馈信息反映所述智能合约执行后,所述与资金处理相关的变量和/或代码中的至少一个被执行覆盖且核对结果为未出现资损时,可以认为在当前测试变量的取值下,被执行覆盖的这部分与资金处理相关的变量和/或代码的执行情况是没有问题的,调整模块450可以调整所述测试变量中至少一个的取值,以增加与资金处理相关的变量和/或代码的执行覆盖率,或增加与资金处理相关的变量和/或代码的程序行为覆盖率,检测智能合约中其他与资金处理相关的变量和/或代码是否存在易于引发资损的漏洞或缺陷。本说明书实施例通过核对结果对各测试变量的取值进行调整,即核对结果能够为测试变量提供调整方向,探索出更多能成功触发资损的有效测试变量及其取值,最大效率的覆盖到可能发生资损的合约运行场景。

在一些实施例中,可以从测试用区块链网络中获取区块数据,解析区块数据得到智能合约执行产生的交易数据;基于预设核对逻辑处理交易数据,获得核对结果。

如前所述,区块链是一个去中心化的分布式账本数据库。区块链可以由一串使用密码学相关联所产生的数据块(即区块)组成,每个数据块(即区块)记录了一段时间内发生的交易和状态结果。因此,区块数据可以包括交易数据、账户状态数据和交易执行过程中生成的日志数据。

可以理解的,在一些实施例中,解析区块数据可以是指从区块数据中筛选得到交易数据。在一些实施例中,可以通过区块链网络100之外的服务器,例如,区块链的节点连接的资损调度服务器,从测试用区块链网络中获取区块数据,解析区块数据得到智能合约执行产生的交易数据。

在一些实施例中,解析区块数据得到交易数据还可以是指得到交易数据中与预设核对逻辑相关的数据。预设核对逻辑可以根据实际场景进行具体设置。在一些实施例中,预设核对逻辑可以包括平账逻辑。例如,若区块链涉及的多个资金账户之间进行转账,且并没有新的货币产生,则平账逻辑可以包括多个资金账户的账户余额与未触发此次交易(即未触发智能合约此次执行)之前的账户余额相同。对应的,预设核对逻辑相关的数据可以是多个资金账户的账户余额。

又例如,若区块链涉及的资金账户发生了支付完成事件、退款完成事件、和确认收货时结算完成事件,则平账逻辑可以是资金账户的支付金额-退款金额=结算金额。对应的,与预设核对逻辑相关的数据可以包括资金账户的支付金额、退款金额和结算金额。应当知晓的,上述仅为预设核对逻辑的示意性举例,本说明书并不对预设核对逻辑做任何限制。

在一些实施例中,核对结果可以通过资损监控服务器处理交易数据获得。资损监控服务器可以是区块链网络100之外的服务器。对应的,资损监控服务器可以基于预设核对逻辑处理交易数据,获得核对结果。仍以上述示例为例,资损监控服务器可以获取资金账户的账户余额,以检测多个资金账户的账户余额与未触发此次交易(即未触发智能合约此次执行)之前的账户余额是否相同,其中,若相同,则核对结果为未出现资损;若不相同,则核对结果为出现资损。

在一些实施例中,预设的测试终止条件可以根据实际需求进行具体设置。例如,预设的测试终止条件可以是执行反馈信息反映在智能合约被多次测试后,其中被执行覆盖的与资金处理相关的变量和/或代码达到预设数量,如执行反馈信息反映与资金处理相关的变量和/或代码的代码覆盖率达到预设阈值(例如,95%、98%等)。又例如,预设的测试终止条件可以是触发智能合约执行的次数达到预设阈值(例如,1000次)。又例如,预设的测试终止条件可以是测试出智能合约存在明显缺陷,需要对智能合约进行修改后再进行测试。

图3是根据本说明书的一些实施例所示的确定智能合约中与资金处理相关的变量和/或代码的流程图。如图3所示,该流程300包括步骤302和步骤304。在一些实施例中,步骤302和步骤304可以由第一确定模块420执行。

步骤302,基于资损核对规则中与资金处理相关的字段记录,确定所述智能合约中与资金处理相关的一个或多个变量。

在一些实施例中,资损核对规则可以包括对资损核对逻辑以及相关字段的描述,可以根据实际需求进行具体设置。在一些实施例中,资损核对规则可以与预设核对逻辑相关。例如,资损核对规则可以包括预设核对逻辑。关于预设核对逻辑的具体描述可以参见上述步骤210及其相关描述,在此不再赘述。

在一些实施例中,与资金处理相关的字段记录可以包括字段的名称、属性、数值类型(例如,实型、整型等)等记录或描述信息。示例性地,以资损核对规则包括平账逻辑为例,则可以基于平账逻辑中与资金处理相关的字段记录,确定一个或多个变量。例如,资损核对规则中包含“目的账户”这一字段,则可以确定智能合约中与“目的账户”字段对应的变量“T-account”为与资金处理相关的变量。

步骤304,基于所述一个或多个变量,利用数据流分析技术确定所述智能合约中与资金处理相关的其他变量和/或代码。

在一些实施例中,数据流分析技术可以是识别与变量相关的其他变量和/或代码的方式。通过数据流分析,可以不必实际运行程序就能够发现程序运行时的行为。具体的,可以首先确定智能合约中的起点(如步骤302确定的某个变量)并对其进行标记;然后前向或后向确定起点数据依赖“代码路径”,得到与起点数据具有依赖和被依赖关系的变量或代码集合。示例性地,步骤302确定与资金处理相关的变量为账户A的余额,将账户A的余额作为起点数据并在智能合约中对其进行标记,通过数据流分析,确定出与该账户余额所涉及的变量和/或代码还包括账户A向账户B转账的账户B的余额、对账户A转出金额进行汇率转换的代码、记录汇率转换结果的变量以及实现转账操作的代码,进一步可以汇率转换结果作为另一个起点再次进行数据流分析,依次类推,最终确定出智能合约中与资金处理相关的所有变量和/或代码。

图4是根据本说明书的一些实施例所示的智能合约资损测试系统的模块图。

如图4所示,该系统400可以包括合约获取模块410、第一确定模块420、第二确定模块430、反馈获取模块440以及调整模块450。

合约获取模块410可以用于获取待测试的智能合约。在一些实施例中,所述智能合约部署于测试用区块链网络的节点上。

第一确定模块420可以用于确定所述智能合约中与资金处理相关的变量和/或代码。

在一些实施例中,所述第一确定模块420进一步用于:基于资损核对规则中与资金处理相关的字段记录,确定所述智能合约中与资金处理相关的一个或多个变量;基于所述一个或多个变量,利用数据流分析技术确定所述智能合约中与资金处理相关的其他变量和/或代码。在一些实施例中,所述与资金处理相关的变量包括资金转账操作或者资金金额运算涉及的变量,与资金处理相关的代码包括实现资金转账操作或者资金金额运算的代码。

第二确定模块430可以用于确定所述智能合约的测试变量及其取值,向所述智能合约中的所述测试变量输入所述取值,以触发所述智能合约执行。

反馈获取模块440可以用于获取执行反馈信息,所述执行反馈信息至少反映所述智能合约执行后,所述与资金处理相关的变量和/或代码的执行覆盖情况。

调整模块450可以用于基于所述执行反馈信息,调整所述测试变量中至少一个的取值,以再次触发所述智能合约执行,直至满足预设的测试终止条件。在一些实施例中,所述调整模块450进一步用于:调整所述测试变量中至少一个的取值,以增加与资金处理相关的变量和/或代码的执行覆盖率。

在一些实施例中,所述执行反馈信息还反映所述智能合约执行产生的交易数据的核对结果;所述调整模块450进一步用于:若所述执行反馈信息反映所述智能合约执行后,所述与资金处理相关的变量和/或代码中的至少一个被执行覆盖且核对结果为未出现资损时,则调整所述测试变量中至少一个的取值,以增加与资金处理相关的变量和/或代码的执行覆盖率。

在一些实施例中,该系统400还可以包括区块数据获取模块、解析模块和核对结果获取模块。区块数据获取模块可以用于从所述测试用区块链网络中获取区块数据。解析模块可以用于解析所述区块数据得到所述智能合约执行产生的交易数据。核对结果获取模块可以用于基于预设核对逻辑处理所述交易数据,获得所述核对结果。在一些实施例中,所述核对结果是通过资损监控服务器处理所述交易数据获得。

应当理解,图4所示的系统及其模块可以利用各种方式来实现。例如,在一些实施例中,系统及其模块可以通过硬件、软件或者软件和硬件的结合来实现。其中,硬件部分可以利用专用逻辑来实现;软件部分则可以存储在存储器中,由适当的指令执行系统,例如微处理器或者专用设计硬件来执行。本领域技术人员可以理解上述的方法和系统可以使用计算机可执行指令和/或包含在处理器控制代码中来实现,例如在诸如磁盘、CD或DVD-ROM的载体介质、诸如只读存储器(固件)的可编程的存储器或者诸如光学或电子信号载体的数据载体上提供了这样的代码。本说明书的系统及其模块不仅可以有诸如超大规模集成电路或门阵列、诸如逻辑芯片、晶体管等的半导体、或者诸如现场可编程门阵列、可编程逻辑设备等的可编程硬件设备的硬件电路实现,也可以用例如由各种类型的处理器所执行的软件实现,还可以由上述硬件电路和软件的结合(例如,固件)来实现。

需要注意的是,以上对于智能合约资损测试系统400及其模块的描述,仅为描述方便,并不能把本说明书限制在所举实施例范围之内。可以理解,对于本领域的技术人员来说,在了解该系统的原理后,可能在不背离这一原理的情况下,对各个模块进行任意组合,或者构成子系统与其他模块连接。例如,图4中披露的合约获取模块410、第一确定模块420、第二确定模块430、反馈获取模块440以及调整模块450可以是一个系统中的不同模块,也可以是一个模块实现上述的两个模块的功能。又例如,智能合约资损测试系统400中各个模块可以共用一个存储模块,各个模块也可以分别具有各自的存储模块。诸如此类的变形,均在本说明书的保护范围之内。

本说明书实施例还提供一种智能合约资损测试装置,包括至少一个存储介质和至少一个处理器,所述至少一个存储介质用于存储计算机指令;所述至少一个处理器用于执行所述计算机指令以实现如前任一项所述的智能合约资损测试方法。

本说明书实施例可能带来的有益效果包括但不限于:(1)在智能合约正式上链前进行资损测试,能够有效避免智能合约在实际交易处理过程中发生不可挽回的资金损失,进一步提高区块链网络的可靠性;(2)通过执行反馈信息不断调整测试变量的取值,以再次触发智能合约执行。可以得到大量能触发与资金处理相关的变量和/或代码执行的测试变量,使得智能合约到达平时执行很难到达的程序状态,能够制造出非常多的合约边界运行条件,高效率的检测出潜在的资损缺陷;(3)通过核对结果为测试变量提供调整方向,探索出更多能成功触发资损的有效测试变量及其取值,最大效率的覆盖到可能发生资损的合约运行场景。需要说明的是,不同实施例可能产生的有益效果不同,在不同的实施例里,可能产生的有益效果可以是以上任意一种或几种的组合,也可以是其他任何可能获得的有益效果。

上文已对基本概念做了描述,显然,对于本领域技术人员来说,上述详细披露仅仅作为示例,而并不构成对本说明书的限定。虽然此处并没有明确说明,本领域技术人员可能会对本说明书进行各种修改、改进和修正。该类修改、改进和修正在本说明书中被建议,所以该类修改、改进、修正仍属于本说明书示范实施例的精神和范围。

同时,本说明书使用了特定词语来描述本说明书的实施例。如“一个实施例”、“一实施例”、和/或“一些实施例”意指与本说明书至少一个实施例相关的某一特征、结构或特点。因此,应强调并注意的是,本说明书中在不同位置两次或多次提及的“一实施例”或“一个实施例”或“一个替代性实施例”并不一定是指同一实施例。此外,本说明书的一个或多个实施例中的某些特征、结构或特点可以进行适当的组合。

此外,本领域技术人员可以理解,本说明书的各方面可以通过若干具有可专利性的种类或情况进行说明和描述,包括任何新的和有用的工序、机器、产品或物质的组合,或对他们的任何新的和有用的改进。相应地,本说明书的各个方面可以完全由硬件执行、可以完全由软件(包括固件、常驻软件、微码等)执行、也可以由硬件和软件组合执行。以上硬件或软件均可被称为“数据块”、“模块”、“引擎”、“单元”、“组件”或“系统”。此外,本说明书的各方面可能表现为位于一个或多个计算机可读介质中的计算机产品,该产品包括计算机可读程序编码。

计算机存储介质可能包含一个内含有计算机程序编码的传播数据信号,例如在基带上或作为载波的一部分。该传播信号可能有多种表现形式,包括电磁形式、光形式等,或合适的组合形式。计算机存储介质可以是除计算机可读存储介质之外的任何计算机可读介质,该介质可以通过连接至一个指令执行系统、装置或设备以实现通讯、传播或传输供使用的程序。位于计算机存储介质上的程序编码可以通过任何合适的介质进行传播,包括无线电、电缆、光纤电缆、RF、或类似介质,或任何上述介质的组合。

本说明书各部分操作所需的计算机程序编码可以用任意一种或多种程序语言编写,包括面向对象编程语言如Java、Scala、Smalltalk、Eiffel、JADE、Emerald、C++、C#、VB.NET、Python等,常规程序化编程语言如C语言、Visual Basic、Fortran2003、Perl、COBOL2002、PHP、ABAP,动态编程语言如Python、Ruby和Groovy,或其他编程语言等。该程序编码可以完全在用户计算机上运行、或作为独立的软件包在用户计算机上运行、或部分在用户计算机上运行部分在远程计算机运行、或完全在远程计算机或处理设备上运行。在后种情况下,远程计算机可以通过任何网络形式与用户计算机连接,比如局域网(LAN)或广域网(WAN),或连接至外部计算机(例如通过因特网),或在云计算环境中,或作为服务使用如软件即服务(SaaS)。

此外,除非权利要求中明确说明,本说明书所述处理元素和序列的顺序、数字字母的使用、或其他名称的使用,并非用于限定本说明书流程和方法的顺序。尽管上述披露中通过各种示例讨论了一些目前认为有用的发明实施例,但应当理解的是,该类细节仅起到说明的目的,附加的权利要求并不仅限于披露的实施例,相反,权利要求旨在覆盖所有符合本说明书实施例实质和范围的修正和等价组合。例如,虽然以上所描述的系统组件可以通过硬件设备实现,但是也可以只通过软件的解决方案得以实现,如在现有的处理设备或移动设备上安装所描述的系统。

同理,应当注意的是,为了简化本说明书披露的表述,从而帮助对一个或多个发明实施例的理解,前文对本说明书实施例的描述中,有时会将多种特征归并至一个实施例、附图或对其的描述中。但是,这种披露方法并不意味着本说明书对象所需要的特征比权利要求中提及的特征多。实际上,实施例的特征要少于上述披露的单个实施例的全部特征。

一些实施例中使用了描述成分、属性数量的数字,应当理解的是,此类用于实施例描述的数字,在一些示例中使用了修饰词“大约”、“近似”或“大体上”来修饰。除非另外说明,“大约”、“近似”或“大体上”表明所述数字允许有±20%的变化。相应地,在一些实施例中,说明书和权利要求中使用的数值参数均为近似值,该近似值根据个别实施例所需特点可以发生改变。在一些实施例中,数值参数应考虑规定的有效数位并采用一般位数保留的方法。尽管本说明书一些实施例中用于确认其范围广度的数值域和参数为近似值,在具体实施例中,此类数值的设定在可行范围内尽可能精确。

针对本说明书引用的每个专利、专利申请、专利申请公开物和其他材料,如文章、书籍、说明书、出版物、文档等,特此将其全部内容并入本说明书作为参考。与本说明书内容不一致或产生冲突的申请历史文件除外,对本说明书权利要求最广范围有限制的文件(当前或之后附加于本说明书中的)也除外。需要说明的是,如果本说明书附属材料中的描述、定义、和/或术语的使用与本说明书所述内容有不一致或冲突的地方,以本说明书的描述、定义和/或术语的使用为准。

最后,应当理解的是,本说明书中所述实施例仅用以说明本说明书实施例的原则。其他的变形也可能属于本说明书的范围。因此,作为示例而非限制,本说明书实施例的替代配置可视为与本说明书的教导一致。相应地,本说明书的实施例不仅限于本说明书明确介绍和描述的实施例。

相关技术
  • 一种智能合约资损监控系统的测试方法及系统
  • 一种智能合约资损测试方法及系统
技术分类

06120112772676