本发明属于区块链技术领域,尤其涉及一种智能合约的测试方法、计算机可读存储介质及测试终端。
背景技术:
智能合约(smartcontract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议,其允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。目前,在区块链结构下,智能合约需要运行在隔离的沙箱中,例如,超级账本(hyperledger)的智能合约需要运行在docker容器中。
由于业务场景的复杂多样性,智能合约需满足图灵完备性,因此其可能存在异常复杂的业务逻辑,为了确保智能合约的质量,对发布的智能合约进行测试是必不可少的环节。目前对智能合约进行测试的过程一般为:首先部署区块链网络和智能合约,并在docker环境中运行智能合约,通过查看智能合约的日志来分析问题并进行代码修改。
然而,一方面,智能合约的日志可能存在丢失的情形,并且由于运行过程中的中间数据一般都采用了加密方式以随机数的形式呈现,因此无法通过查看日志的方式判断中间数据的正确性;另一方面,若检测到智能合约存在的问题,在进行相应的代码修改之后,还需要重新进行区块链网络和智能合约的部署以验证问题是否被解决。可见,现有技术中智能合约的测试过程步骤繁琐、效率低下。
技术实现要素:
有鉴于此,本发明提供了一种智能合约的测试方法、计算机可读存储介质及测试终端,以解决现有技术中智能合约的测试过程步骤繁琐、效率低下的问题。
本发明实施例的第一方面提供了一种智能合约的测试方法,可以包括:
将待测试的智能合约加载至离线测试环境,其中,所述离线测试环境为对所述智能合约实际运行的区块链环境进行模拟而得到的运行环境;
对所述智能合约进行编译,获得可执行文件;
执行所述可执行文件,生成所述智能合约的服务;
调用所述服务,并提供触发数据以触发所述智能合约在所述离线测试环境中运行;
对在所述离线测试环境中运行的所述智能合约进行测试。
基于本发明实施例的第一方面,在第一种可能的实现方式中,在将待测试的智能合约加载至离线测试环境之前,可以包括:
搭建所述离线测试环境。
基于本发明实施例的第一方面,在第二种可能的实现方式中,所述搭建所述离线测试环境可以包括:
配置所述智能合约运行所需的应用程序编程接口,其中,所述应用程序编程接口包括数据写入接口、数据查询接口和范围查询接口;
配置所述智能合约运行所需的全局账本状态;
配置所述智能合约运行所需的区块数据。
基于本发明实施例的第一方面,在第三种可能的实现方式中,所述配置所述智能合约运行所需的全局账本状态可以包括:
获取所述区块链环境中的全局账本状态数据;
创建本地键值对数据库,并在所述本地键值对数据库中存储获取的所述全局账本状态数据。
基于本发明实施例的第一方面,在第四种可能的实现方式中,所述配置所述智能合约运行所需的区块数据可以包括:
确定所述智能合约在所述区块链环境运行时所涉及的目标区块;
生成与所述目标区块对应的模拟区块,其中,所述模拟区块的数据以键值对的形式存储于所述离线测试环境。
基于本发明实施例的第一方面,在第五种可能的实现方式中,在对所述智能合约进行编译,获得可执行文件之前可以包括:
获取所述智能合约的业务逻辑;
基于与所述业务逻辑对应的测试实例,对所述全局账本状态进行初始化。
基于本发明实施例的第一方面,在第六种可能的实现方式中,可以包括:
当所述智能合约在所述离线测试环境中运行时,若所述模拟区块中的数据被调用,则将被调用的数据转换为目标格式以供所述智能合约调用,其中,所述目标格式为所述区块链环境中的区块的数据格式。
基于本发明实施例的第一方面,在第六种可能的实现方式中,所述对在所述离线测试环境中运行的所述智能合约进行测试可以包括:
当所述智能合约在所述离线测试环境中运行时,在指定的断点中断所述智能合约的运行,并输出所述智能合约的当前运行状态信息。
本发明实施例的第二方面提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可读指令,所述计算机可读指令被处理器执行时实现如上述本发明的第一方面及第一方面任一种可能的实现方式中的智能合约的测试方法的步骤。
本发明实施例的第三方面提供了一种测试终端,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机可读指令,所述处理器执行所述计算机可读指令时实现如上述本发明的第一方面及第一方面任一种可能的实现方式中的智能合约的测试方法的步骤。
本发明与现有技术相比存在的有益效果是:
本发明通过将待测试的智能合约加载至离线测试环境,并在该离线测试环境中对智能合约进行编译、执行、运行以及调试,解决了现有技术中智能合约的测试过程步骤繁琐、效率低下的问题。也即,一方面,由于该离线测试环境为对智能合约实际运行的区块链环境进行模拟而得到的运行环境,智能合约在该离线测试环境中运行时可以与其在真实区块链环境中运行时表现出一致的行为逻辑,故能够保障智能合约测试的有效性。另一方面,通过在该离线测试环境中运行智能合约,可以使智能合约脱离真实区块链环境而运行,避免了现有技术中对智能合约进行测试时,每次运行智能合约均需要重新部署区块链网络和发布智能合约的繁琐步骤,从而简化了智能合约的测试过程,有利于提高智能合约的开发效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
图1为本发明实施例中一种智能合约的测试方法的一个实施例流程图;
图2为本发明实施例中一种智能合约的测试方法的另一个实施例流程图;
图3为图2所示实施例中步骤s201的一个实施例流程图;
图4为本发明实施例中一种智能合约的测试装置的一个实施例结构图;
图5为本发明实施例中一种测试终端的示意框图。
具体实施方式
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
请参阅图1,本发明实施例中一种智能合约的测试方法的一个实施例可以包括:
在步骤s101中、将待测试的智能合约加载至离线测试环境。
在本发明实施例中,离线测试环境为对智能合约实际运行的区块链环境进行模拟而得到的运行环境。
在本发明实施例中,智能合约实际运行的区块链环境是指智能合约发布之后实际运行的真实区块链环境,在下文中也称为真实区块链环境。另外,本发明实施例中的区块链是以超级账本(hyperledger)为例进行说明的。
在本发明实施例中,离线测试环境可以提供与真实区块链环境一致的外部依赖数据、一致的底层接口、以及一致的触发数据,使得智能合约在该离线测试环境中运行时能够与其在真实区块链环境中运行时表现出一致的行为逻辑。
在步骤s102中、对所述智能合约进行编译,获得可执行文件。
在本发明实施例中,通过在离线测试环境中对智能合约的源代码进行编译,可以生成可执行文件。具体的,智能合约的源代码在离线测试环境中存放于类库单元(package,也可称为包)中,通过对相应的类库单元中的智能合约的源代码执行编译,得到一个可执行文件。该可执行文件在执行之后可生成用于触发智能合约运行的服务(server)。
在一种实现方式中,可以将多个智能合约加载至离线测试环境中,并分别存放于不同的类库单元中,然后通过共同执行编译,生成服务。再通过应用程序提供不同的触发数据,来触发该服务调用和运行与相应的触发数据对应的智能合约。
在本发明实施例中,智能合约的源代码以及离线测试环境均可以通过golang语言来进行编写实现。
在步骤s103中、执行所述可执行文件,生成所述智能合约的服务。
在本发明实施例中,执行上述步骤s102中编译得到的可执行文件,可以得到用于触发智能合约运行的服务(server)。该服务运行于离线测试环境的后台,等待被触发和调用。
在本发明实施例中,智能合约的触发和调用可以由应用程序来完成,离线测试环境提供了与真实区块链环境一致的访问接口,例如,该访问接口可以为restful接口。由此,使得应用程序可以如访问真实区块链网络一样访问该离线测试环境,从而可以调用该服务并提供触发数据以触发智能合约在该离线测试环境中运行。
在步骤s104中、调用所述服务,并提供触发数据以触发所述智能合约在所述离线测试环境中运行。
在本发明实施例中,通过调用离线测试环境中与智能合约关联的服务,并提供触发数据,可以触发对应的智能合约在该离线测试环境中运行。所提供的触发数据需要与智能合约在真实区块链环境中运行时的触发数据保持一致,在实际应用时,可以通过应用程序来调用相应的服务并提供触发数据。例如,该应用程序可以是一个交易程序,通过交易程序提供触发数据触发智能合约运行以执行交易程序所指示的交易。
智能合约被触发并运行之后,可以读取离线测试环境中的区块数据,以及向离线测试环境中的区块中写入新的数据(区块更新),智能合约被触发运行之后进行的行为与其在真实区块链环境中表现的行为一致。
在步骤s105中、对在所述离线测试环境中运行的所述智能合约进行测试。
在本发明实施例中,智能合约运行于离线测试环境,在该离线测试环境中,可以随时查看智能合约的运行状态,并且,还可以使用gdb调试工具方便的直接进行智能合约的代码的调试。
可选的,上述步骤s105可以包括:
在指定的断点中断所述智能合约的运行,并输出所述智能合约的当前运行状态信息。
本发明实施例中,在离线测试环境中运行的智能合约,可以随时指定断点,并在该断点中断智能合约的运行,例如,当测试人员需要查看某智能合约运行时某个时间点的状态时,可以通过设置断点中断智能合约的运行,同时,离线测试环境可以输出智能合约中断时的运行状态,以供开发人员使用。
需要说明的是,在真实区块链环境中,智能合约是依托于区块链网络的一个节点(peer)运行在复杂的docker环境中,若在真实区块环境中直接进行测试的实现难度很大,需要专门的人员进行区块链网络的部署和智能合约的发布,该过程是非常复杂的。并且,由于区块链网络是一个分布式的网络,意味着同一份智能合约,会运行在多个peer上,如果在其中某个peer进行在线调试,有可能会打乱整个区块链网络的数据流。
本发明实施例中,所提供的离线测试环境是脱离了真实区块链环境的运行环境,既能够支持智能合约的运行,也不影响真实区块链网络,故可以支持随时中断智能合约的运行,也可以支持随时进行智能合约的代码的调试,从而大大方便了开发人员进行智能合约的开发和测试。
综上所述,本发明通过将待测试的智能合约加载至离线测试环境,并在该离线测试环境中对智能合约进行编译、执行、运行以及调试,解决了现有技术中智能合约的测试过程步骤繁琐、效率低下的问题。也即,一方面,由于该离线测试环境为对智能合约实际运行的区块链环境进行模拟而得到的运行环境,智能合约在该离线测试环境中运行时可以与其在真实区块链环境中运行时表现出一致的行为逻辑,故能够保障智能合约测试的有效性。另一方面,通过在该离线测试环境中运行智能合约,可以使智能合约脱离真实区块链环境而运行,避免了现有技术中对智能合约进行测试时,每次运行智能合约均需要重新部署区块链网络和发布智能合约的繁琐步骤,从而简化了智能合约的测试过程,有利于提高智能合约的开发效率。
请参阅图2,本发明实施例中一种智能合约的测试方法的另一个实施例可以包括:
步骤s201、搭建离线测试环境。
本发明实施例中,在进行智能合约的测试之前,首先需要搭建离线测试环境。通过分析和分解智能合约实际运行的区块链环境,确定真实区块链环境支持智能合约运行的基本框架,从而模拟这些基本框架的功能,搭建可以支持智能合约运行的离线测试环境。
具体的,支持智能合约运行的基本框架可以包括:
第一,底层区块链的应用程序编程接口api,所述api包括invoke(数据写入)、query(数据查询)、rangequery(范围查询)等基本接口。
第二,区块链网络中的区块(block),在真实区块链网络中,block块之间以链表的形式连接,包含了该区块链网络上发生的所有的历史数据和发生的事件。
第三,区块链网络中的全局账本状态(worldstate),所述全局账本状态用于存储当前区块链网络中的所有key/value键值对的最新值。
第四,智能合约被调用触发的时候,对应的触发数据。
可选的,上述步骤s201中,搭建离线测试环境可以包括以下步骤(请参阅图3):
步骤s2011、配置所述智能合约运行所需的应用程序编程接口,其中,所述应用程序编程接口包括数据写入接口、数据查询接口和范围查询接口。
本发明实施例中,基于上文所述的真实区块链网络中支持智能合约运行的基本框架,可以进行模拟并搭建离线测试环境,具体的,可以采用golang程序编写代码实现离线测试环境的搭建,配置智能合约运行所需的应用程序编程接口,例如数据写入接口、数据查询接口和范围查询接口。
步骤s2012、配置所述智能合约运行所需的全局账本状态。
本发明实施例中,可以根据真实区块链网络中当前的全局账本状态来配置离线测试环境中的全局账本状态。
进一步地,首先获取所述区块链环境中的全局账本状态数据;然后创建本地键值对数据库,并在所述本地键值对数据库中存储获取的所述全局账本状态数据。
在一个实现方式中,可以通过配置redis键值对数据库,实现对获取的所述全局账本状态数据的存储。
在另一个实现方式中,还可通过内存中的map数据结构的方式实现对获取的所述全局账本状态数据的存储。
步骤s2013、配置所述智能合约运行所需的区块数据。
本发明实施例中,可以根据真实区块链网络中的区块数据配置离线测试环境中的区块数据。
进一步地,首先确定智能合约在真实区块链网络环境运行时所涉及的目标区块;其次,生成与上述确定的目标区块对应的模拟区块,其中,模拟区块的数据可以以键值对的形式存储于离线测试环境中。
在真实区块链网络环境中,各区块是以链的形式串联连接在一起的,同时以logfile的格式存储在区块链的文件系统中。在本发明实施例中,只需获取与待测试的智能合约关联的区块的数据,并在离线测试环境中将其简化为键值对的形式进行存储,这种存储方式与上述的全局账本状态数据的存储方式保持一致,从而能够减少开发人员的工作量。另外,在离线测试环境中仅保存当前要测试的智能合约关联的区块数据,而无需获取真实区块链网络环境中的全部区块数据,同样大大减少了开发人员的工作量。
作为一个可选的实施例,当智能合约在离线测试环境中运行时,若离线测试环境中的模拟区块的数据被调用,则可以将被调用的数据转换为目标格式以供智能合约调用,其中,目标格式为真实区块链网络环境中的区块的数据格式。
在本实施例中,由于离线测试环境中的模拟区块的数据是以键值对的形式进行保存的,在相应的模拟区块的数据被智能合约调用时,需要将其转化为真实区块链环境中的区块数据格式,以对上层的智能合约提供统一的返回接口。具体的,可以通过模拟api打桩的方式,在相应的区块数据被调用时进行数据格式的转换,这样也实现了在离线测试环境中智能合约与底层数据结构的隔离。
步骤s202、将待测试的智能合约加载至离线测试环境。
步骤s203、对所述智能合约进行编译,获得可执行文件。
步骤s204、执行所述可执行文件,生成所述智能合约的服务。
步骤s205、调用所述服务,并提供触发数据以触发所述智能合约在所述离线测试环境中运行。
步骤s206、对在所述离线测试环境中运行的所述智能合约进行测试。
本发明实施例中,上述步骤s202至s206具体可参考图1所示实施例中的步骤s101至s105,在此不再赘述。
作为一个可选的实施例,在上述步骤s203之前,还可以包括:
获取所述智能合约的业务逻辑;
基于与所述业务逻辑对应的测试实例,对所述全局账本状态进行初始化
由于智能合约可能具备多种不同的业务逻辑,而不同的业务逻辑又对应了不同的测试实例,不同的测试实例又对应了不同的全局账本状态。因此,在本发明实施例中,需要根据智能合约的相关逻辑分支以及和相关逻辑分支对应的具体测试实例,对离线测试环境中的全局账本状态进行初始化。在这里,业务逻辑是指当前需要测试的智能合约具备的规则和流程。
综上所述,本发明通过将待测试的智能合约加载至离线测试环境,并在该离线测试环境中对智能合约进行编译、执行、运行以及调试,解决了现有技术中智能合约的测试过程步骤繁琐、效率低下的问题。也即,一方面,由于该离线测试环境为对智能合约实际运行的区块链环境进行模拟而得到的运行环境,智能合约在该离线测试环境中运行时可以与其在真实区块链环境中运行时表现出一致的行为逻辑,故能够保障智能合约测试的有效性。另一方面,通过在该离线测试环境中运行智能合约,可以使智能合约脱离真实区块链环境而运行,避免了现有技术中对智能合约进行测试时,每次运行智能合约均需要重新部署区块链网络和发布智能合约的繁琐步骤,从而简化了智能合约的测试过程,有利于提高智能合约的开发效率。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
对应于上文实施例所述的智能合约的测试方法,图4示出了本发明实施例提供的一种智能合约的测试装置的一个实施例结构图。
本实施例中,智能合约的测试装置4可以包括:加载单元41、编译单元42,执行单元43,触发单元44和测试单元45。
加载单元41,用于将待测试的智能合约加载至离线测试环境,其中,所述离线测试环境为对所述智能合约实际运行的区块链环境进行模拟而得到的运行环境;
编译单元42,用于对加载单元41加载的智能合约进行编译,获得可执行文件。
执行单元43,用于执行编译单元42获得的可执行文件,生成所述智能合约的服务。
触发单元44,用于调用执行单元43生成的服务,并提供触发数据以触发所述智能合约在所述离线测试环境中运行。
测试单元45,用于在触发单元44触发所述智能合约在所述离线测试环境中运行之后,对所述智能合约进行测试。
进一步地,智能合约的测试装置4还可以包括:
环境搭建单元,用于搭建离线测试环境;
进一步地,所述环境搭建单元包括:
第一配置子单元,用于配置所述智能合约运行所需的应用程序编程接口,其中,所述应用程序编程接口包括数据写入接口、数据查询接口和范围查询接口;
第二配置子单元,用于配置所述智能合约运行所需的全局账本状态;
第三配置子单元,用于配置所述智能合约运行所需的区块数据。
进一步地,智能合约的测试装置4还可以包括:
第一获取单元,用于获取所述区块链环境中的全局账本状态数据;
所述第二配置子单元还用于,创建本地键值对数据库,并在所述本地键值对数据库中存储所述第一获取单元获取的所述全局账本状态数据。
进一步地,所述第三配置子单元包括:
区块确定单元,用于确定所述智能合约在所述区块链环境运行时所涉及的目标区块;
模拟模块生成单元,用于生成与所述区块确定单元确定的目标区块对应的模拟区块,其中,所述模拟区块的数据以键值对的形式存储于所述离线测试环境。
进一步地,智能合约的测试装置3还可以包括:
第二获取单元,用于在对所述智能合约进行编译,获得可执行文件之前,获取所述智能合约的业务逻辑;
初始化单元,用于基于与所述第二获取单元获取的业务逻辑对应的测试实例,对所述全局账本状态进行初始化。
进一步地,智能合约的测试装置4还可以包括:
格式转换单元,用于当触发单元44触发所述智能合约在所述离线测试环境中运行时,若离线测试环境中配置的模拟区块中的数据被调用,则将被调用的数据转换为目标格式以供所述智能合约调用,其中,所述目标格式为所述区块链环境中的区块的数据格式。
进一步的,测试单元45还用于,在指定的断点中断所述智能合约的运行,并输出所述智能合约的当前运行状态信息。
综上所述,本发明通过将待测试的智能合约加载至离线测试环境,并在该离线测试环境中对智能合约进行编译、执行、运行以及调试,解决了现有技术中智能合约的测试过程步骤繁琐、效率低下的问题。也即,一方面,由于该离线测试环境为对智能合约实际运行的区块链环境进行模拟而得到的运行环境,智能合约在该离线测试环境中运行时可以与其在真实区块链环境中运行时表现出一致的行为逻辑,故能够保障智能合约测试的有效性。另一方面,通过在该离线测试环境中运行智能合约,可以使智能合约脱离真实区块链环境而运行,避免了现有技术中对智能合约进行测试时,每次运行智能合约均需要重新部署区块链网络和发布智能合约的繁琐步骤,从而简化了智能合约的测试过程,有利于提高智能合约的开发效率。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置,模块和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
图5示出了本发明实施例提供的一种测试终端的示意框图,为了便于说明,仅示出了与本发明实施例相关的部分。
在本实施例中,所述测试终端5可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。该测试终端5可包括:处理器50、存储器51以及存储在所述存储器51中并可在所述处理器50上运行的计算机可读指令52,例如执行上述的智能合约的测试方法的计算机可读指令。所述处理器50执行所述计算机可读指令52时实现上述各个智能合约的测试方法实施例中的步骤,例如图1所示的步骤s101至步骤s105。或者,所述处理器50执行所述计算机可读指令52时实现上述各装置实施例中各单元的功能,例如图4所示单元41至45的功能。
示例性的,所述计算机可读指令52可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器51中,并由所述处理器50执行,以完成本发明。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机可读指令段,该指令段用于描述所述计算机可读指令52在所述测试终端5中的执行过程。
所述处理器50可以是中央处理单元(centralprocessingunit,cpu),还可以是其它通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或者其它可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
所述存储器51可以是所述测试终端5的内部存储单元,例如测试终端5的硬盘或内存。所述存储器51也可以是所述测试终端5的外部存储设备,例如所述测试终端5上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。进一步地,所述存储器51还可以既包括所述测试终端5的内部存储单元也包括外部存储设备。所述存储器51用于存储所述计算机可读指令以及所述测试终端5所需的其它指令和数据。所述存储器51还可以用于暂时地存储已经输出或者将要输出的数据。
在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干计算机可读指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储计算机可读指令的介质。
以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。