CN113010409A - 智能合约测试方法及装置、电子设备、存储介质 - Google Patents
智能合约测试方法及装置、电子设备、存储介质 Download PDFInfo
- Publication number
- CN113010409A CN113010409A CN202010972336.XA CN202010972336A CN113010409A CN 113010409 A CN113010409 A CN 113010409A CN 202010972336 A CN202010972336 A CN 202010972336A CN 113010409 A CN113010409 A CN 113010409A
- Authority
- CN
- China
- Prior art keywords
- code
- intelligent contract
- anchor point
- information
- anchor
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本申请的实施例揭示了一种智能合约测试方法及相关装置,该方法包括:向部署在区块链上的第一智能合约发起数据查询请求,所述数据查询请求用于指示所述第一智能合约返回第二智能合约的代码执行信息,所述第二智能合约部署在所述区块链上;接收所述第一智能合约返回的所述第二智能合约的代码执行信息,所述第二智能合约的运行代码中含有用于调用所述第一智能合约的锚点函数,所述代码执行信息是所述第一智能合约基于所述锚点函数在所述运行代码的测试过程中的执行获取得到的;根据所述代码执行信息对所述运行代码的测试过程进行分析,得到所述第二智能合约的代码测试结果。本申请实施例的技术方案实现了对于智能合约的测试。
Description
技术领域
本申请涉及区块链技术领域,具体涉及一种智能合约测试方法及装置、以及一种电子设备和计算机可读存储介质。
背景技术
智能合约是一种运行在可复制的、共享的账本上的计算机程序,智能合约作为区块链技术的核心部分,在测试时需要运行在区块链服务虚拟沙箱中,但由于沙箱环境不能与外部进行交互,导致智能合约无法采用现有的软件测试技术来进行测试,从而无法对智能合约的安全性进行较为全面的验证。
发明内容
为解决上述技术问题,本申请的实施例提供了一种智能合约测试方法及装置、电子设备和计算机可读存储介质,本申请的实施例基于智能合约所运行沙箱环境的机制实现了针对智能合约的测试。
本申请的其他特性和优点将通过下面的详细描述变得显然,或部分地通过本申请的实践而习得。
根据本申请的一个方面,提供了一种智能合约测试方法,包括:向部署在区块链上的第一智能合约发起数据查询请求,所述数据查询请求用于指示所述第一智能合约返回第二智能合约的代码执行信息,所述第二智能合约部署在所述区块链上;接收所述第一智能合约返回的所述第二智能合约的代码执行信息,所述第二智能合约的运行代码中含有用于调用所述第一智能合约的锚点函数,所述代码执行信息是所述第一智能合约基于所述锚点函数在所述运行代码的测试过程中的执行获取得到的;根据所述代码执行信息对所述运行代码的测试过程进行分析,得到所述第二智能合约的代码测试结果。
根据本申请的一个方面,提供了一种智能合约测试装置,包括:数据查询模块,配置为向部署在区块链上的第一智能合约发起数据查询请求,所述数据查询请求用于指示所述第一智能合约返回第二智能合约的代码执行信息,所述第二智能合约部署在所述区块链上;数据获取模块,配置为接收所述第一智能合约返回的所述第二智能合约的代码执行信息,所述第二智能合约的运行代码中含有用于调用所述第一智能合约的锚点函数,所述代码执行信息是所述第一智能合约基于所述锚点函数在所述运行代码的测试过程中的执行获取得到的;数据分析模块,配置为根据所述代码执行信息对所述运行代码的测试过程进行分析,得到所述第二智能合约的代码测试结果。
根据本申请的一个方面,还提供了一种电子设备,所述电子设备包括处理器及存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时实现如上所述的智能合约测试方法。
根据本申请的一个方面,提供了一种计算机可读存储介质或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行如上所述的智能合约测试方法。
在上述技术方案中,区块链上部署有第一智能合约和第二智能合约,第一智能合约与第二智能合约运行在同一沙箱环境中,二者智能合约之间能够基于智能合约之间的调用方式进行交互。第二智能合约的运行代码中含有用于调用第一智能合约的锚点函数,使得第二智能合约的运行代码在测试过程中,通过执行其中含有的锚点函数,第一智能合约能够相应获得锚点函数被执行的情况,从而得到第二智能合约的代码执行信息。测试终端通过向第一合约发起数据查询请求,即能够获取到第二合约的代码执行信息,通过对代码执行信息进行分析,即可得到第二智能合约的测试结果。因此,本申请实施例的技术方案通过用于收集代码执行信息的第一智能合约来辅助获取第二智能合约的测试结果,解决了现有技术中无法针对智能合约进行软件测试的问题。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术者来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1是本申请涉及的一种实施环境的示意图;
图2是根据一示例性实施例示出的一种智能合约测试方法的流程图;
图3是根据一示例性实施例示出的一种智能合约测试架构的示意图;
图4是根据一示例性实施例示出的一种智能合约的源代码和运行代码的示意图;
图5是基于图2所示实施例提出的另一种智能合约测试方法的流程图;
图6是根据一示例性实施例示出的一种智能合约的运行代码的生成过程示意图;
图7是图2所示实施例中的步骤S210在一个实施例的流程图;
图8是图2所示实施例中的步骤S210在另一个实施例的流程图;
图9是基于图2所示实施例提出的另一种智能合约测试方法的流程图;
图10是根据一示例性实施例示出的一种智能合约测试装置的框图;
图11是根据一示例性实施例示出的一种电子设备的结构示意图。
具体实施方式
这里将详细地对示例性实施例执行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
还需要说明的是:在本申请中提及的“多个”是指两个或两个以上。“和/或”描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
请参阅图1,图1是本申请涉及的一种实施环境的示意图。该实施环境具体为一智能合约测试系统,该智能合约测试系统包括区块链服务端100和测试终端200。
如图1所示,区块链服务端100设有多个区块链服务节点101。在实际的区块链应用场景中,这些区块链服务节点101可以是在区块链系统中部署的各个客户端中运行的区块链服务,例如用于为客户端提供区块链账本的共享服务。在智能合约测试场景中,该区块链服务端100具体可以是区块链服务虚拟机沙箱,这些区块链服务节点101是区块链服务虚拟机沙箱模拟的在多个区块链节点中部署的区块链服务。
区块链服务端100中部署有第一智能合约102以及第二智能合约103,其中第一智能合约102对外提供至少两种调用方式,一种是提供给第二智能合约103执行调用该第一智能合约102的锚点函数,这些锚点函数分别配置在第二智能合约103的运行代码中的各个代码位置;另一种是提供给测试终端200执行的查询函数。
第二智能合约103具体是待测试的智能合约,例如第二智能合约103可以是区块链服务端100部署待测试的业务智能合约,通过对业务智能合约的测试,能够验证业务智能合约的业务安全性。
具体的,测试终端200通过向第二智能合约103发送业务请求,以触发第二智能合约103在针对业务请求进行响应时执行第二智能合约103的运行代码,该运行代码是在第二智能合约103的源代码中插入锚点函数后得到的。运行代码的执行过程也即是运行代码的测试过程,在此测试过程中,第二智能合约103会执行运行代码中含有的锚点函数。由于第一智能合约102能够基于自身被调用的情况获知运行代码中的锚点函数被执行的情况,因此第一智能合约102能够收集到第二智能合约103在测试过程中的代码执行信息,例如代码执行信息是第二智能合约102针对业务请求的代码执行链路。
测试终端200通过调用第一智能合约102所提供的查询函数,能够获得第一智能合约102收集得到的代码执行信息,进而能够根据代码执行信息对运行代码在测试过程中的代码执行情况进行分析,得到所述第二智能合约的代码测试结果。其中,测试终端200可以是计算机、笔记本电脑等终端设备,本处不进行限制。
图2是根据一示例性实施例示出的一种智能合约测试方法的流程图。该方法可以应用在图1所示的实施环境中,并且由测试终端200具体执行,以使测试终端200能够获得部署在区块链服务端100上的第二智能合约103的测试结果。
如图2所示,在一示例性实施例中,该智能合约测试方法至少包括步骤210至步骤230,详细介绍如下:
步骤S210,向部署在区块链上的第一智能合约发起数据查询请求,数据查询请求用于指示第一智能合约返回第二智能合约的代码执行信息,第二智能合约部署在区块链上。
首先需要说明的是,智能合约作为区块链技术的核心部分,需要承载业务的区块链化,并且未来将会有越来越多的去中心化应用使用智能合约运行在区块链上。一旦智能合约被部署到区块链上之后,其代码内容将是可见的,若没有对智能合约进行安全性等方面的测试验证,部署在区块链上的智能合约极易受到恶意攻击,因此在将智能合约部署到区块链上之前,对智能合约进行测试是十分有必要的。
智能合约在测试时通常需要运行在区块链服务虚拟沙箱中,区块链服务虚拟沙箱用于模拟智能合约部署在实际的区块链上的运行环境,以基于智能合约在区块链服务虚拟沙箱中的运行情况,获知将智能合约部署到实际的区块链上之后的运行情况,所得到的测试结果可以为智能合约的代码完善提供思路,使得部署到实际的区块链上的智能合约具有较高的安全性等性能。
但是,由于沙箱环境不能与外部进行交互,导致智能合约无法采用现有的软件测试技术来进行测试,从而无法对智能合约的安全性等方面进行测试验证。
为解决此问题,本实施例提出一种智能合约测试方法,具体在区块链上部署第一智能合约和第二智能合约,由于第一智能合约和第二智能合约均部署在相同的区块链环境中,第一智能合约与第二智能合约之间能够基于智能合约之间的调用方式进行交互,使得第一智能合约能够收集到第二智能合约在测试过程中的代码执行信息,根据第一智能合约收集到的代码执行信息对第二智能合约在测试过程中的代码执行情况进行分析,能够得到第二智能合约的代码测试结果,由此支持对于智能合约的测试验证。
若区块链为前述的区块链服务虚拟沙箱,虽然沙箱环境不能与外部进行交互,但由于第一智能合约与第二智能合约均部署在此区块链服务虚拟沙箱中,二者之间可以基于智能合约间的调用来进行交互,能够实现智能合约的测试验证,从而解决了现有的测试技术无法对智能合约进行测试验证的问题。
由此可知,本实施例中的第一智能合约和第二智能合约是指同一区块链上部署的具有不同功能的智能合约。其中,第二智能合约是待测试的智能合约,其可以用于实现一定的业务功能,例如第二智能合约可以用于约束区块链账本在各个区块链节点之间的共享过程,通过对第二智能合约进行测试,以验证第二智能合约是否提供安全的业务功能。
第一智能合约则是用于收集第二智能合约的代码执行信息的智能合约,第二智能合约的代码执行信息是指第二智能合约在测试过程中的代码执行情况。第二智能合约的测试过程可以理解为是第二智能合约响应于接收到的业务请求,实现请求方所请求业务的过程。便于理解的,第二智能合约接收到的业务请求可以理解是测试终端基于自动化测试用例向第二智能合约发起的测试请求。
如上所述的,第二智能合约的代码测试结果需要根据第二智能合约的代码执行信息进行分析处理得到,因此测试终端而言,需要向第一智能合约发起数据查询请求,以请求第一智能合约将其收集的第二智能合约的代码执行信息返回。
在一些实施例中,第一智能合约对外提供至少一种调用方式,具体是提供给测试终端执行调用该第一智能合约的查询函数,因此测试终端通过调用该查询函数,即能够向第一智能合约发起数据查询请求,以请求第一智能合约返回第二智能合约的代码执行信息。
步骤S230,接收第一智能合约返回的第二智能合约的代码执行信息,第二智能合约的运行代码中含有用于调用第一智能合约的锚点函数,代码执行信息是第一智能合约基于锚点函数在运行代码的测试过程中的执行情况获取得到的。
测试终端向第一智能合约发起数据查询请求后,第一智能合约向测试终端返回第二智能合约的代码执行信息,因此测试终端能够接收到此代码执行信息。
为便于理解第一智能合约收集第二智能合约的代码执行信息的详细过程,下面将结合图3所示的智能合约测试架构对此过程进行详细描述。
如图3所示,第一智能合约还对外提供另一种调用方式,具体是提供给第二智能合约执行调用该第一智能合约的锚点函数,这些锚点函数被配置在第二智能合约的运行代码中的不同代码位置。
第二智能合约的运行代码具体是在第二智能合约的源代码中插入第一智能合约所提供的锚点函数后得到的,所插入的锚点函数可以理解为是在保证第二智能合约的源代码的原有逻辑完整性的基础上,在源代码中插入的用于信息采集的代码段。
例如图4所示,可以通过在第二智能合约的源代码中的不同代码位置插入代码段“BlockChain.CALL(第一智能合约,锚点函数,锚点标识)”,从而在第二智能合约的源代码中实现锚点函数的插入。在所插入的代码段中,“BlockChain.CALL()”表示区块链中部署的智能合约之间的调用方法函数,源代码中插入的各个调用方法函数中的前两个参数都是相同的,但最后一个参数,也即是锚点标识各不相同,因此不同的锚点标识可以用于标识在源代码中插入的不同的锚点函数。
需要说明的是,在一些实施例中,可以基于插桩的方式在第二智能合约的源代码中插入锚点函数,以生成第二智能合约的运行代码,详细的过程请参见后续实施例中记载的内容,本处不进行赘述。
此外,对第二智能合约而言,部署在区块链上的代码具体是第二智能合约的运行代码,因此本实施例针对第二智能合约的测试过程,也即是针对第二智能合约的运行代码的测试过程。
第二智能合约对外提供至少一种调用方式,例如提供给测试终端执行调用该第二智能合约的请求函数,因此在步骤S210之前,测试终端通过调用第二智能合约提供的请求函数,能够向第二智能合约发起业务请求,该业务请求用于触发第二智能合约执行运行代码的测试过程。
业务请求触发第二智能合约执行运行代码的测试过程可以包括:第二智能合约接收到测试终端发送的业务请求后,将执行自身的运行代码,并且在运行代码的执行过程中,通过执行运行代码中含有的锚点函数调用第一智能合约,第一智能合约在接收到第二智能合约的调动之后,根据被执行的锚点函数在运行代码中的位置信息,得到第二智能合约的代码执行信息。
在一些实施例中,第二智能合约会将与运行代码中的各个锚点函数相关的锚点信息上报至第一智能合约中,锚点信息例如包括各个锚点函数在运行代码中的位置信息、各个锚点函数中含有的锚点标识等。不同的锚点标识用于标识运行代码中不同的锚点函数,因此第一智能合约在接收到第二智能合约的调用后,通过确定此次调用对应的锚点标识,即可定位运行代码中当前被执行的锚点函数,根据第二智能合约上报的各个锚点函数在运行代码中的位置信息,则能够准确定位运行代码中当前被执行的锚点函数所在的具体代码位置。
基于上述过程,在运行代码的测试过程中,第一智能合约根据不断接收到的第二智能合约的调用,在第二智能合约的运行代码中追踪代码执行链路,直至第二智能合约停止调用该第一智能合约,所追踪得到的代码执行链路即为第二智能合约针对此次业务请求的代码执行信息。由此可知,第二智能合约的代码执行信息,是第一智能合约基于锚点函数在运行代码的测试过程中的执行获取得到的。
步骤S250,根据代码执行信息对运行代码的测试过程进行分析,得到第二智能合约的代码测试结果。
通常而言,针对第二智能合约的运行代码进行测试的目的可以有多种,例如可以对第二智能合约提供的某一项或多项特定业务功能进行测试验证,以确定特定业务功能的开发精准程度;或者可以获取第二智能合约的代码覆盖率,以基于代码覆盖率来验证针对第二智能合约进行测试的软件功能测试完整性指标,本处不进行一一列举。基于不同的测试目的,所得到的代码测试结果可以不同。
运行代码的测试过程是指运行代码在测试过程中的代码执行情况,例如包括运行代码在测试过程中执行了哪些代码,和/或运行代码中有哪些代码未被执行。根据运行代码的执行情况,则可以分析针对运行代码进行测试的达成情况,例如在针对第二智能合约的特定业务功能的开发精准程度进行验证的测试场景中,可以根据运行代码实现特定业务功能时的代码执行链路,判断是否存在于实现特定业务功能无关的冗余代码,若存在,则可以将此冗余代码从源代码中删除,得到更加精简的源代码。
在获取第二智能合约的代码覆盖率的测试场景中,由于代码覆盖率用于表征针对第二智能合约进行测试的完整程度,需要向第二智能合约发起不同的业务请求,并根据第二智能合约响应不同业务请求对应的代码执行链路的汇总情况来计算代码覆盖率。若第二智能合约的代码覆盖率未达到预期的代码覆盖率要求,则可以补充自动化测试用例对第二智能合约继续测试,直至代码覆盖率达到预期的代码覆盖率要求。
代码执行信息能够反映第二智能合约的运行代码在测试过程中的代码执行情况,因此本实施例可以根据代码执行信息对运行代码的测试过程进行分析,以得到第二智能合约的代码测试结果。
由此可知,本实施例的技术方案通过在待测试的第二智能合约所在的区块链测试环境中部署用于收集第二智能合约的代码执行信息的第二智能合约,基于同一区块链测试环境下不同的智能合约之间的交互,实现了第一智能合约对于第二智能合约在测试过程中的代码执行情况的收集,根据第二智能合约在测试过程中的代码执行情况,即可以分析得到第二智能合约的测试结果,解决了现有技术中无法针对智能合约进行测试的问题。
在一个示例性的智能合约测试场景中,在基于本实施例提供的方法对第二智能合约进行测试,并基于得到的测试结果进行第二智能合约的源代码的完善,得到智能合约部署的安全性要求的源代码版本之后,即可将符合安全性要求的源代码版本部署到实际的区块链应用环境中,由此能够保证区块链应用的安全性。
图5是基于图2所示实施例提出的另一种智能合约测试方法的流程图。如图5所示,在步骤S210之前,该方法还可以包括步骤S310至步骤S350,详细介绍如下:
步骤S310,对第二智能合约的源代码进行结构化处理,生成源代码对应的抽象语法树结构,抽象语法树结构中的节点用于表征源代码中的语法结构。
首先需要说明的是,本实施例提出的步骤S310至步骤S350揭示了第二智能合约的运行代码的生成过程,将生成的第二智能合约的运行代码部署到区块链上之后,即能够对第二智能合约进行测试。
第二智能合约的运行代码的生成过程可以如图6所示,其中,图6所示的插桩工具是一种运行在测试终端中的系统工具,其作用于生成第二智能合约的运行代码。下面将结合图6对第二智能合约的运行代码的生成过程进行详细描述。
对第二智能合约的源代码进行结构化处理,是将第二智能合约的源代码中含有的抽象语法结构进行树状表示的过程,因此抽象语法树结构即是对源代码的抽象语法结构的树状表示。如果将抽象语法树结构进行反解析处理,可以得到第二智能合约的源代码。
抽象语法结构树中的每个节点都表示第二智能合约的源代码中含有的一种语法结构,但并不会表示出真实语法的细节,例如源代码中的嵌套括号被隐含在抽象语法结构树的结构中,并不会以节点的形式展示抽象语法结构树中,因此说抽象语法结构树所展示的语法结构是抽象的。
对第二智能合约的源代码进行处理,可以是使用对应于第二智能合约的编程语言的AST(Abstract Syntax Code,抽象语法树)分析工具执行实现的,得到与第二智能合约的源代码对应的抽象语法树结构。如图6所示,AST分析工具可以配置在插桩工具中,当插桩工具解析第二智能合约的源代码后,使用AST分析工具对源代码进行结构化处理,则可以得到图6中示出的抽象语法树结构。
步骤S330,在抽象语法树结构中遍历锚点位置,并在遍历得到的锚点位置插入锚点函数。
其中,对抽象语法树结构的遍历是指在抽象语法树结构中深度遍历各个节点,锚点位置是指需要在抽象语法树中插入锚点函数的位置,例如,锚点位置可以是位于相邻的两个节点之间的位置。
如果将抽象语法树结构的各个节点进行反解析处理,可以依次得到源代码中含有的相应代码内容,因此可以将抽象语法树结构中的各个节点理解为是源代码中含有的各个代码块对应的抽象语法表示。在抽象语法树中插入锚点函数,则可以理解为是在源代码含有的代码块之间插入锚点函数,基于所插入的锚点函数,能够对源代码含有的不同的代码块进行区分。
示例性的,在抽象语法树结构中遍历锚点位置,并在遍历得到的锚点位置插入所述锚点函数,可以包括如下过程:
遍历抽象语法树结构中的各个节点,并基于各个节点对应的语法结构确定所述各个节点的节点类型;基于各个节点的节点类型,在抽象语法树结构中确定插入锚点函数的锚点位置;在确定得到的各个锚点位置插入锚点函数,并且在不同锚点位置插入的锚点函数中含有的锚点标识不同。
节点类型可以包括表达式语句类型、控制流语句类型等,若确定某个节点属于表达式语句类型,对该节点进行反解析得到的代码块则对应于源代码含有的表达式代码语句。同理,若确定某个节点属于控制流语句类型,对该节点进行反解析得到的代码块则对应于源代码含有的控制流代码语句,控制流代码语句例如是含有if、for、which、switch的代码语句。
在对抽象语法树结构的各个节点进行遍历的过程中,若确定节点的节点类型为表达式语句类型,先判定该节点之前是否存在有用于表示锚点位置的锚点桩,若不存在,则在该节点之前添加一个锚点桩,若已经存在锚点桩,则无需重复添加锚点桩,进入到后续节点的遍历过程。
若确定节点的节点类型为控制流语句类型,则直接确定需要在该节点处插入锚点函数,例如在对图6所示的抽象语法树结构进行遍历的过程中,确定“if分支语句”节点属于控制流语句类型,因此需要在该节点之前插入锚点函数。
基于插入的锚点函数,就结束了抽象语法树结构中上一个锚点位置的代码覆盖范围,例如上一个锚点位置的代码覆盖范围可以理解为是上一个锚点位置与当前锚点位置之间的代码范围。因此,通过在不同的代码位置插入锚点函数,能够将源代码区分为主要由多个代码块构成。
需要说明的是,在确定得到各个需要插入锚点函数的各个锚点位置后,在各个锚点位置插入的锚点函数中含有的锚点标识应当各不相同,以根据锚点标识区分在不同的锚点位置插入的锚点函数。
步骤S350,将插入了锚点位置的抽象语法树结构进行反解析处理,生成第二智能合约的运行代码,并将运行代码部署在区块链上。
在本实施例中,将插入了锚点位置的抽象语法树结构进行反解析处理的过程与前述的抽象语法树结构的反解析过程类似,都是基于抽象语法树结构进行代码内容还原的过程,但由于抽象语法树结构中插入了锚点函数,针对插入了锚点位置的抽象语法树结构进行反解析处理后,所得到的代码内容具体是在第二智能合约的源代码的代码内容插入锚点函数,从而生成第二智能合约的运行代码。
如图6所示,在对插入了锚点位置的抽象语法树结构进行反解析处理所得到的运行代码中,在不同代码位置插入有锚点函数,并且不同的锚点函数的锚点标识不同。
在生成第二智能合约的运行代码之后,将运行代码部署在区块链上,即可触发对第二智能合约进行测试,在测试过程中,运行代码通过执行其中插入的锚点函数调用第一智能合约,使得第一智能合约能够收集到第二智能合约在测试过程中的代码执行信息,通过对代码执行信息进行分析处理,能够得到第二智能合约的测试结果。
在另外的示例性实施例中,在图2所示方法的基础上,测试终端在步骤S210中向第一智能合约发起数据查询请求的方式,可以根据需要请求获取的代码执行信息所反映的测试次数确定。
例如在图7所示的实施例中,可以通过步骤S211和步骤S213向第一智能合约发起数据查询请求,详细介绍如下:
步骤S211,获取第二智能合约响应业务请求所得到的交易哈希值。
在本实施例中,是第二智能合约针对接收到的业务请求完成运行代码的测试之后,通过向第一智能合约发送数据查询请求,获取得到第二智能合约在此次测试过程中的代码执行信息。
交易哈希值是指第二智能合约执行业务请求对应的交易所得到执行结果,可以通过第二智能合约的特定接口获取得到。
步骤S213,将交易哈希值携带在所述数据查询请求中,向第一智能合约发送携带有交易哈希值的数据查询请求,以使第一智能合约返回第二智能合约针对业务请求进行响应的代码执行信息。
在第一智能合约中,可以基于交易哈希值对收集到的第二智能合约的代码执行信息进行关联存储,因此当第一智能合约接收携带有交易哈希值的数据查询请求之后,根据数据查询请求中携带的交易哈希值,从存储空间中查询该交易哈希值所关联的代码执行信息,并针对查询到的代码执行信息进行返回。
因此在本实施例中,测试终端可以逐次获取第二智能合约进行测试得到的代码执行信息。在需要对第二智能合约进行测试的场景中,例如在代码覆盖率获取场景中,测试终端可以根据多个交易哈希值,向第一智能合约请求获取第二智能合约针对多次业务请求进行响应的代码执行信息,然后通过对第二智能合约针对多次业务请求进行响应的代码执行信息进行分析,得到第二智能合约的代码覆盖率。
而在其它的一些实施例中,可以是在第二智能合约的运行代码完成多次测试之后,再向第一智能合约发送数据查询请求,以请求第一智能合约返回第二智能合约在多次测试中的代码执行信息。
例如在图8所示的实施例中,测试终端可以通过步骤S212和步骤S214向第一智能合约发起数据查询请求,详细介绍如下:
步骤S212,获取第二智能合约的合约地址。
第二智能合约的合约地址是指第二智能合约在区块链上创建的存储地址,该合约地址中存储有第二智能合约执行多次业务请求的响应所得到的统计信息,例如存储有针对每次业务请求进行交易执行所得到的交易哈希值。
智能合约的合约地址通常是公开的,因此测试终端能够获取到第二智能合约的合约地址。
步骤S214,将合约地址携带在数据查询请求中,向第一智能合约发送携带有合约地址的数据查询请求,以使第一智能合约返回第二智能合约针对多次业务请求进行响应的代码执行信息。
在获取到第二智能合约的合约地址后,测试终端将合约地址携带在数据查询请求中,向第一智能合约发送携带有合约地址的数据查询请求,以使第一智能合约返回第二智能合约针对多次业务请求进行响应的代码执行信息。
如前所述的,第一智能合约可以基于交易哈希值对收集到的第二智能合约的代码执行信息进行关联存储,当第一智能合约接收到携带有合约地址的数据查询请求之后,可以访问该合约地址,以得到该合约地址中存储的一个或多个交易哈希值,然后根据确定得到的各个交易哈希值,从自身的存储空间中查询各个交易哈希值所关联的代码执行信息,并针对查询到的所有代码执行信息进行返回。
因此在本实施例中,测试终端可以一次性获取得到第二智能合约进行多次测试得到的代码执行信息,在代码覆盖率获取场景中,采用此种方式获取代码执行信息能够提升第二智能合约的代码覆盖率的获取效率。
图9是基于图2所示实施例提出的另一种智能合约测试方法的流程图。如图9所示,步骤S250具体可以通过步骤S251和步骤S253实现,详细介绍如下:
步骤S251,根据代码执行信息,分别确定第二智能合约中未被锚点函数覆盖的第一代码信息、被已执行的锚点函数覆盖的第二代码信息、以及被未执行的锚点函数覆盖的第三代码信息。
在本实施例中,是将第二智能合约的代码覆盖率作为测试结果,因此本实施例需要根据步骤S230中获取得到的代码执行,对第二智能合约的运行代码的测试过程进行分析,以得到第二智能合约的代码覆盖率。
代码覆盖率是针对第二智能合约进行测试的测试完整性指标,用于描述第二智能合约中被测试的代码比例和程度,具体可以包括函数覆盖率、指令覆盖率、判断覆盖率、条件覆盖率等类型。因此在本实施例中,需要根据第二智能合约在测试过程中的代码执行信息来确定第二智能合约中的代码测试比例和程度的信息,由此得到第二智能合约的代码测试率。
还需要说明的是,本实施例提及的锚点函数覆盖的代码信息是指位于锚点函数的覆盖范围内的代码内容,而在插入有锚点函数的运行代码中,当前锚点函数的覆盖范围是指位于当前锚点函数与下一锚点函数之间的代码内容,例如在图6所示的第二智能合约的运行代码中,“锚点标识0”对应的锚点函数的覆盖范围是其与“锚点标识1”对应的锚点函数之间的代码内容,也即代码语句“if a<0then”。
第二智能合约中未被锚点函数覆盖的第一代码信息是指,在对第二智能合约的源代码插入锚点函数的过程中,可能存在一些特定关键字的代码位置不需要插入锚点函数,这部分代码内容即作为第二智能合约中未被锚点函数覆盖的第一代码信息。例如在图6所示的第二智能合约的运行代码中,代码语句“package智能合约名称”、“X<=0”、“Y<=0”均为未被锚点函数覆盖的第一代码信息。
在第二智能合约的运行代码的每次测试过程中,实际执行的是用于实现与业务请求相匹配的代码内容,因此并不是运行代码中的所有代码内容均被执行,也并不是运行代码中含有的所有锚点函数都被执行。由此,第二智能合约中的已执行的锚点函数是指在运行代码的测试过程中被执行了的锚点函数,第二智能合约中被已执行的锚点函数覆盖的第二代码信息是指这些被执行了的锚点函数所覆盖的代码内容。
同理,第二智能合约中被未执行的锚点函数覆盖的第三代码信息是指在运行代码的测试过程中,未被执行的锚点函数所覆盖的代码内容。
步骤S253,基于第一代码信息、第二代码信息和第三代码信息,计算第二智能合约的代码覆盖率。
由上述描述可知,若将第二智能合约中的第一代码信息、第二代码信息和第三代码信息汇总,可以得到第二智能合约的源代码含有的所有代码内容,并且可以得到源代码的所有代码内容的执行情况,例如可以得到源代码中的哪些代码内容被执行,哪些代码内容未被执行,哪些代码内容未被锚点函数覆盖而无法判定其执行情况,通过计算这些代码内容之间的比例关系,则可以得到针对第二智能合约进行测试的代码覆盖率。
在一些实施例中,可以通过如下过程确定第二智能合约中未被锚点函数覆盖的第一代码信息:
获取第二智能合约的运行代码中插入的全部锚点函数,提取全部锚点函数中含有的锚点标识;
根据全部的锚点标识与第二智能合约的源代码之间的映射关系,确定源代码中未被覆盖的代码内容,以得到第二智能合约中的第一代码信息。
在此实施例中,第二智能合约的运行代码中插入的全部锚点函数可以通过对比第二智能合约的运行代码和源代码得到。
锚点标识与第二智能合约的源代码之间的映射关系是指运行代码中含有的各个锚点函数对应的锚点标识分别与源代码位置建立有映射关系,源代码位置包括源代码的开始行、结束行、开始列、结束列等能够用于表示源代码中特定的代码位置的信息。举例来说,锚点标识与源代码之间的映射关系可以是“锚点标识A对应于源代码的开始行之后的第N行至第M行,其中M是大于N的正整数”,根据此映射关系则可以确定锚点标识A对应的锚点函数的覆盖范围。
由此,根据全部的锚点标识与第二智能合约的源代码之间的映射关系,可以确定源代码中被全部的锚点标识覆盖的代码内容集合,而源代码中除此代码内容集合之外的代码内容即为第二智能合约中未被锚点函数覆盖的第一代码信息。
需要说明的是,锚点标识与第二智能合约的源代码之间的映射关系可以是在向源代码中插入锚点函数的过程中构建的,或者是在完成全部的锚点函数插入之后构建的,本处不对此进行限制。
第二智能合约中被已执行的锚点函数覆盖的第二代码信息可以通过如下过程确定:
将代码执行信息整合为代码覆盖信息,代码覆盖信息包括运行代码中含有的代码块被执行的信息,运行代码中含有的各个代码块基于不同的锚点标识进行区分;
基于代码覆盖信息中含有的锚点标识,在运行代码中确定含有锚点标识的锚点函数;
根据锚点标识与第二智能合约的源代码之间的映射关系,从源代码中确定所锚点函数所覆盖的代码内容,以得到第二代码信息。
其中,由于获得的代码执行信息可以是第二智能合约针对多次业务请求进行响应的代码执行信息汇总,因此本处需要将第二智能合约响应不同的业务请求的代码执行信息进行统计和整合,以清晰地得到第二智能合约在针对多次业务请求进行响应的过程中合计执行了哪些代码块,这些代码块是指锚点标识对应的锚点函数所覆盖的所有代码内容。
示例性的,若代码执行信息中含有被执行的锚点函数的锚点标识,则可以根据第二智能合约针对多次业务请求进行响应的代码执行信息,确定每次代码执行信息中含有的各个锚点标识,然后将代码执行信息中含有的各个锚点标识汇总,并去除重复执行的锚点标识,也即相同的锚点标识仅保留一个,由此得到第二智能合约的代码覆盖信息。
可以看出,基于第二智能合约的代码覆盖信息中含有各个锚点标识,可以在运行代码中确定各个锚点标识所标识的锚点函数,根据锚点标识与第二智能合约的源代码之间的映射关系,即能够从基于第二智能合约的源代码中确定各个锚点标识所标识的锚点函数所覆盖的代码内容。由于这些锚点标识所标识的锚点函数均为测试过程中已经执行了的锚点函数,这些锚点函数所覆盖的代码内容也是已经执行了的代码内容,从而得到第二智能合约中被已执行的锚点函数覆盖的第二代码信息。
第二智能合约中被未执行的锚点函数覆盖的第三代码信息可以通过如下过程确定:
对比第二智能合约的运行代码和源代码,得到运行代码中插入的全部锚点函数,并提取全部锚点函数中含有的锚点标识;
基于代码执行信息确定已被执行的锚点函数的锚点标识,以及确定运行代码中未被执行的锚点函数的锚点标识;
根据未被执行的锚点函数的锚点标识与源代码之间的映射关系,从源代码中确定被未执行的锚点函数所覆盖的第三代码信息。
需要说明的是,获取第二智能合约中的第三代码信息的过程与获取第二智能合约中的第二代码信息的过程是类似的,区别在于,第二智能合约中的第三代码信息是根据运行代码中未被执行的锚点函数的锚点标识获取得到的,详细的获取过程可以参见前述的第二智能合约中的第三代码信息的获取过程,本处不进行赘述。
由此可知,本实施例提供的方法可以得到第二智能合约的代码覆盖率,根据所得到的代码覆盖率,可以对当前针对第二智能合约进行测试的完整性进行验证,如果代码覆盖率未达到预期的要求,则需要继续对第二智能合约进行测试,直至代码覆盖率达到预测要求。因此基于本实施例提供的方法,提供了针对智能合约进行代码覆盖率测试的一种可行方式。
在其它的一些实施例中,还可以对第二智能合约的代码覆盖率进行可视化处理,得到可视化的代码覆盖率测试报告,例如可以将代码覆盖率测试报告显示在测试终端的显示界面上,使得测试人员通过查看代码覆盖率测试报告获知第二智能合约的测试情况,并根据获知的测试情况有针对性的制定第二智能合约的源代码完善思路,以得到安全性较高的源代码版本。通过将完善得到的源代码部署在实际的区块链应用环境中,能够确保区块链应用的安全性。
图10是根据一示例性实施例示出的一种智能合约测试装置的框图。该装置可以配置在图1所示实施环境中的测试终端200上,以使测试终端200能够获得部署在区块链服务端100上的第二智能合约103的测试结果。
如图10所示,在一示例性实施例中,该智能合约测试装置包括:
数据查询模块410,配置为向部署在区块链上的第一智能合约发起数据查询请求,数据查询请求用于指示第一智能合约返回第二智能合约的代码执行信息,第二智能合约部署在所述区块链上;
数据获取模块430,配置为接收第一智能合约返回的所述第二智能合约的代码执行信息,第二智能合约的运行代码中含有用于调用第一智能合约的锚点函数,代码执行信息是第一智能合约基于锚点函数在运行代码的测试过程中的执行获取得到的;
数据分析模块450,配置为根据代码执行信息对运行代码的测试过程进行分析,得第二智能合约的代码测试结果。
本实施例提供的智能合约测试装置基于同一区块链测试环境下不同的智能合约之间的交互,实现了第一智能合约对于第二智能合约在测试过程中的代码执行情况的收集,根据第二智能合约在测试过程中的代码执行情况,即可以分析得到第二智能合约的测试结果,解决了现有技术中无法针对智能合约进行测试的问题。
在另一示例性实施例中,该装置还包括业务请求模块,该业务请求模块被配置为向所述第二智能合约发起业务请求,所述业务请求用于触发所述第二智能合约执行所述运行代码的测试过程,在所述测试过程中,所述第二智能合约基于被执行的锚点函数调用所述第一智能合约,所述第一智能合约在接收到所述第二智能合约的调用后,根据所述被执行的锚点函数在所述运行代码中的位置信息,得到所述第二智能合约的代码执行信息。
在另一示例性实施例中,数据查询模块410包括:
交易信息获取单元,配置为获取第二智能合约响应业务请求所得到的交易哈希值;
第一请求单元,配置为将交易哈希值携带在数据查询请求中,向第一智能合约发送携带有交易哈希值的数据查询请求,以使第一智能合约返回第二智能合约针对业务请求进行响应的代码执行信息。
在另一示例性实施例中,数据查询模块410包括:
合约地址获取单元,配置为获取第二智能合约的合约地址;
第二请求单元,配置为将合约地址携带在数据查询请求中,向第一智能合约发送携带有合约地址的数据查询请求,以使第一智能合约返回第二智能合约针对多次业务请求进行响应的代码执行信息。
在另一示例性实施例中,该装置还包括:
结构化处理模块,配置为对第二智能合约的源代码进行结构化处理,生成源代码对应的抽象语法树结构,抽象语法树结构中的节点用于表征源代码中的语法结构;
锚点遍历模块,配置为在抽象语法树结构中遍历锚点位置,并在遍历得到的锚点位置插入锚点函数;
运行代码生成模块,将插入了锚点位置的抽象语法树结构进行反解析处理,生成第二智能合约的运行代码,并将运行代码部署在区块链上。
在另一示例性实施例中,锚点遍历模块包括:
节点类型确定单元,配置为遍历抽象语法树结构中的各个节点,并基于各个节点对应的语法结构确定各个节点的节点类型;
锚点位置确定单元,基于各个节点的节点类型,在抽象语法树结构中确定插入锚点函数的锚点位置;
锚点函数插入单元,在确定得到的各个锚点位置插入锚点函数,并且在不同锚点位置插入的锚点函数中含有的锚点标识不同。
在另一示例性实施例中,锚点位置确定单元包括控制流语句应对子单元,控制流语句应对子单元配置为在确定节点的节点类型为控制流语句类型的情况下,确定需要在节点处插入锚点函数,以基于插入的锚点函数结束抽象语法树结构中上一个锚点位置的代码覆盖范围。
在另一示例性实施例中,数据分析模块450包括:
代码信息确定单元,配置为根据代码执行信息,分别确定第二智能合约中未被锚点函数覆盖的第一代码信息、被已执行的锚点函数覆盖的第二代码信息、以及被未执行的锚点函数覆盖的第三代码信息;
代码覆盖率获取单元,配置为基于第一代码信息、第二代码信息和第三代码信息,计算第二智能合约的代码覆盖率。
在另一示例性实施例中,代码信息确定单元包括第一信息确定子单元,第一信息确定子单元配置为获取运行代码中插入的全部锚点函数,并提取全部锚点函数中含有的锚点标识,然后根据全部的锚点标识与第二智能合约的源代码之间的映射关系,确定源代码中未被覆盖的代码内容,得到第一代码信息。
在另一示例性实施例中,代码信息确定单元包括第二信息确定子单元,第二信息确定子单元配置为将代码执行信息整合为代码覆盖信息,代码覆盖信息包括运行代码中含有的代码块被执行的信息,运行代码中含有的各个代码块基于不同的锚点标识进行区分,然后基于代码覆盖信息中含有的锚点标识,在运行代码中确定含有锚点标识的锚点函数,最后根据锚点标识与第二智能合约的源代码之间的映射关系,从源代码中确定锚点函数所覆盖的代码内容,以得到第二代码信息。
在另一示例性实施例中,代码信息确定单元包括第三信息确定子单元,第三信息确定子单元配置为对比运行代码和第二智能合约的源代码,得到运行代码中插入的全部锚点函数,并提取全部锚点函数中含有的锚点标识,然后基于代码执行信息确定已被执行的锚点函数的锚点标识,以及确定运行代码中未被执行的锚点函数的锚点标识,最后根据未被执行的锚点函数的锚点标识与源代码之间的映射关系,从源代码中确定被未执行的锚点函数所覆盖的第三代码信息。
在另一示例性实施例中,数据分析模块450还包括可视化处理单元,可视化处理单元配置为对第二智能合约的代码覆盖率进行可视化处理,得到可视化的代码覆盖率测试报告。
需要说明的是,上述实施例所提供的装置与上述实施例所提供的方法属于同一构思,其中各个模块和单元执行操作的具体方式已经在方法实施例中进行了详细描述,此处不再赘述。
本申请的实施例还提供了一种电子设备,包括处理器和存储器,其中,存储器上存储有计算机可读指令,该计算机可读指令被处理器执行时实现如前所述的智能合约测试方法。
图11是根据一示例性实施例示出的一种电子设备的结构示意图。
需要说明的是,该电子设备只是一个适配于本申请的示例,不能认为是提供了对本申请的使用范围的任何限制。该电子设备也不能解释为需要依赖于或者必须具有图11中示出的示例性的电子设备中的一个或者多个组件。
如图11所示,在一示例性实施例中,电子设备包括处理组件801、存储器802、电源组件803、多媒体组件804、音频组件805、传感器组件807和通信组件808。其中,上述组件并不全是必须的,电子设备可以根据自身功能需求增加其他组件或减少某些组件,本实施例不作限定。
处理组件801通常控制电子设备的整体操作,诸如与显示、数据通信以及日志数据处理相关联的操作等。处理组件801可以包括一个或多个处理器809来执行指令,以完成上述操作的全部或部分步骤。此外,处理组件801可以包括一个或多个模块,便于处理组件801和其他组件之间的交互。例如,处理组件801可以包括多媒体模块,以方便多媒体组件804和处理组件801之间的交互。
存储器802被配置为存储各种类型的数据以支持在电子设备的操作,这些数据的示例包括用于在电子设备上操作的任何应用程序或方法的指令。存储器802中存储有一个或多个模块,该一个或多个模块被配置成由该一个或多个处理器809执行,以完成上述实施例中所描述的智能合约测试方法中的全部或者部分步骤。
电源组件803为电子设备的各种组件提供电力。电源组件803可以包括电源管理系统,一个或多个电源,及其他与为电子设备生成、管理和分配电力相关联的组件。
多媒体组件804包括在电子设备和用户之间的提供一个输出接口的屏幕。在一些实施例中,屏幕可以包括TP(Touch Panel,触摸面板)和LCD(Liquid Crystal Display,液晶显示器)。如果屏幕包括触摸面板,屏幕可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。所述触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与所述触摸或滑动操作相关的持续时间和压力。
音频组件805被配置为输出和/或输入音频信号。例如,音频组件805包括一个麦克风,当电子设备处于操作模式,如呼叫模式、记录模式和语音识别模式时,麦克风被配置为接收外部音频信号。在一些实施例中,音频组件805还包括一个扬声器,用于输出音频信号。
传感器组件807包括一个或多个传感器,用于为电子设备提供各个方面的状态评估。例如,传感器组件807可以检测到电子设备的打开/关闭状态,还可以检测电子设备的温度变化。
通信组件808被配置为便于电子设备和其他设备之间有线或无线方式的通信。电子设备可以接入基于通信标准的无线网络,例如Wi-Fi(Wireless-Fidelity,无线网络)。
可以理解,图11所示的结构仅为示意,电子设备该可以包括比图11中所示更多或更少的组件,或者具有与图11所示不同的组件。图11中所示的各组件均可以采用硬件、软件或者其组合来实现。
本申请的另一方面还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如前所述的智能合约测试方法。该计算机可读存储介质可以是上述实施例中描述的电子设备中所包含的,也可以是单独存在,而未装配入该电子设备中。
本申请的另一方面还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各个实施例中提供的智能合约测试方法。
上述内容,仅为本申请的较佳示例性实施例,并非用于限制本申请的实施方案,本领域普通技术人员根据本申请的主要构思和精神,可以十分方便地进行相应的变通或修改,故本申请的保护范围应以权利要求书所要求的保护范围为准。
Claims (15)
1.一种智能合约测试方法,其特征在于,包括:
向部署在区块链上的第一智能合约发起数据查询请求,所述数据查询请求用于指示所述第一智能合约返回第二智能合约的代码执行信息,所述第二智能合约部署在所述区块链上;
接收所述第一智能合约返回的所述第二智能合约的代码执行信息,所述第二智能合约的运行代码中含有用于调用所述第一智能合约的锚点函数,所述代码执行信息是所述第一智能合约基于所述锚点函数在所述运行代码的测试过程中的执行获取得到的;
根据所述代码执行信息对所述运行代码的测试过程进行分析,得到所述第二智能合约的代码测试结果。
2.根据权利要求1所述的方法,其特征在于,在向部署在区块链上的第一智能合约发起数据查询请求之前,所述方法还包括:
向所述第二智能合约发起业务请求,所述业务请求用于触发所述第二智能合约执行所述运行代码的测试过程,在所述测试过程中,所述第二智能合约基于被执行的锚点函数调用所述第一智能合约,所述第一智能合约在接收到所述第二智能合约的调用后,根据所述被执行的锚点函数在所述运行代码中的位置信息,得到所述第二智能合约的代码执行信息。
3.根据权利要求2所述的方法,其特征在于,向部署在区块链上的第一智能合约发起数据查询请求,包括:
获取所述第二智能合约响应所述业务请求所得到的交易哈希值;
将所述交易哈希值携带在所述数据查询请求中,向所述第一智能合约发送携带有所述交易哈希值的数据查询请求,以使所述第一智能合约返回所述第二智能合约针对所述业务请求进行响应的代码执行信息。
4.根据权利要求2所述的方法,其特征在于,向部署在区块链上的第一智能合约发起数据查询请求,包括:
获取所述第二智能合约的合约地址;
将所述合约地址携带在所述数据查询请求中,向所述第一智能合约发送携带有所述合约地址的数据查询请求,以使第一智能合约返回所述第二智能合约针对多次业务请求进行响应的代码执行信息。
5.根据权利要求1所述的方法,其特征在于,在向部署在区块链上的第一智能合约发起数据查询请求之前,所述方法还包括:
对所述第二智能合约的源代码进行结构化处理,生成所述源代码对应的抽象语法树结构,所述抽象语法树结构中的节点用于表征所述源代码中的语法结构;
在所述抽象语法树结构中遍历锚点位置,并在遍历得到的锚点位置插入所述锚点函数;
将插入了所述锚点位置的抽象语法树结构进行反解析处理,生成所述第二智能合约的运行代码,并将所述运行代码部署在所述区块链上。
6.根据权利要求5所述的方法,其特征在于,在所述抽象语法树结构中遍历锚点位置,并在遍历得到的锚点位置插入所述锚点函数,包括:
遍历所述抽象语法树结构中的各个节点,并基于所述各个节点对应的语法结构确定所述各个节点的节点类型;
基于所述各个节点的节点类型,在所述抽象语法树结构中确定插入所述锚点函数的锚点位置;
在确定得到的各个锚点位置插入锚点函数,并且在不同锚点位置插入的锚点函数中含有的锚点标识不同。
7.根据权利要求6所述的方法,其特征在于,所述节点类型包括控制流语句类型;基于所述各个节点的节点类型,在所述抽象语法树结构中确定插入所述锚点函数的锚点位置,包括:
若确定节点的节点类型为所述控制流语句类型,则确定需要在所述节点处插入所述锚点函数,以基于插入的所述锚点函数结束所述抽象语法树结构中上一个锚点位置的代码覆盖范围。
8.根据权利要求1所述的方法,其特征在于,所述代码测试结果包括代码覆盖率;根据所述代码执行信息对所述运行代码的测试过程进行分析,得到所述第二智能合约的代码测试结果,包括:
根据所述代码执行信息,分别确定所述第二智能合约中未被锚点函数覆盖的第一代码信息、被已执行的锚点函数覆盖的第二代码信息、以及被未执行的锚点函数覆盖的第三代码信息;
基于所述第一代码信息、所述第二代码信息和所述第三代码信息,计算所述第二智能合约的代码覆盖率。
9.根据权利要求8所述的方法,其特征在于,确定第二智能合约中被已执行的锚点函数覆盖的第二代码信息,包括:
将所述代码执行信息整合为代码覆盖信息,所述代码覆盖信息包括所述运行代码中含有的代码块被执行的信息,所述运行代码中含有的各个代码块基于不同的锚点标识进行区分;
基于所述代码覆盖信息中含有的锚点标识,在所述运行代码中确定含有所述锚点标识的锚点函数;
根据所述锚点标识与所述第二智能合约的源代码之间的映射关系,从所述源代码中确定所述锚点函数所覆盖的代码内容,以得到所述第二代码信息。
10.根据权利要求8所述的方法,其特征在于,确定第二智能合约中被未执行的锚点函数覆盖的第三代码信息,包括:
对比所述运行代码和所述第二智能合约的源代码,得到所述运行代码中插入的全部锚点函数,并提取所述全部锚点函数中含有的锚点标识;
基于所述代码执行信息确定已被执行的锚点函数的锚点标识,以及确定所述运行代码中未被执行的锚点函数的锚点标识;
根据所述未被执行的锚点函数的锚点标识与所述源代码之间的映射关系,从所述源代码中确定所述被未执行的锚点函数所覆盖的第三代码信息。
11.根据权利要求8所述的方法,其特征在于,确定所述第二智能合约中未被锚点函数覆盖的第一代码信息,包括:
获取所述运行代码中插入的全部锚点函数,并提取所述全部锚点函数中含有的锚点标识;
根据全部的锚点标识与所述第二智能合约的源代码之间的映射关系,确定所述源代码中未被覆盖的代码内容,得到所述第一代码信息。
12.根据权利要求8所述的方法,其特征在于,所述方法还包括:
对所述第二智能合约的代码覆盖率进行可视化处理,得到可视化的代码覆盖率测试报告。
13.一种智能合约测试装置,其特征在于,包括:
数据查询模块,配置为向部署在区块链上的第一智能合约发起数据查询请求,所述数据查询请求用于指示所述第一智能合约返回第二智能合约的代码执行信息,所述第二智能合约部署在所述区块链上;
数据获取模块,配置为接收所述第一智能合约返回的所述第二智能合约的代码执行信息,所述第二智能合约的运行代码中含有用于调用所述第一智能合约的锚点函数,所述代码执行信息是所述第一智能合约基于所述锚点函数在所述运行代码的测试过程中的执行获取得到的;
数据分析模块,配置为根据所述代码执行信息对所述运行代码的测试过程进行分析,得到所述第二智能合约的代码测试结果。
14.一种电子设备,其特征在于,包括:
存储器,存储有计算机可读指令;
处理器,读取存储器存储的计算机可读指令,以执行权利要求1-12中的任一项所述的方法。
15.一种计算机可读存储介质,其特征在于,其上存储有计算机可读指令,当所述计算机可读指令被计算机的处理器执行时,使计算机执行权利要求1-12中的任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010972336.XA CN113010409B (zh) | 2020-09-16 | 2020-09-16 | 智能合约测试方法及装置、电子设备、存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010972336.XA CN113010409B (zh) | 2020-09-16 | 2020-09-16 | 智能合约测试方法及装置、电子设备、存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113010409A true CN113010409A (zh) | 2021-06-22 |
CN113010409B CN113010409B (zh) | 2023-09-15 |
Family
ID=76383321
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010972336.XA Active CN113010409B (zh) | 2020-09-16 | 2020-09-16 | 智能合约测试方法及装置、电子设备、存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113010409B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109033405A (zh) * | 2018-08-03 | 2018-12-18 | 华为技术有限公司 | 维护区块链的方法和装置、服务器和计算机可读存储介质 |
CN109145189A (zh) * | 2018-08-22 | 2019-01-04 | 杭州微链区块链科技有限公司 | 一种基于区块链的数据存入和搜索系统及其方法 |
US20190325436A1 (en) * | 2019-02-28 | 2019-10-24 | Alibaba Group Holding Limited | System and method for blockchain-based authentication |
CN110413316A (zh) * | 2019-07-31 | 2019-11-05 | 中国工商银行股份有限公司 | 面向区块链智能合约的非侵入式测试系统及方法 |
WO2020062673A1 (zh) * | 2018-09-26 | 2020-04-02 | 深圳壹账通智能科技有限公司 | 智能合约的测试方法、存储介质、测试终端及测试装置 |
CN111090581A (zh) * | 2019-11-22 | 2020-05-01 | 腾讯科技(深圳)有限公司 | 智能合约测试方法、装置、计算机设备和存储介质 |
CN111290958A (zh) * | 2020-02-20 | 2020-06-16 | 联动优势(北京)数字科技有限公司 | 一种调试智能合约的方法及装置 |
CN111563040A (zh) * | 2020-05-08 | 2020-08-21 | 中国工商银行股份有限公司 | 区块链智能合约代码测试方法及装置 |
-
2020
- 2020-09-16 CN CN202010972336.XA patent/CN113010409B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109033405A (zh) * | 2018-08-03 | 2018-12-18 | 华为技术有限公司 | 维护区块链的方法和装置、服务器和计算机可读存储介质 |
CN109145189A (zh) * | 2018-08-22 | 2019-01-04 | 杭州微链区块链科技有限公司 | 一种基于区块链的数据存入和搜索系统及其方法 |
WO2020062673A1 (zh) * | 2018-09-26 | 2020-04-02 | 深圳壹账通智能科技有限公司 | 智能合约的测试方法、存储介质、测试终端及测试装置 |
US20190325436A1 (en) * | 2019-02-28 | 2019-10-24 | Alibaba Group Holding Limited | System and method for blockchain-based authentication |
CN110413316A (zh) * | 2019-07-31 | 2019-11-05 | 中国工商银行股份有限公司 | 面向区块链智能合约的非侵入式测试系统及方法 |
CN111090581A (zh) * | 2019-11-22 | 2020-05-01 | 腾讯科技(深圳)有限公司 | 智能合约测试方法、装置、计算机设备和存储介质 |
CN111290958A (zh) * | 2020-02-20 | 2020-06-16 | 联动优势(北京)数字科技有限公司 | 一种调试智能合约的方法及装置 |
CN111563040A (zh) * | 2020-05-08 | 2020-08-21 | 中国工商银行股份有限公司 | 区块链智能合约代码测试方法及装置 |
Non-Patent Citations (2)
Title |
---|
古涛铭: "面向智能合约的安全检测系统研究与设计", 《中国优秀博硕士学位论文全文数据库(硕士)工程科技Ⅱ辑》 * |
许雄: "区块链智能合约技术的研究", 《中国优秀博硕士学位论文全文数据库(硕士)工程科技Ⅱ辑》 * |
Also Published As
Publication number | Publication date |
---|---|
CN113010409B (zh) | 2023-09-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107861870B (zh) | 接口测试及测试数据生成方法、装置、终端和存储介质 | |
KR20080068385A (ko) | 소프트웨어 테스트 시스템, 방법 및 그 방법을 실행하기위한 프로그램이 기록된 컴퓨터로 읽을 수 있는 기록매체 | |
US7996818B1 (en) | Method for testing using client specified references | |
CN109885496B (zh) | 测试日志管理方法及系统 | |
CN108459850B (zh) | 生成测试脚本的方法、装置及系统 | |
CN110569159A (zh) | 挡板生成方法、装置、设备及计算机存储介质 | |
CN106557308A (zh) | 一种软件持续集成方法及装置 | |
KR20150030297A (ko) | 애플리케이션 자동 검증을 위한 검증장치, 단말장치, 시스템, 방법 및 컴퓨터로 판독 가능한 기록 매체 | |
CN111221721A (zh) | 一种单元测试案例自动化录制和执行方法及装置 | |
CN112948262A (zh) | 一种系统测试方法、装置、计算机设备和存储介质 | |
CN112433936A (zh) | 测试方法、装置及存储介质 | |
CN116974874A (zh) | 数据库的测试方法、装置、电子设备及可读存储介质 | |
WO2016048294A1 (en) | Infrastructure rule generation | |
CN113010409B (zh) | 智能合约测试方法及装置、电子设备、存储介质 | |
CN115022201B (zh) | 一种数据处理功能测试方法、装置、设备及存储介质 | |
CN116610326A (zh) | 区块链智能合约的安全性检测方法、设备及存储介质 | |
CN116955148A (zh) | 业务系统测试方法、装置、设备、存储介质及产品 | |
CN111666201A (zh) | 回归测试方法、装置、介质及电子设备 | |
CN112379967B (zh) | 模拟器检测方法、装置、设备及介质 | |
CN112131127B (zh) | 接口测试方法、装置、系统及电子设备 | |
CN112799956B (zh) | 资产识别能力测试方法、装置及系统装置 | |
CN116450533B (zh) | 用于应用程序的安全检测方法、装置、电子设备和介质 | |
CN117332412B (zh) | 一种针对数据安全系统的检测方法、装置及电子设备 | |
CN115292178A (zh) | 测试数据搜索方法、装置、存储介质以及终端 | |
CN114398279A (zh) | 应用程序测试方法、装置、设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40048276 Country of ref document: HK |
|
GR01 | Patent grant | ||
GR01 | Patent grant |