CN112905447B - 一种区块链虚拟机的测试方法和系统 - Google Patents

一种区块链虚拟机的测试方法和系统 Download PDF

Info

Publication number
CN112905447B
CN112905447B CN202110087607.8A CN202110087607A CN112905447B CN 112905447 B CN112905447 B CN 112905447B CN 202110087607 A CN202110087607 A CN 202110087607A CN 112905447 B CN112905447 B CN 112905447B
Authority
CN
China
Prior art keywords
code
file
virtual machine
executable code
test
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.)
Active
Application number
CN202110087607.8A
Other languages
English (en)
Other versions
CN112905447A (zh
Inventor
王海军
邬萌
傅滢
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Alipay Hangzhou Information Technology Co Ltd
Original Assignee
Alipay Hangzhou Information Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Alipay Hangzhou Information Technology Co Ltd filed Critical Alipay Hangzhou Information Technology Co Ltd
Priority to CN202110087607.8A priority Critical patent/CN112905447B/zh
Publication of CN112905447A publication Critical patent/CN112905447A/zh
Application granted granted Critical
Publication of CN112905447B publication Critical patent/CN112905447B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • G06F2009/45591Monitoring or debugging support

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Test And Diagnosis Of Digital Computers (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本说明书实施例提供了一种区块链虚拟机的测试方法和系统,方法包括:获取智能合约的源代码程序文件;对源代码程序文件进行编译,得到能够被虚拟机执行的可执行代码文件;对可执行代码文件中的至少一个代码段进行修改得到测试用可执行代码文件;所述修改使得修改后的代码段的输入操作数的数量和类型与修改前的代码段的输入操作数的数量和类型一致,修改后的代码段的输出操作数的数量和类型与修改前的代码段的输出操作数的数量和类型一致;通过虚拟机执行所述测试用可执行代码文件,以对所述虚拟机进行测试。实现了在保证变异得到的测试代码能够通过虚拟机的检查的情况下,充分变异生成丰富的测试代码,以更加有效和完善地测试虚拟机。

Description

一种区块链虚拟机的测试方法和系统
技术领域
本申请涉及计算机技术领域,特别涉及区块链虚拟机的测试方法和系统。
背景技术
对区块链虚拟机的测试可以采用对区块链的智能合约对应的代码进行变异(修改),得到可以在虚拟机上执行的测试代码,并用得到的测试代码在虚拟机上执行,测试区块链虚拟机执行或处理上是否有缺陷。对智能合约对应的代码进行变异时,存在变异得到的测试代码不能通过虚拟机的检查(例如语法检查、病毒检查、代码完整性检查等)的问题。不能通过虚拟机检查的测试代码也就无法在虚拟机上执行,可以称为无效的测试代码,变异产生的无效测试代码,导致不能有效和充分地测试虚拟机,降低了虚拟机测试的效果。如何在对智能合约进行代码变异时,令变异得到的测试代码可以通过虚拟机的检查,对于提升虚拟机测试的效果有着重要意义。
发明内容
本说明书一个方面提供一种区块链虚拟机的测试方法,所述方法包括:获取智能合约的源代码程序文件;对所述源代码程序文件进行编译,得到能够被虚拟机执行的可执行代码文件;对所述可执行代码文件中的至少一个代码段进行修改得到所述测试用可执行代码文件;其中,代码段包括一行或多行代码;所述修改使得修改后的代码段的输入操作数的数量和类型与修改前的所述代码段的输入操作数的数量和类型一致,修改后的代码段的输出操作数的数量和类型与修改前的所述代码段的输出操作数的数量和类型一致;通过虚拟机执行所述测试用可执行代码文件,以对所述虚拟机进行测试。
本说明书另一个方面提供一种区块链虚拟机的测试系统,所述系统包括:源代码获取模块:用于获取智能合约的源代码程序文件;可执行代码获取模块:用于对所述源代码程序文件进行编译,得到能够被虚拟机执行的可执行代码文件;测试文件确定模块:用于对所述可执行代码文件中的至少一个代码段进行修改得到测试用可执行代码文件;其中,代码段包括一行或多行代码;所述修改使得修改后的代码段的输入操作数的数量和类型与修改前的所述代码段的输入操作数的数量和类型一致,修改后的代码段的输出操作数的数量和类型与修改前的所述代码段的输出操作数的数量和类型一致;测试模块:用于通过虚拟机执行所述测试用可执行代码文件,以对所述虚拟机进行测试。
本说明书另一个方面提供一种区块链虚拟机的测试装置,包括至少一个存储介质和至少一个处理器,所述至少一个存储介质用于存储计算机指令;所述至少一个处理器用于执行所述计算机指令以实现所述区块链虚拟机的测试方法。
本说明书另一个方面提供一种区块链虚拟机的测试方法,所述方法包括:获取智能合约的源代码程序文件;对所述源代码程序文件进行编译,得到智能合约的字节码文件;获取所述字节码文件的可理解文本;基于所述可理解文本对所述字节码文件中的至少一个代码段进行以下中的一种或多种修改得到测试用字节码文件:对所述代码段中操作数的存储地址进行修改、对所述代码段中操作数的数值进行修改、将所述代码段中操作码变更为相同类型的其他操作码;其中,代码段包括一行或多行代码,相同类型的操作码具有相同的操作数数量与操作数类型;通过虚拟机执行所述测试用字节码文件,以对所述虚拟机进行测试。
附图说明
本说明书将以示例性实施例的方式进一步说明,这些示例性实施例将通过附图进行详细描述。这些实施例并非限制性的,在这些实施例中,相同的编号表示相同的结构,其中:
图1是根据本说明书一些实施例所示的一种区块链虚拟机的测试系统的模块图;
图2是根据本说明书一些实施例所示的一种区块链虚拟机的测试方法的示例性流程图;
图3是根据本说明书一些实施例所示的一种对代码段进行修改得到测试用可执行代码文件的示例性示意图。
具体实施方式
为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单的介绍。显而易见地,下面描述中的附图仅仅是本说明书的一些示例或实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图将本说明书应用于其它类似情景。除非从语言环境中显而易见或另做说明,图中相同标号代表相同结构或操作。
应当理解,本说明书中所使用的“系统”、“装置”、“单元”和/或“模组”是用于区分不同级别的不同组件、元件、部件、部分或装配的一种方法。然而,如果其他词语可实现相同的目的,则可通过其他表达来替换所述词语。
如本说明书和权利要求书中所示,除非上下文明确提示例外情形,“一”、“一个”、“一种”和/或“该”等词并非特指单数,也可包括复数。一般说来,术语“包括”与“包含”仅提示包括已明确标识的步骤和元素,而这些步骤和元素不构成一个排它性的罗列,方法或者设备也可能包含其它的步骤或元素。
本说明书中使用了流程图用来说明根据本说明书的实施例的系统所执行的操作。应当理解的是,前面或后面操作不一定按照顺序来精确地执行。相反,可以按照倒序或同时处理各个步骤。同时,也可以将其他操作添加到这些过程中,或从这些过程移除某一步或数步操作。
本说明书的一些实施例所示的区块链虚拟机的测试系统可以应用于区块链平台(或区块链网络),对区块链平台进行测试。具体地,可以对区块链的智能合约的代码进行变异,得到可以在虚拟机上执行的测试代码,并用得到的测试代码在虚拟机上执行,测试区块链虚拟机执行或处理上是否有缺陷,进而帮助提高区块链的虚拟机的健壮性。
区块链是分布式、去中心化的数据库,区块链的数据具有不可纂改、全程留痕、可以追溯等特点,被应用于各个数据存证场景。智能合约是指是由计算机程序定义并自动执行的承诺协议。智能合约可以部署于区块链平台中的节点上,运行在虚拟机环境中。智能合约由合约开发者编写并部署,智能合约开发者可以根据需求编写智能合约。智能合约被成功部署后,节点可以接收调用智能合约的交易,并对已部署的智能合约进行执行(调用)。虚拟机是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在一些实施例中,虚拟机可以包括但不限于以太坊虚拟机(Embedded VirturalMachine,EVM)、EOS虚拟机(Web Assembly,WASM)、比原链虚拟机(Bottos VirturalMachine,BVM)等。可以理解的是,智能合约在一定程度上代表着区块链平台的行为能力,而智能合约的执行又依赖于虚拟机,虚拟机的稳定健壮影响着区块链平台能否平稳健康运行。因此,有必要提供一种更加高效的虚拟机测试方法。
在计算机程序测试过程中,可以生成各种不同的输入,例如随机的、畸形的、非预期的输入等,通过各种不同的输入触发计算机程序的执行,以测试程序的执行或处理,发现程序中的错误。对于虚拟机而言,可以对智能合约进行各种变异,并通过虚拟机执行变异后的智能合约,以检测虚拟机能否正常支持智能合约的执行或者能否正常处理由变异后的智能合约引发的各种异常场景,如是否具有一定的容错能力,保持稳定运行。
具体的,在进行虚拟机测试时,可以对区块链的智能合约的代码进行变异,如对智能合约源代码程序进行变异,然后编译生成可以在虚拟机上执行的可执行代码,并用得到的可执行代码作为测试代码,或者直接基于编译生成的可执行代码进行变异得到测试代码,使用测试代码在虚拟机上执行,测试区块链虚拟机执行逻辑或处理逻辑上是否有缺陷。对智能合约对应的代码进行变异时,存在变异得到的测试代码不能通过虚拟机的检查(例如语法检查、病毒检查、代码完整性检查等)的问题。例如,在变异时随机改变了代码中的一处,与该代码执行相关的其它代码也需要适应性改变才能令代码通过虚拟机的检查,而一个智能合约的程序代码很多,难以快速找全所有需要相应更改的地方,常常造成变异得到的代码不能通过虚拟机检查。不能通过虚拟机检查的测试代码也就无法在虚拟机上执行,可以称为无效的测试代码,变异产生的无效测试代码,导致不能有效和充分地测试虚拟机,降低了虚拟机测试的效果。
在本说明书中,提出基于智能合约源代码程序编译生成的可执行代码进行变异得到测试代码的方法,在进行变异时始终保持语法的正确性,令生成的测试代码能够通过虚拟机的检查。具体可以通过保持可执行代码变异前后的操作数平衡来保持代码语法的正确性。例如,代码段的修改使得修改后的代码段的输入操作数的数量和类型与修改前的所述代码段的输入操作数的数量和类型一致,修改后的代码段的输出操作数的数量和类型与修改前的所述代码段的输出操作数的数量和类型一致。实现了在保证变异得到的测试代码能够通过虚拟机的检查的情况下,充分变异生成丰富的测试代码,以全面地覆盖虚拟机的执行逻辑或处理逻辑,更加有效和完善地测试虚拟机。
图1是根据本说明书一些实施例所示的一种区块链虚拟机的测试系统的模块图。
在一些实施例中,区块链虚拟机的测试系统100可以包括源代码获取模块110、可执行代码获取模块120、测试文件确定模块130和测试模块140。可选的,在一些实施例中,还可以包括有效代码确定模块150。
源代码获取模块110可以用于:获取智能合约的源代码程序文件。
可执行代码获取模块120可以用于:对所述源代码程序文件进行编译,得到能够被虚拟机执行的可执行代码文件。
测试文件确定模块130可以用于:对所述可执行代码文件中的至少一个代码段进行修改得到测试用可执行代码文件;其中,代码段包括一行或多行代码;所述修改使得修改后的代码段的输入操作数的数量和类型与修改前的所述代码段的输入操作数的数量和类型一致,修改后的代码段的输出操作数的数量和类型与修改前的所述代码段的输出操作数的数量和类型一致。在一些实施例种,所述测试文件确定模块还可以用于获取所述可执行代码文件的可理解文本;基于所述可理解文本对所述可执行代码文件中的至少一个代码段进行修改。在一些实施例种,所述修改包括以下中的一种或多种:对所述代码段中操作数的存储地址进行修改、对所述代码段中操作数的数值进行修改、将所述代码段中操作码变更为相同类型的其他操作码;其中,相同类型的操作码具有相同的操作数数量与操作数类型。
测试模块140可以用于:通过所述虚拟机执行所述测试用可执行代码文件,以对所述虚拟机进行测试。
有效代码确定模块150可以用于:获取所述测试用可执行代码文件在所述虚拟机上执行时对所述虚拟机的代码覆盖率;基于所述代码覆盖率确定所述测试用可执行代码文件是否能够被所述虚拟机有效执行;若能够被有效执行,则将所述测试用可执行代码文件保留,否则,丢弃所述测试用可执行代码文件。在一些实施例中,所述有效代码确定模块还可以用于:对保留的测试用可执行代码文件再次修改,以获得新的测试用可执行代码文件。
应当理解,所示的系统及其模块可以利用各种方式来实现。例如,在一些实施例中,系统及其模块可以通过硬件、软件或者软件和硬件的结合来实现。其中,硬件部分可以利用专用逻辑来实现;软件部分则可以存储在存储器中,由适当的指令执行系统,例如微处理器或者专用设计硬件来执行。本领域技术人员可以理解上述的方法和系统可以使用计算机可执行指令和/或包含在处理器控制代码中来实现,例如在诸如磁盘、CD或DVD-ROM的载体介质、诸如只读存储器(固件)的可编程的存储器或者诸如光学或电子信号载体的数据载体上提供了这样的代码。本申请的系统及其模块不仅可以有诸如超大规模集成电路或门阵列、诸如逻辑芯片、晶体管等的半导体、或者诸如现场可编程门阵列、可编程逻辑设备等的可编程硬件设备的硬件电路实现,也可以用例如由各种类型的处理器所执行的软件实现,还可以由上述硬件电路和软件的结合(例如,固件)来实现。
需要注意的是,以上对于区块链虚拟机的测试系统100及其模块的描述,仅为描述方便,并不能把本说明书限制在所举实施例范围之内。可以理解,对于本领域的技术人员来说,在了解该系统的原理后,可能在不背离这一原理的情况下,对各个模块进行任意组合,或者构成子系统与其他模块连接。例如,测试文件确定模块130和测试模块140可以合并成同一模块。诸如此类的变形,均在本申请的保护范围之内。
图2是根据本说明书的一些实施例所示的一种区块链虚拟机的测试方法的示例性流程图。
如图2所示,该区块链虚拟机的测试方法200可以包括:
步骤210,获取智能合约的源代码程序文件。
具体的,该步骤210可以由源代码获取模块110执行。
源代码程序文件是指未经编译的,按照一定的程序设计语言规范书写的,人类可读的,包含程序的文件。如前所述,智能合约是按照需求编写的代码程序,部署于区块链平台中的节点上,运行在虚拟机环境中。智能合约的源代码程序文件即是智能合约对应的未经编译的,按照一定的程序设计语言规范书写的,人类可读的,包含程序的文件。在一些实施例中,源代码程序文件可以采用java,c,c++,C#,pascal,python等高级语言编写。
源代码程序文件可以包括1个或多个代码段。代码段是指代码程序中的由一行或多行代码组成的代码片段,一个代码段可以对应计算机程序中的一个指令或一个功能。在一些实施例中,程序中的不同代码段可以实现不同的指令或功能。例如,程序的一个代码段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表示文件指针。
在一些实施例中,智能合约的源代码程序文件可以通过从存储区块链智能合约相关数据的空间中读取获得,也可以通过读取区块链的历史测试数据(历史的单元测试案例数据,单元测试案例即包括区块链的智能合约相关代码文件)获得,本实施例对智能合约的源代码程序文件的获取方式不做限制。
步骤220,对所述源代码程序文件进行编译,得到能够被虚拟机执行的可执行代码文件。
具体的,该步骤220可以由可执行代码获取模块120执行。
编译是指从源语言(例如java,c,c++,C#,pascal,python等高级语言)编写的源代码程序产生目标程序的过程。例如,可以把源语言编写的源代码程序变成机器语言的代码程序,机器语言的代码程序可以是二进制的代码程序。机器语言的代码程序能够被处理器或虚拟机直接执行,又可以称为可执行代码文件。
在一些实施例中,对源代码程序文件进行编译,得到能够被虚拟机执行的可执行代码文件可以通过对源代码程序文件分析句法和语法,将源代码程序文件转换成汇编语言的代码程序文件,再将汇编语言代码翻译成机器语言的代码程序文件。
在一些实施例中,可以采用编译程序(编译器)将源代码程序文件编译成能够被虚拟机执行的可执行代码文件。例如,可以采用编译程序(编译器)emscripten将智能合约的源代码程序文件编译成wasm的二进制代码程序文件,又可称为字节码。wasm的二进制代码程序文件可以在wasm虚拟机上执行。wasm是一种编码方式,属于类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,wasm虚拟机为诸如C/C++等语言编译成的wasm编码格式的字节码提供运行的平台。
步骤230,对所述可执行代码文件中的至少一个代码段进行修改得到所述测试用可执行代码文件,其中,代码段包括一行或多行代码;所述修改使得修改后的代码段的输入操作数的数量和类型与修改前的所述代码段的输入操作数的数量和类型一致,修改后的代码段的输出操作数的数量和类型与修改前的所述代码段的输出操作数的数量和类型一致。
具体的,该步骤230可以由测试文件确定模块130执行。
如前所述,源代码程序文件可以包括一个或多个源代码段。对应的,由源代码程序文件编译得到的可执行代码文件也包括一个或多个可执行代码段。代码段是指代码程序中的由一行或多行代码组成的代码片段,一般来说,一行代码对应一句指令。
在一些实施例中,通过对可执行代码文件中的至少一个代码段进行修改,可以得到更加丰富和测试覆盖面更广的测试代码数据,即测试用可执行代码文件。
在一些实施例中,可以基于代码段的操作数的数目和类型,对可执行代码文件种的代码段进行修改。通过本实施例,可以实现在进行变异时始终保持语法的正确性,令生成的测试用可执行代码文件能够通过虚拟机的检查。
通常一条指令包括两方面的内容:操作码和操作数。操作码表示计算机程序要执行操作,如表示传送、运算、移位、跳转等操作。操作数表示操作码的操作对象。在指令中,操作数可以是常量或者变量,其中常量是指在程序运行过程中,其值不能被改变的量。变量的值可以改变。一般来说,变量都具有一个名字或标识,在内存中占据一定的存储单元,在该存储单元中存放变量的值。不论变量还是常量,操作数可以包括如下类型:整型、字符型、浮点型、数组、指针类型等。
一句指令即一行代码的操作数的数目可以是0个或整数个(例如1个、2个、3个等)。例如,表示将变量%ebp的值压入栈的指令“push%ebp”有一个操作数,是%ebp。又例如,表示将变量%esp的值传送给变量%ebp的指令“mov%esp%ebp”有两个操作数,分别是%esp和%ebp。
代码段可以看作是代码文件中能够实现相对独立功能的单元,其从其他代码段中获取的操作数,在代码段内部进行数据处理,并向后续的代码段以操作数的形式输出处理结果。其中,该代码段从其他代码段处获得的操作数称为输入操作数,代表处理结果的操作数称为输出操作数。例如,一段实现对两个操作数进行加权求和的代码段,在该代码段内部完成与公式c=0.2a+0.8b等同的数据处理,得到处理结果c。其中,a、b来自其他代码段,被称为该代码段的输入操作数,c为该代码段的输出操作数。
在一些实施例中,对代码段进行修改使得修改后的代码段的输入操作数的数量和类型与修改前的所述代码段的输入操作数的数量和类型一致,修改后的代码段的输出操作数的数量和类型与修改前的所述代码段的输出操作数的数量和类型一致。例如,原代码段的输入操作数的数目为2,操作数类型为整型,输出操作数的数目为4,操作数类型为浮点型,则修改后的代码段可以实现与原代码段不同的数据运算,如,修改后的代码段可以是与原代码段完全不同的任一其他数据运算,但是需要确保修改后的代码段的输入操作数的数目依然为2,输入操作数类型依然为整型,输出操作数的数目依然为4,输出操作数类型依然为浮点型。而原输入操作数和修改后输入操作数的值不同,原输出操作数和修改后输出操作数的值不同。
在一些实施例中,对代码段的修改可以包括对代码段中操作数的存储地址进行修改。例如,代码段中输入操作数为指向某一存储地址的指针,对代码段修改时,可以将该指针进行修改,若指针为0,可以修改为指针为1或2或其它指针,得到对不同变量进行操作的测试用可执行代码文件。
在一些实施例中,对代码段的修改可以包括对代码段中操作数的数值进行修改。例如,代码段中输入操作数包括一个表示常量的操作数,对代码段修改时,可以将该操作数的常量的值进行修改,若常量的值为333,可以修改为常量的值为23或34或其它值,得到对不同值的常量进行操作的测试用可执行代码文件。
在一些实施例中,对代码段的修改可以包括将代码段中操作码变更为相同类型的其他操作码。相同类型的操作码具有相同的操作数数量与操作数类型。例如,加、减、乘、除等操作码分别具有两个操作数,且操作数的类型都可以是浮点型、整型等,这一组操作码可以属于相同类型。而取模操作码的操作数类型只能是整型,因此加操作码与取模操作码属于不同的类型。在对可执行代码文件的代码段进行保持语法的修改时,可以使用同类型的其他操作码替代原代码段中的操作码,从而保持操作数平衡,避免变异引起语法错误。
在一些实施例中,对代码段进行修改时,可以包括对所述代码段中操作数的存储地址进行修改、对所述代码段中操作数的数值进行修改、将所述代码段中操作码变更为相同类型的其他操作码中的任意一种或多种的组合。
在一些实施例中,对代码段进行修改时,还可以对修改了存储地址的代码段继续进行任意修改,例如修改指针、常量、操作码、其它存储地址、操作数数目、操作数类型等等,依然令修改后的代码段的输入操作数的数量和类型与修改前的所述代码段的输入操作数的数量和类型一致,修改后的代码段的输出操作数的数量和类型与修改前的所述代码段的输出操作数的数量和类型一致。
在一些实施例中,可以获取可执行代码文件的可理解文本,并基于可理解文本对可执行代码文件中的至少一个代码段进行修改。可理解文本是指可执行代码文件的可理解信息,可以表示为可执行代码文件对应的可理解文本文件。例如,智能合约的源代码程序文件编译成wasm(即WebAssembly)的二进制代码程序文件即可执行代码文件后,可以将wasm的二进制代码程序文件转换为可理解的wast文本格式文件。二进制代码属于机器语言,人类难以理解,通过可理解文本可以理解可执行代码文件中,每一行代码的具体操作,因此借助可理解文本可以更好的对可执行代码文件进行变异,而避免引出语法错误。仅作为示例,可以通过wasm2wast、WABT等代码转换工具包处理可执行代码文件以获取可执行代码文件的可理解文本。
如图3中所示,源代码程序文件对应的可执行代码文件中包括一个代码段A,代码段A包括多行代码。将源代码程序文件编译为可执行代码文件后,得到代码段A对应的一组二进制代码B,通过获取可执行代码文件的可理解文本得到二进制代码B对应的wast文本格式代码段C。基于可理解文本对可执行代码文件中的至少一个代码段进行修改时,可以确定需要修改的对象和修改方式,并基于可理解文本确定需要修改的对象对应的二进制代码,和修改方式对应的替换的二进制代码,也就可以有针对性的将需要修改的二进制代码进行修改。
例如,基于wast文本格式代码段C可知,二进制代码B中,00007cf:20表示get_local,即为获取变量操作数的起始内存地址,00007d0:00表示index,即为地址偏移量的指针,因此,00007cf:20与00007d0:00联合代表第一输入操作数的内存地址;00007d1:6b表示i32.sub,即减法操作码;00007d2:41表示i32.const,即表示定义一个常量,00007d3:03表示i32 literal,即常量的值,因此,00007d2:41和00007d3:03联合代表第二输入操作数的常量值;00007d4:71表示代码段的与运算操作码,00007d5:22表示tee_local,即为将运算结果赋值到本地变量,00007d6:04表示index,为本地变量的编号,因此,00007d5:22与00007d6:04联合代表输出操作数的变量编号。即,代码段B包括两个输入操作数,类型分别是指针和常量,在代码段B内部对两个输入操作数进行运算,代码段B的输出操作数数量为1,类型是整型。
按照前述语法保持的原则,可以对代码段B进行修改,得到代码段B’,其对应wast文本格式代码段C’。代码段B’中,00007d3:03,00007cf:20代表修改后的第一输入操作数,其类型依旧是指针,00007d0:6c表示与原操作码同类型的加法操作码,0000778:53和00007d2:41联合表示修改后的第二输入操作数,其类型依旧是常量,但数值已经变化,00007d3:03表示修改后代码段新增的与运算操作码,00007d4:71和00007c7:09表示另一新增操作数,00007d5:22和00007c5:02表示修改后代码段的输出操作数,其类型依旧是整型。即,代码段B’包括两个输入操作数,类型分别是指针和常量,在代码段B内部对两个输入操作数进行相加运算,再与另一操作数进行与运算,得到处理结果并将结果赋值到输出操作数中,代码段B’的输出操作数数量为1,类型是整型。
步骤240,通过所述虚拟机执行所述测试用可执行代码文件,以对所述虚拟机进行测试。
具体的,该步骤240可以由测试模块140执行。
对虚拟机执行测试用可执行代码文件可以是将测试用可执行代码文件部署到虚拟机上,并使得测试用可执行代码文件在虚拟机上执行。通过测试用可执行代码文件在虚拟机上执行,可以得到虚拟机的测试结果。
测试结果是指虚拟机执行智能合约时的执行逻辑或处理逻辑的情况,可以包括虚拟机的智能合约执行过程数据(例如第一步打开了文件,第二步写入了数据)、执行结果数据(例如打开文件成功、打开文件失败等)、容错能力数据(例如在遇到文件不能正常打开等异常时,是否具有有效的报错、文件校验等容错能力)、应变能力数据(例如在存储空间已满的异常执行环境中,是否具有临时存储、异常上报等应变能力)等各种测试数据。
在一些实施例中,虚拟机的测试结果可以反映虚拟机的执行逻辑或处理逻辑是否存在缺陷或问题。例如,对执行错误是否有容错能力,对各种执行环境的执行或处理是否存在缺陷或问题。
在一些实施例中,还可以获取所述测试用可执行代码文件在所述虚拟机上执行时对所述虚拟机的代码覆盖率;基于所述代码覆盖率确定所述测试用可执行代码文件是否能够被所述虚拟机有效执行。具体的,该步骤可以由有效代码确定模块150执行。代码覆盖率可以是指智能合约被执行时,被该智能合约触发的虚拟机的代码部分占该虚拟机全部代码的比例。与原有的单元测试案例相比,测试用可执行代码文件的代码覆盖率越高,意味着测试用可执行代码文件能够被虚拟机越有效的执行,测试也更加高效。
在一些实施例中,可以通过对虚拟机代码采取代码插桩技术获取代码覆盖率。代码插桩技术是在被测程序代码中插入探针,然后通过探针的执行来获得程序代码的控制流和数据流信息,以此来得到程序代码的代码覆盖率。
在一些实施例中,若测试用可执行代码文件能够被所述虚拟机有效执行,则将可以所述测试用可执行代码文件保留,否则,丢弃所述测试用可执行代码文件。有效执行是指可执行代码在虚拟机上能够被输入触发执行,即代码覆盖率较高,如大于设定阈值。示例性地,设定阈值可以为30%、50%等。通过本实施例,可以进一步过滤掉无法在虚拟机上有效执行的测试用可执行代码,提高测试用可执行代码文件的有效性。
在一些实施例中,还可以对保留的测试用可执行代码文件再次修改,以获得新的测试用可执行代码文件。再次修改可以采用前述对可执行代码文件进行修改的方法,通过本实施例,可以进一步对可以实现有效测试的测试代码进行增量修改,得到保证测试有效性的更加丰富和测试覆盖面更广的测试用可执行代码文件。
本说明书实施例还提供一种计算机程序测试装置,包括至少一个存储介质和至少一个处理器,所述至少一个存储介质用于存储计算机指令;所述至少一个处理器用于执行所述计算机指令以实现区块链虚拟机的测试方法,方法包括:获取智能合约的源代码程序文件;对所述源代码程序文件进行编译,得到能够被虚拟机执行的可执行代码文件;对所述可执行代码文件中的至少一个代码段进行修改得到所述测试用可执行代码文件;其中,代码段包括一行或多行代码;所述修改使得修改后的代码段的输入操作数的数量和类型与修改前的所述代码段的输入操作数的数量和类型一致,修改后的代码段的输出操作数的数量和类型与修改前的所述代码段的输出操作数的数量和类型一致;通过所述虚拟机执行所述测试用可执行代码文件,以对所述虚拟机进行测试。
本说明书实施例可能带来的有益效果包括但不限于:(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%的变化。相应地,在一些实施例中,说明书和权利要求中使用的数值参数均为近似值,该近似值根据个别实施例所需特点可以发生改变。在一些实施例中,数值参数应考虑规定的有效数位并采用一般位数保留的方法。尽管本说明书一些实施例中用于确认其范围广度的数值域和参数为近似值,在具体实施例中,此类数值的设定在可行范围内尽可能精确。
针对本说明书引用的每个专利、专利申请、专利申请公开物和其他材料,如文章、书籍、说明书、出版物、文档等,特此将其全部内容并入本说明书作为参考。与本说明书内容不一致或产生冲突的申请历史文件除外,对本说明书权利要求最广范围有限制的文件(当前或之后附加于本说明书中的)也除外。需要说明的是,如果本说明书附属材料中的描述、定义、和/或术语的使用与本说明书所述内容有不一致或冲突的地方,以本说明书的描述、定义和/或术语的使用为准。
最后,应当理解的是,本说明书中所述实施例仅用以说明本说明书实施例的原则。其他的变形也可能属于本说明书的范围。因此,作为示例而非限制,本说明书实施例的替代配置可视为与本说明书的教导一致。相应地,本说明书的实施例不仅限于本说明书明确介绍和描述的实施例。

Claims (12)

1.一种区块链虚拟机的测试方法,包括:
获取智能合约的源代码程序文件;
对所述源代码程序文件进行编译,得到能够被虚拟机执行的可执行代码文件;
对所述可执行代码文件中的至少一个代码段进行修改得到测试用可执行代码文件;其中,代码段包括一行或多行代码;所述修改使得修改后的代码段的输入操作数的数量和类型与修改前的所述代码段的输入操作数的数量和类型一致,修改后的代码段的输出操作数的数量和类型与修改前的所述代码段的输出操作数的数量和类型一致;
通过虚拟机执行所述测试用可执行代码文件,以对所述虚拟机进行测试。
2.如权利要求1所述的方法,所述对所述可执行代码文件中的至少一个代码段进行修改得到所述测试用可执行代码文件包括:
获取所述可执行代码文件的可理解文本,所述可理解文本用于帮助理解所述可执行代码文件中代码的操作;
基于所述可理解文本对所述可执行代码文件中的至少一个代码段进行修改。
3.如权利要求1所述的方法,所述修改包括以下中的一种或多种:
对所述代码段中操作数的存储地址进行修改、对所述代码段中操作数的数值进行修改、将所述代码段中操作码变更为相同类型的其他操作码;其中,相同类型的操作码具有相同的操作数数量与操作数类型。
4.如权利要求1所述的方法,还包括:
获取所述测试用可执行代码文件在虚拟机上执行时对所述虚拟机的代码覆盖率;
基于所述代码覆盖率确定所述测试用可执行代码文件是否能够被所述虚拟机有效执行;
若能够被有效执行,则将所述测试用可执行代码文件保留,否则,丢弃所述测试用可执行代码文件。
5.如权利要求4所述的方法,还包括:
对保留的测试用可执行代码文件再次修改,以获得新的测试用可执行代码文件。
6.一种区块链虚拟机的测试系统,包括:
源代码获取模块:用于获取智能合约的源代码程序文件;
可执行代码获取模块:用于对所述源代码程序文件进行编译,得到能够被虚拟机执行的可执行代码文件;
测试文件确定模块:用于对所述可执行代码文件中的至少一个代码段进行修改得到测试用可执行代码文件;其中,代码段包括一行或多行代码;所述修改使得修改后的代码段的输入操作数的数量和类型与修改前的所述代码段的输入操作数的数量和类型一致,修改后的代码段的输出操作数的数量和类型与修改前的所述代码段的输出操作数的数量和类型一致;
测试模块:用于通过所述虚拟机执行所述测试用可执行代码文件,以对所述虚拟机进行测试。
7.如权利要求6所述的系统,所述测试文件确定模块还用于:
获取所述可执行代码文件的可理解文本,所述可理解文本用于帮助理解所述可执行代码文件中代码的操作;
基于所述可理解文本对所述可执行代码文件中的至少一个代码段进行修改。
8.如权利要求6所述的系统,所述修改包括以下中的一种或多种:
对所述代码段中操作数的存储地址进行修改、对所述代码段中操作数的数值进行修改、将所述代码段中操作码变更为相同类型的其他操作码;其中,相同类型的操作码具有相同的操作数数量与操作数类型。
9.如权利要求6所述的系统,还包括有效代码确定模块,用于:
获取所述测试用可执行代码文件在所述虚拟机上执行时对所述虚拟机的代码覆盖率;
基于所述代码覆盖率确定所述测试用可执行代码文件是否能够被所述虚拟机有效执行;
若能够被有效执行,则将所述测试用可执行代码文件保留,否则,丢弃所述测试用可执行代码文件。
10.如权利要求9所述的系统,所述有效代码确定模块还用于:
对保留的测试用可执行代码文件再次修改,以获得新的测试用可执行代码文件。
11.一种区块链虚拟机的测试装置,包括至少一个存储介质和至少一个处理器,所述至少一个存储介质用于存储计算机指令;所述至少一个处理器用于执行所述计算机指令以实现如权利要求1-5任一项所述的方法。
12.一种区块链虚拟机的测试方法,包括:
获取智能合约的源代码程序文件;
对所述源代码程序文件进行编译,得到智能合约的字节码文件;
获取所述字节码文件的可理解文本,所述可理解文本用于帮助理解所述字节码文件中代码的操作;
基于所述可理解文本对所述字节码文件中的至少一个代码段进行以下中的一种或多种修改得到测试用字节码文件:对所述代码段中操作数的存储地址进行修改、对所述代码段中操作数的数值进行修改、将所述代码段中操作码变更为相同类型的其他操作码;其中,代码段包括一行或多行代码,相同类型的操作码具有相同的操作数数量与操作数类型;
通过虚拟机执行所述测试用字节码文件,以对所述虚拟机进行测试。
CN202110087607.8A 2021-01-22 2021-01-22 一种区块链虚拟机的测试方法和系统 Active CN112905447B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110087607.8A CN112905447B (zh) 2021-01-22 2021-01-22 一种区块链虚拟机的测试方法和系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110087607.8A CN112905447B (zh) 2021-01-22 2021-01-22 一种区块链虚拟机的测试方法和系统

Publications (2)

Publication Number Publication Date
CN112905447A CN112905447A (zh) 2021-06-04
CN112905447B true CN112905447B (zh) 2021-10-26

Family

ID=76117034

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110087607.8A Active CN112905447B (zh) 2021-01-22 2021-01-22 一种区块链虚拟机的测试方法和系统

Country Status (1)

Country Link
CN (1) CN112905447B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113472512A (zh) * 2021-06-10 2021-10-01 东软集团股份有限公司 智能合约执行方法、装置、存储介质及电子设备
CN113377679A (zh) * 2021-07-13 2021-09-10 北京乐学帮网络技术有限公司 代码确定方法、装置、电子设备和存储介质
CN113282517A (zh) * 2021-07-21 2021-08-20 支付宝(杭州)信息技术有限公司 一种智能合约代码的质量评估系统
CN115080978A (zh) * 2022-05-20 2022-09-20 南方科技大学 一种基于模糊测试的运行时漏洞检测方法及系统

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104965777B (zh) * 2015-02-04 2019-02-05 腾讯科技(深圳)有限公司 一种安全测试的方法、装置及系统
CN110764870B (zh) * 2019-09-30 2024-01-09 腾讯科技(深圳)有限公司 一种虚拟机逃逸漏洞挖掘方法、装置、设备及介质
CN112015628B (zh) * 2020-09-01 2023-06-30 北京物资学院 一种智能合约函数级动态监测分析系统及实现方法
CN112148613A (zh) * 2020-09-28 2020-12-29 财付通支付科技有限公司 用于测试区块链服务的智能合约的生成方法及装置

Also Published As

Publication number Publication date
CN112905447A (zh) 2021-06-04

Similar Documents

Publication Publication Date Title
CN112905447B (zh) 一种区块链虚拟机的测试方法和系统
Zhao et al. Formalizing the LLVM intermediate representation for verified program transformations
Myreen Verified just-in-time compiler on x86
CN107526625B (zh) 一种基于字节码检查的Java智能合约安全检测方法
US20120233601A1 (en) Recompiling with Generic to Specific Replacement
WO2014106000A1 (en) Extending a development environment
US7941792B2 (en) System and method for compiling program code ahead of time
US11314863B2 (en) Behavioral threat detection definition and compilation
US9459986B2 (en) Automatic generation of analysis-equivalent application constructs
US12039038B2 (en) Behavioral threat detection definition and compilation
Verbeek et al. Sound C code decompilation for a subset of x86-64 binaries
US20070038894A1 (en) Test Data verification with different granularity levels
Goel et al. Automated code proofs on a formal model of the x86
Monniaux et al. Testing a Formally Verified Compiler
Tanaka et al. Safe low-level code generation in Coq using monomorphization and monadification
JP2022522880A (ja) プログラム論理の表現を生成する方法、逆コンパイル装置、再コンパイルシステムおよびコンピュータプログラム製品
Dalsgaard et al. Private memory allocation analysis for safety-critical Java
CN114174983B (zh) 用于高级构造的优化的自动验证的方法和系统
KR102117165B1 (ko) 바이너리 분석을 위한 중간 언어 테스트 방법 및 장치
CN114327497A (zh) 一种代码处理方法、装置及设备
US10521204B2 (en) Existential type packing for structurally-restricted existential types
Brauer et al. Source-code-to-object-code traceability analysis for avionics software: Don’t trust your compiler
Heinen et al. Juggrnaut–an abstract JVM
Asryan et al. Dynamic Detection of Use-After-Free Bugs
Kananizadeh et al. Development of dynamic protection against timing channels

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