CN113204765A - 一种Hyperledger Fabric链码的测试方法及系统 - Google Patents
一种Hyperledger Fabric链码的测试方法及系统 Download PDFInfo
- Publication number
- CN113204765A CN113204765A CN202110462418.4A CN202110462418A CN113204765A CN 113204765 A CN113204765 A CN 113204765A CN 202110462418 A CN202110462418 A CN 202110462418A CN 113204765 A CN113204765 A CN 113204765A
- Authority
- CN
- China
- Prior art keywords
- chain code
- test
- chain
- fabric
- name
- 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
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/562—Static detection
- G06F21/563—Static detection by source code analysis
-
- 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/3676—Test management for coverage analysis
-
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/566—Dynamic detection, i.e. detection performed at run-time, e.g. emulation, suspicious activities
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- General Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Health & Medical Sciences (AREA)
- General Health & Medical Sciences (AREA)
- Virology (AREA)
- Quality & Reliability (AREA)
- Computing Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种Hyperledger Fabric链码的测试方法及系统,设计合理,方便快捷,能够实现合约的动态测试,提高了测试的准确度和效率。所述方法,包括,将Hyperledger Fabric的链码生成链码的抽象语法树表示形式;采用深度优先搜索的方法,从链码的抽象语法树表示形式中提取链码的关键信息;根据链码的包名和链码对象结构体名称,将链码对象结构体进行实例化,构建包含关键信息的测试模板;将测试用例输入测试模板,通过MockInvoke()方法调用目标功能函数对目标功能函数进行测试,输出目标功能函数执行结果,完成Hyperledger Fabric链码的测试。
Description
技术领域
本发明涉及区块链的安全检测技术,具体为一种Hyperledger Fabric链码的测试方法及系统。
背景技术
区块链是一种采用包括密码学,共识算法等技术的分布式系统。采用区块链可以对金融、供应链等多领域提供去中心化、透明、可追溯的信息平台。在区块链上的智能合约可以进一步满足用户的自定义需求,例如投票、众筹和金融交易等。智能合约本质上是一种在区块链上自动执行的电脑程序,根据区块链平台的不同,基于不同的理论和不同的程序语言实现。例如以太坊 (Ethereum)上的智能合约(smart contract)和HyperledgerFabric上的链码 (chaincode)。
Hyperledger Fabric是由Linux基金会提出并维护的区块链平台,专注于私有性和安全性,其支持的智能合约又称为链码(chaincode);链码技术被众多大型公司采用,因此链码的安全性要求也逐渐提高。
对于链码安全性的提高随之带来对链码安全的检测方法手段的更高要求。当前已有技术分别是基于静态分析,或者静态分析与模糊测试相结合的方法来分析链码的安全漏洞。
单使用静态分析有如下缺点:1.安全漏洞误报率高:静态分析会报告出更多在实际运行中不存在的错误;2.无法证明安全漏洞在实际中存在:静态分析报告的安全漏洞必须依靠实际运行程序来进行证明;3.无法证明与实际链码输入有关的安全漏洞:由于静态分析不实际运行链码,因此无法分析与实际输入有关的安全漏洞;4.静态程序分析还面临着路径爆炸问题,可能会分析到代码实际运行过程中根本不可能执行到的路径。
针对以上缺点,出现了第二种漏洞检测方法:通过模糊测试,对于链码进行安全漏洞挖掘,在模糊测试过程中,会产生多个链码输入并以每个链码输入进行模拟链码运行,分析链码的运行安全漏洞,并根据链码运行的结果,结合静态分析来分析链码的静态安全漏洞。此时,静态分析只分析链码模拟运行过程中执行到的部分(同时避免了路径爆炸),即只能对模糊测试过程中产生的输入所能覆盖到的代码进行检测。
发明内容
针对现有技术中存在的问题,本发明提供一种Hyperledger Fabric链码的测试方法及系统,设计合理,方便快捷,能够实现合约的动态测试,提高了测试的准确度和效率。
本发明是通过以下技术方案来实现:
一种Hyperledger Fabric链码的测试方法,包括,
将Hyperledger Fabric的链码生成链码的抽象语法树表示形式;
采用深度优先搜索的方法,从链码的抽象语法树表示形式中提取链码的关键信息;所述的关键信息包括链码的包名、链码对象结构体名称、 Invoke()方法中调用到的所有功能函数名称;
根据链码的包名和链码对象结构体名称,将链码对象结构体进行实例化,构建包含关键信息的测试模板;测试模板中包括对应Invoke()方法的 MockInvoke()方法;
将测试用例输入测试模板,通过MockInvoke()方法调用目标功能函数对目标功能函数进行测试,输出目标功能函数执行结果,完成Hyperledger Fabric链码的测试。
优选的,所述采用深度优先搜索的方法,从链码的抽象语法树表示形式中提取链码的关键信息,具体如下,
根据获取链码的包名,确定对应的链码对象结构体及名称;
采用深度优先搜索的方法,遍历链码的抽象语法树,获取链码中的所述函数及名称;
采用深度优先搜索的方法,遍历所有函数中的节点,获取Invoke()方法中调用到的所有功能函数及名称;
输出链码的包名、链码对象结构体名称、Invoke()方法中调用到的所有功能函数名称,得到提取的关键信息。
优选的,所述将Hyperledger Fabric的链码生成链码的抽象语法树表示形式;具体的通过调用Go语言官方提供的go/ast程序库,将Hyperledger Fabric的链码生成链码的抽象语法树表示形式。
进一步,所述测试模板还包括Hyperledger Fabric官方提供的Go语言开发套件SDK中的模拟测试接口MockAPI。
再进一步,将测试用例经MockAPI输入测试模板中的目标功能函数。
优选的,所述的测试模板为生成的覆盖率统计文件。
进一步,所述的覆盖率统计文件,执行时对链码进行模拟实际运行,模拟真实链上运行环境,完成链码功能验证以及覆盖率统计。
一种Hyperledger Fabric链码的测试系统,包括,
抽象语法树模块,用于将Hyperledger Fabric的链码生成链码的抽象语法树表示形式;
关键信息模块,用于采用深度优先搜索的方法,从链码的抽象语法树表示形式中提取链码的关键信息;所述的关键信息包括链码的包名、链码对象结构体名称、Invoke()方法中调用到的所有功能函数名称;
测试模板模块,用于根据链码的包名和链码对象结构体名称,将链码对象结构体进行实例化,构建包含关键信息的测试模板;测试模板中包括对应 Invoke()方法的MockInvoke()方法;
调用测试模块,用于将测试用例输入测试模板,通过MockInvoke()方法分别调用目标功能函数对目标功能函数进行测试,输出目标功能函数执行结果,完成HyperledgerFabric链码的测试。
一种计算机设备,包括:存储器,用于存储计算机程序;处理器,用于执行所述计算机程序时实现如上任一项所述的Hyperledger Fabric链码的测试方法。
一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上任一项所述的Hyperledger Fabric链码的测试方法。
与现有技术相比,本发明具有以下有益的技术效果:
本发明利用语法树对链码的关键特征进行提取,使其能够对其进行遍历,达到了更高的准确度和效率,并利用关键信息构建统一的测试模板,只需要提供目标函数的测试用例,就能够自动对给定链码进行测试并输出结果,不需要每次编写针对性的文件,节省时间和相关资源,提高了测试效率。
进一步的,通过深度优先搜索的方法,结合搜索结果和调用函数的比对,能够快速全面的得到调用到的目标功能函数。
进一步的,通过Go语言官方提供的go/ast程序库,以及与其配合的 HyperledgerFabric官方提供的Go语言开发套件SDK,实现在抽象语法树的表示时,与模拟测试时的语言统一通用,并且无需将链码对象结构体进行重构,只需要在同样环境下进行实例化,即可实现对函数的运行和模拟,具有更好的用户友好性。
附图说明
图1为本发明实例所述方法的流程图。
图2为本发明实例所述方法中获取关键信息的流程图。
图3为本发明实例所述系统的结构图。
具体实施方式
下面结合具体的实施例对本发明做进一步的详细说明,所述是对本发明的解释而不是限定。
本发明一种Hyperledger Fabric链码的测试方法,通过测试模板自动化生成测试结果。将不同的链码输入填写到该测试模板后,使用go语言单元测试命令执行该文件,便可以得到相应的测试结果。另外,与普通的单元测试不同,因为此文件中使用了Fabric官方提供的Go语言SDK,可以模拟在区块链上的存储和查询功能,可以对合约的存储功能做一个简单的验证。
由于智能合约中的每个函数都可以通过链码中的Init()初始化函数和 Invoke()功能调用函数被间接调用,主要是利用Invoke()函数,因此我们可以将构成链码的程序代码当作一个整体,从合约/链码级别验证链码和执行目标功能函数。
生成测试模板时,本发明针对Hyperledger fabric区块链平台上的go语言链码,采用抽象语法树技术提取链码中的关键信息,结合Fabric链码编写规范和单元测试,为链码生成进行测试的测试模板。
其中,单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
针对go语言编写的代码,目前已经存在一种函数级别的针对普通go语言程序自动生成单元测试文件的工具/第三方库gotests,通过运行单元测试文件也可以获取相应输入的测试结果。但是gotests生成的单元测试文件中实际存在四个问题:
a、前几行对该文件的说明内容需要人工注释掉,否则运行报错;
b、该文件是函数级别的单元测试,每个函数的测试用例都被构造了成了一个包含4个字段的struct结构。需要由用户自己填充struct内容,给用户在理解和使用上造成了极大的不方便;
c、例如上述单元测试文件中会出现同一变量对应不同的类型,所以只能将其中一个变量修改成其它名称,否则运行文件会报错;
d、由于gotests单元测试文件是函数级别的,其并不具有对链码功能进行验证的作用。gotests原本就是针对一般go程序的,而不是智能合约/链码,其并不具有模拟运行链码的功能。
而本专利结合了Fabric官方提供的SDK,是专门针对Fabric go链码的,具有模拟运行链码的功能。通过采用抽象语法树技术,针对基于Go语言实现的链码程序,自动化生成对应不同功能的测试模板进行测试。具体的通过如下三个方面进一步的进行说明。
1.Go语言实现的链码结构;
链码(chaincode)是执行在Hyperledger fabric平台上的智能合约程序。支持使用Go,node.js或java编程语言实现。编译后的chaincode可以在 Hyperledger fabric上执行。通过执行链码,可以产生交易transaction来初始化或者更新区块链账本ledger。本部分通过下面的链码片段来对链码的结构进行简要叙述。
以上链码片段示例,任何链码在实现的时候都需要至少实现Init和 Invoke两个程序接口。当链码进行初始化交易时会执行Init方法,而当其进行执行交易时会执行Invoke方法。这两个方法归属于给定的链码对象,在此链码片段中指上述链码中的ChaincodeAsset结构体。
此外,链码需要调用shim接口中的ChaincodeStubInterface,即上述链码片段中的shim.ChaincodeStubInterface,来与账本或者其他区块链上的链码进行交互,在以上链码片段中指Init与Invoke方法的输入参数stub。
2.链码自动化生成测试模板的流程;
本发明所述的测试模板中利用了Hyperledger Fabric官方开发套件 (SDK)提供的模拟测试接口(MockAPI)。当给测试模板提供合适的测试用例之后,可以对链码进行模拟实际运行,此运行过程是严格模拟真实链上运行环境的,可以完成链码功能验证以及覆盖率统计。具体步骤如下,如图1 所示。
首先,本发明调用Go语言官方提供的go/ast程序库来生成抽象语法树 (Abstractsyntax tree,AST),获取示例链码的抽象语法树表示形式,然后从中提取所需的关键信息。所需的关键信息有:链码的包名、链码对象结构体名称、Invoke()方法中调用到的所有方法的名称。
根据链码的包名和链码对象结构体名称,将链码对象结构体进行实例化,构建包含关键信息的测试模板;测试模板中包括有对应Invoke()方法的 MockInvoke()方法;由于Invoke()方法是链码中的方法,因此要在测试模板中设置与Invoke()方法功能相同但又能够区别归属的MockInvoke()方法,两者的功能作用相同,只是一个属于链码,一个属于测试模板。
生成测试模板文件之后,本发明需要用户自己填写测试用例,即输入目标功能函数的参数;将测试用例通过模拟测试接口(MockAPI)输入测试模板中的目标功能函数,通过MockInvoke()方法调用目标功能函数对目标功能函数进行测试,输出目标功能函数执行结果,完成Hyperledger Fabric链码的测试。因为这里没有像gotests工具一样再重新构造新的测试用例结构体,可以完全根据链码中的参数类型来进行填写,这比gotests更具有用户友好性。所述的目标功能函数,实际就是测试用例输入参数对应的功能函数,可以一次输入一个功能函数的参数,通过MockInvoke()方法进行调用测试;也可以一次输入多个功能函数的参数,通过多个MockInvoke()方法分别进行一一对应的调用测试。
在此步骤中,输出链码的包名、链码对象结构体名称、Invoke()方法中调用到的所有功能函数名称,得到提取的关键信息。如图2所示,所述采用深度优先搜索的方法,从链码的抽象语法树表示形式中提取链码的关键信息,首先,获取链码的包名及对应的链码对象结构体名称;其次,采用深度优先搜索的方法,遍历链码的抽象语法树,获取链码中的所述函数及名称;再次,采用深度优先搜索的方法,遍历所有函数中的节点,获取Invoke()方法中调用到的所有功能函数及名称。
具体的,根据AST的结构,采用深度优先搜索策略,对整个抽象语法树进行遍历,然后收集每一个满足条件的节点信息。算法中“函数声明”和“函数调用”在抽象语法树中被表示为不同的节点类型,分别为 *ast.FuncDecl和*ast.Ident,因为*ast.Ident具有更广泛的含义,除了可以表示函数名外,还可以表示包名、变量名等。
因此,必须要先确定链码中得所有函数名,存于funcName中,然后再从Invoke()方法中选择可能是“函数调用”的节点,如果该节点的名称存在于funcName中,则此节点就是函数调用。以此类推,最终可以确定Invoke() 函数体内调用的所有方法名。
对应关键信息的获取其能够表示为如下的程序编码。
3.使用本发明对所述链码生成具体的代码覆盖率统计文件。
本优选实例中以特定链码为例进行叙述。
代码覆盖(Code coverage)是软件测试中的一种度量,描述程序中源代码被测试的比例和程度,所得比例称为代码覆盖率。虽然覆盖率达到100%,也不一定能够检测出所有漏洞。但是如果代码没有被执行到,若其中包含漏洞,则一定不会被检测出来。覆盖率越低,那么没有被执行到的代码包含潜在漏洞的可能性就越大。因此,结合上面对Fabric链码漏洞检测方法的描述,代码覆盖率在智能合约漏洞检测方面也起着至关重要的作用,覆盖率的高低可以直接表现出漏洞检测的完全程度。
下面的代码就是通过使用本发明中的方法为前文中示例链码自动生成的覆盖率统计文件,也就是相应的测试模板,进行对应测试的实例。
首先第一行package后面的“sacc”就是算法中的packageName,测试模板对应的文件包名必须与链码的包名相同,否则无法执行测试,也就不能获取每个输入对应的覆盖率。
接下来import关键字的作用是导入一些必要的依赖包,在本发明中,只需要上面四个固定的依赖包,可以根据具体的测试需求进行导入。
最后是一个单元测试函数,本文件中有且仅有这一个函数。
其中第11行:cc:=new(SimpleAsset)的作用是实例化一个链码结构体,“SimpleAsset”就是算法中的structname。
接下来主要通过调用SDK中的MockInit()和MockInvoke()方法,分别来模拟对链码的初始化和调用,实质就是分别执行链码中的Init()方法和 Invoke()方法。
对于链码的调用,无论是对Init()还是Invoke(),调用后的输入参数的格式总是“[][]byte”类型的数组。对于Init()方法,其参数的作用一般是在区块链的底层数据库中初始化一个值,不涉及调用其它方法。而Invoke()方法接收的第一个参数就是其调用的方法名,后面的参数实际是传给所调用方法使用的。
本覆盖率统计文件中列出了所有Invoke()方法调用的函数,如第15、17 行的“set”和“get”。出于用户的实际目的,用户可以对测试模板的文件进行修改,如在set之后调用get,这样可以验证set方法是否能够成功更新链上存储的值。
每个“arg”是等待用户传入的参数,文件中每行都默认放置了两个arg,需要按照实际情况增减个数;也就是测试用例中能够直接获取的对应参数。
在这里,用户为了达到获取某些输入产生的覆盖率的目的,仅需要关注 Invoke()中调用到的函数就好了。从生成的覆盖率统计文件中可以发现 Invoke()调用了哪些函数,从而在链码文件中迅速定位出这些函数的定义位置,然后根据每个函数的定义构造出合理的输入。对于一个代码量庞大的链码,里面可能包含许多个函数,但是最终由Invoke()调用的也许只有寥寥几个。在已有覆盖率统计文件的情况下,用户不必再关注整个链码中的函数,为每个函数都填充参数,能够大大节省用户的时间成本。
在给覆盖率统计文件设置完参数后,执行go test-cover命令便可以获取所设置参数,或者说所提供输入产生的覆盖率值,本优选实例中得到的覆盖率为68.8%。
本发明是第一种针对Hyperledger Fabric区块链平台上智能合约(链码,chaincode)的输入,进行对应测试的方法,能够更好的获取对应的覆盖率值,根据覆盖率值判断本次输入的优良与否。本发明是一种针对链码的、合约级别的验证智能合约功能的方法。
利用本发明所述的方法,在覆盖率统计时,通过测试模板能够自动为给定链码生成覆盖率统计文件,比较传统人工编写节省时间及相关资源。由于引入抽象语法树技术获取代码中的关键信息,比使用正则表达式更具有更高的准确度和效率。在HyperledgerFabric平台上不存在其他链码输入覆盖率统计工具。
本发明对应上述的方法,还提供一种Hyperledger Fabric链码的测试系统,如图3所示,其包括,
抽象语法树模块,用于将Hyperledger Fabric的链码生成链码的抽象语法树表示形式;
关键信息模块,用于采用深度优先搜索的方法,从链码的抽象语法树表示形式中提取链码的关键信息;所述的关键信息包括链码的包名、链码对象结构体名称、Invoke()方法中调用到的所有功能函数名称;
测试模板模块,用于根据链码的包名和链码对象结构体名称,将链码对象结构体进行实例化,构建包含关键信息的测试模板;测试模板中包括对应 Invoke()方法的MockInvoke()方法;
调用测试模块,用于将测试用例输入测试模板,通过MockInvoke()方法分别调用目标功能函数对目标功能函数进行测试,输出目标功能函数执行结果,完成HyperledgerFabric链码的测试。
本发明还提供一种计算机设备,包括存储器,用于存储计算机程序;处理器,用于执行所述计算机程序时实现如上述的Hyperledger Fabric链码的测试方法的步骤。
本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上述的 Hyperledger Fabric链码的测试方法的步骤。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员依然可以对本发明的具体实施方式进行修改或者等同替换,这些未脱离本发明精神和范围的任何修改或者等同替换,均在申请待批的本发明的权利要求保护范围之内。
由技术常识可知,本发明可以通过其它的不脱离其精神实质或必要特征的实施方案来实现。因此,上述公开的实施方案,就各方面而言,都只是举例说明,并不是仅有的。所有在本发明范围内或在等同于本发明的范围内的改变均被本发明包含。
Claims (10)
1.一种Hyperledger Fabric链码的测试方法,其特征在于,包括,
将Hyperledger Fabric的链码生成链码的抽象语法树表示形式;
采用深度优先搜索的方法,从链码的抽象语法树表示形式中提取链码的关键信息;所述的关键信息包括链码的包名、链码对象结构体名称、Invoke()方法中调用到的所有功能函数名称;
根据链码的包名和链码对象结构体名称,将链码对象结构体进行实例化,构建包含关键信息的测试模板;测试模板中包括对应Invoke()方法的MockInvoke()方法;
将测试用例输入测试模板,通过MockInvoke()方法调用目标功能函数对目标功能函数进行测试,输出目标功能函数执行结果,完成HyperledgerFabric链码的测试。
2.根据权利要求1所述的一种Hyperledger Fabric链码的测试方法,其特征在于,所述采用深度优先搜索的方法,从链码的抽象语法树表示形式中提取链码的关键信息,具体如下,
根据获取链码的包名,确定对应的链码对象结构体及名称;
采用深度优先搜索的方法,遍历链码的抽象语法树,获取链码中的所述函数及名称;
采用深度优先搜索的方法,遍历所有函数中的节点,获取Invoke()方法中调用到的所有功能函数及名称;
输出链码的包名、链码对象结构体名称、Invoke()方法中调用到的所有功能函数名称,得到提取的关键信息。
3.根据权利要求1所述的一种Hyperledger Fabric链码的测试方法,其特征在于,所述将Hyperledger Fabric的链码生成链码的抽象语法树表示形式;具体的通过调用Go语言官方提供的go/ast程序库,将Hyperledger Fabric的链码生成链码的抽象语法树表示形式。
4.根据权利要求3所述的一种Hyperledger Fabric链码的测试方法,其特征在于,所述测试模板还包括Hyperledger Fabric官方提供的Go语言开发套件SDK中的模拟测试接口MockAPI。
5.根据权利要求4所述的一种Hyperledger Fabric链码的测试方法,其特征在于,将测试用例经MockAPI输入测试模板中的目标功能函数。
6.根据权利要求1所述的一种Hyperledger Fabric链码的测试方法,其特征在于,所述的测试模板为生成的覆盖率统计文件。
7.根据权利要求6所述的一种Hyperledger Fabric链码的测试方法,其特征在于,所述的覆盖率统计文件,执行时对链码进行模拟实际运行,模拟真实链上运行环境,完成链码功能验证以及覆盖率统计。
8.一种Hyperledger Fabric链码的测试系统,其特征在于,包括,
抽象语法树模块,用于将Hyperledger Fabric的链码生成链码的抽象语法树表示形式;
关键信息模块,用于采用深度优先搜索的方法,从链码的抽象语法树表示形式中提取链码的关键信息;所述的关键信息包括链码的包名、链码对象结构体名称、Invoke()方法中调用到的所有功能函数名称;
测试模板模块,用于根据链码的包名和链码对象结构体名称,将链码对象结构体进行实例化,构建包含关键信息的测试模板;测试模板中包括对应Invoke()方法的MockInvoke()方法;
调用测试模块,用于将测试用例输入测试模板,通过MockInvoke()方法分别调用目标功能函数对目标功能函数进行测试,输出目标功能函数执行结果,完成HyperledgerFabric链码的测试。
9.一种计算机设备,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时实现如权利要求1至7中任一项所述的Hyperledger Fabric链码的测试方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至7中任一项所述的HyperledgerFabric链码的测试方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110462418.4A CN113204765B (zh) | 2021-04-27 | 2021-04-27 | 一种Hyperledger Fabric链码的测试方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110462418.4A CN113204765B (zh) | 2021-04-27 | 2021-04-27 | 一种Hyperledger Fabric链码的测试方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113204765A true CN113204765A (zh) | 2021-08-03 |
CN113204765B CN113204765B (zh) | 2022-09-30 |
Family
ID=77026905
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110462418.4A Active CN113204765B (zh) | 2021-04-27 | 2021-04-27 | 一种Hyperledger Fabric链码的测试方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113204765B (zh) |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107329888A (zh) * | 2017-05-31 | 2017-11-07 | 深圳前海微众银行股份有限公司 | 智能合约操作码覆盖率计算方法和系统 |
CN109408373A (zh) * | 2018-09-26 | 2019-03-01 | 深圳壹账通智能科技有限公司 | 智能合约的测试方法、计算机可读存储介质及测试终端 |
CN111062038A (zh) * | 2019-11-23 | 2020-04-24 | 同济大学 | 一种基于状态空间的智能合约形式化验证系统及方法 |
CN111459786A (zh) * | 2019-01-18 | 2020-07-28 | 南京大学 | 一种基于变异fuzz的智能合约安全测试方法 |
CN111858335A (zh) * | 2020-07-20 | 2020-10-30 | 杭州溪塔科技有限公司 | 一种区块链sdk测试方法和装置 |
CN112015628A (zh) * | 2020-09-01 | 2020-12-01 | 北京物资学院 | 一种智能合约函数级动态监测分析系统及实现方法 |
CN112069050A (zh) * | 2019-06-11 | 2020-12-11 | 南京慕测信息科技有限公司 | 一种基于多目标优化的智能合约测试方法 |
CN112131115A (zh) * | 2020-09-23 | 2020-12-25 | 腾讯科技(深圳)有限公司 | 一种智能合约模糊测试的方法、装置及存储介质 |
CN112286828A (zh) * | 2020-12-24 | 2021-01-29 | 支付宝(杭州)信息技术有限公司 | 一种区块链智能合约的测试方法和系统 |
WO2021037196A1 (zh) * | 2019-08-28 | 2021-03-04 | 杭州趣链科技有限公司 | 智能合约代码漏洞检测方法、装置、计算机设备和存储介质 |
-
2021
- 2021-04-27 CN CN202110462418.4A patent/CN113204765B/zh active Active
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107329888A (zh) * | 2017-05-31 | 2017-11-07 | 深圳前海微众银行股份有限公司 | 智能合约操作码覆盖率计算方法和系统 |
CN109408373A (zh) * | 2018-09-26 | 2019-03-01 | 深圳壹账通智能科技有限公司 | 智能合约的测试方法、计算机可读存储介质及测试终端 |
CN111459786A (zh) * | 2019-01-18 | 2020-07-28 | 南京大学 | 一种基于变异fuzz的智能合约安全测试方法 |
CN112069050A (zh) * | 2019-06-11 | 2020-12-11 | 南京慕测信息科技有限公司 | 一种基于多目标优化的智能合约测试方法 |
WO2021037196A1 (zh) * | 2019-08-28 | 2021-03-04 | 杭州趣链科技有限公司 | 智能合约代码漏洞检测方法、装置、计算机设备和存储介质 |
CN111062038A (zh) * | 2019-11-23 | 2020-04-24 | 同济大学 | 一种基于状态空间的智能合约形式化验证系统及方法 |
CN111858335A (zh) * | 2020-07-20 | 2020-10-30 | 杭州溪塔科技有限公司 | 一种区块链sdk测试方法和装置 |
CN112015628A (zh) * | 2020-09-01 | 2020-12-01 | 北京物资学院 | 一种智能合约函数级动态监测分析系统及实现方法 |
CN112131115A (zh) * | 2020-09-23 | 2020-12-25 | 腾讯科技(深圳)有限公司 | 一种智能合约模糊测试的方法、装置及存储介质 |
CN112286828A (zh) * | 2020-12-24 | 2021-01-29 | 支付宝(杭州)信息技术有限公司 | 一种区块链智能合约的测试方法和系统 |
Non-Patent Citations (3)
Title |
---|
OLIVIA CHOUDHURY等: "Auto-Generation of Smart Contracts from Domain-Specific Ontologies and Semantic Rules", 《2018 IEEE INTERNATIONAL CONFERENCE ON INTERNET OF THINGS AND IEEE GREEN COMPUTING AND COMMUNICATIONS AND IEEE CYBER,PHYSICAL AND SOCIAL COMPUTING AND IEEE SMART DATA》 * |
倪远东等: "智能合约安全漏洞研究综述", 《信息安全学报》 * |
赖恩梅: "智能合约源代码的安全审计", 《中国优秀博硕士学位论文全文数据库(硕士) 信息科技辑》 * |
Also Published As
Publication number | Publication date |
---|---|
CN113204765B (zh) | 2022-09-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Gross et al. | Search-based system testing: high coverage, no false alarms | |
US8494832B2 (en) | Method and apparatus for software simulation | |
US9535823B2 (en) | Method and apparatus for detecting software bugs | |
US20150378880A1 (en) | Dynamically Configurable Test Doubles For Software Testing And Validation | |
Shu et al. | Javapdg: A new platform for program dependence analysis | |
Habchi et al. | Code smells in ios apps: How do they compare to android? | |
US20240121261A1 (en) | Automated Security Analysis of Software Libraries | |
US10248545B2 (en) | Method for tracking high-level source attribution of generated assembly language code | |
Kim et al. | Industrial application of concolic testing on embedded software: Case studies | |
Cheon | Automated random testing to detect specification-code inconsistencies | |
Chen et al. | Synthesis-powered optimization of smart contracts via data type refactoring | |
Cseppentő et al. | Evaluating code‐based test input generator tools | |
Bubel et al. | Analysis of executable software models | |
Kundu et al. | A UML model-based approach to detect infeasible paths | |
Rapoport et al. | Precise data flow analysis in the presence of correlated method calls | |
CN113204765B (zh) | 一种Hyperledger Fabric链码的测试方法及系统 | |
Rodrigues et al. | Model-driven fault injection in Java source code | |
US9983983B2 (en) | Auto-generation of testable units for COBOL code | |
Seijas et al. | Model extraction and test generation from JUnit test suites | |
Nakagawa et al. | How compact will my system be? A fully-automated way to calculate Loc reduced by clone refactoring | |
De Angelis et al. | Inferring relations among test programs in microservices applications | |
CN113190441B (zh) | 一种链码测试种子生成方法、系统、设备及存储介质 | |
Mahmood | An evolutionary approach for system testing of android applications | |
Shafin et al. | Automated testing of Web Services system based on OWL-S | |
Anwer et al. | Testing program for security using symbolic execution and exception injection |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |