用于智能合约的调试方法、调试设备和调试系统技术方案

技术编号:33036048 阅读:10 留言:0更新日期:2022-04-15 09:14
本说明书实施例提供一种用于智能合约的调试方法、调试设备和调试系统。调试方法包括:获取智能合约的包括调试信息的第一字节码程序文件,或者智能合约的第一字节码程序文件以及包括调试信息的调试信息文件;对第一字节码程序文件进行修改,以产生包含用于调用中断处理函数的第一指令和用于调用堆栈维护函数的第二指令的第二字节码程序文件;对第二字节码程序文件进行编译,以产生机器码程序文件;以及根据断点信息和调试命令,以调试状态来执行机器码程序文件,并结合函数列表信息和映射信息对智能合约进行调试。息对智能合约进行调试。息对智能合约进行调试。

【技术实现步骤摘要】
用于智能合约的调试方法、调试设备和调试系统


[0001]本说明书实施例属于区块链
,尤其涉及一种用于智能合约的调试方法、调试设备和调试系统。

技术介绍

[0002]区块链技术构建在传输网络(例如点对点网络)之上。传输网络中的网络节点利用链式数据结构来验证与存储数据,并采用分布式节点共识算法来生成和更新数据。区块链2.0时代中出现了智能合约,将区块链的应用范围提升到了一个新高度。有了智能合约,区块链能实现的不再是单一的转账交易,而是还可以实现用户自定义的其他功能。在用户开发智能合约的过程中,通常需要对智能合约进行调试,因此存在对可靠且高效的用于智能合约的调试方法的需求。

技术实现思路

[0003]本专利技术的目的在于提供一种用于智能合约的调试方法、调试设备和调试系统,以便可靠且高效地调试智能合约。
[0004]根据本说明书一个或多个实施例的第一方面,提供了一种用于智能合约的调试方法,包括:
[0005]虚拟机获取所述智能合约的包括调试信息的第一字节码程序文件,或者所述虚拟机获取所述智能合约的第一字节码程序文件以及包括调试信息的调试信息文件,其中,所述调试信息包括所述智能合约的源码与字节码之间的映射信息以及函数列表信息;
[0006]在所述虚拟机中对所述第一字节码程序文件进行修改,以产生包含用于调用中断处理函数的第一指令和用于调用堆栈维护函数的第二指令的第二字节码程序文件,并相应地修改所述映射信息,其中,所述中断处理函数用于确定是否在其所在的当前运行位置处中断运行,所述堆栈维护函数用于记录在其所在的当前运行位置处的函数调用状态;
[0007]在所述虚拟机中对所述第二字节码程序文件进行编译,以产生机器码程序文件;以及
[0008]根据所述虚拟机获取的断点信息和调试命令,在所述虚拟机中以调试状态来执行所述机器码程序文件,并结合所述函数列表信息和所述映射信息对所述智能合约进行调试。
[0009]根据本说明书一个或多个实施例的第二方面,提供了一种用于智能合约的调试设备,包括处理器和存储器,所述存储器上存储有指令,当所述指令被所述处理器执行时,实现如上所述的调试方法的步骤。
[0010]根据本说明书一个或多个实施例的第三方面,提供了一种用于智能合约的调试系统,包括虚拟机,所述虚拟机包括:
[0011]获取模块,所述获取模块被配置为获取所述智能合约的包括调试信息的第一字节码程序文件,或者获取所述智能合约的第一字节码程序文件以及包括调试信息的调试信息
文件,其中,所述调试信息包括所述智能合约的源码与字节码之间的映射信息以及函数列表信息;
[0012]修改模块,所述修改模块被配置为对所述第一字节码程序文件进行修改,以产生包含用于调用中断处理函数的第一指令和用于调用堆栈维护函数的第二指令的第二字节码程序文件,并相应地修改所述映射信息,其中,所述中断处理函数用于确定是否在其所在的当前运行位置处中断运行,所述堆栈维护函数用于记录在其所在的当前运行位置处的函数调用状态;
[0013]编译模块,所述编译模块被配置为在所述虚拟机中对所述第二字节码程序文件进行编译,以产生机器码程序文件;以及
[0014]执行模块,所述执行模块被配置为根据所述获取模块获取的断点信息和调试命令,以调试状态来执行所述机器码程序文件,并结合所述函数列表信息和所述映射信息对所述智能合约进行调试。
附图说明
[0015]为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0016]图1是本说明书一实施例中用于智能合约的调试方法的流程图;
[0017]图2是本说明书一实施例中用于智能合约的调试方法的步骤S300的流程图;
[0018]图3是本说明书一实施例中用于智能合约的调试方法的步骤S700的流程图;
[0019]图4是本说明书一实施例中用于智能合约的调试方法的步骤S770的流程图;
[0020]图5是本说明书另一实施例中用于智能合约的调试方法的步骤S770的流程图;
[0021]图6是本说明书一实施例中用于智能合约的调试设备的框图;
[0022]图7是本说明书一实施例中用于智能合约的调试系统的框图。
具体实施方式
[0023]为了使本
的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本说明书保护的范围。
[0024]区块链一般可以被划分为三种类型:公有链(Public Blockchain),私有链(PrivateBlockchain)和联盟链(Consortium Blockchain)。此外,还有多种类型的结合,比如私有链+联盟链、联盟链+公有链等不同组合形式。其中去中心化程度最高的是公有链。加入公有链的参与者可以读取链上的数据记录、参与交易以及竞争新区块的记账权等。而且,各参与者(即节点)可自由加入以及退出网络,并进行相关操作。私有链则相反,该网络的写入权限由某个组织或者机构控制,数据读取权限受组织规定。简单来说,私有链可以为一个弱中心化系统,参与节点具有严格限制且少。这种类型的区块链更适合于特定机构内部使
用。联盟链则是介于公有链以及私有链之间的区块链,可实现“部分去中心化”。联盟链中各个节点通常有与之相对应的实体机构或者组织;参与者通过授权加入网络并组成利益相关联盟,共同维护区块链运行。
[0025]不论是公有链、私有链还是联盟链,都可能提供智能合约的功能。区块链上的智能合约是在区块链系统上可以被交易触发执行的合约。智能合约可以通过代码的形式定义。智能合约可以以规定的方式在区块链网络中每个节点独立的执行,所有执行记录和数据都保存在区块链上,所以当这样的交易完成后后,区块链上就保存了无法篡改、不会丢失的交易凭证。
[0026]在支持智能合约的区块链(例如,蚂蚁链)中,支持用户在区块链网络中创建并调用一些复杂的逻辑。一个可编程区块链的核心是虚拟机,每个区块链节点都可以运行这个虚拟机。虚拟机可以是图灵完备的,这意味着可以通过它实现各种复杂的逻辑。用户在区块链中发布和调用智能合约就是在虚拟机上运行的。实际上,虚拟机直接运行的是虚拟机代码(虚拟机字节码,下简称“字节码”)。部署在区块链上的智能合约可以是字节码的形式。在本说明书一个或多个实施例中,虚拟机可以是WASM虚拟机,相应地,本说明书一个或多个实施例中涉及的字节码程序文件(例如,下文所述的第一字节码程序文件和第二字节码程序文件)可以是WASM文件。其中,WASM是WebAssembl本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种用于智能合约的调试方法,包括:虚拟机获取所述智能合约的包括调试信息的第一字节码程序文件,或者所述虚拟机获取所述智能合约的第一字节码程序文件以及包括调试信息的调试信息文件,其中,所述调试信息包括所述智能合约的源码与字节码之间的映射信息以及函数列表信息;在所述虚拟机中对所述第一字节码程序文件进行修改,以产生包含用于调用中断处理函数的第一指令和用于调用堆栈维护函数的第二指令的第二字节码程序文件,并相应地修改所述映射信息,其中,所述中断处理函数用于确定是否在其所在的当前运行位置处中断运行,所述堆栈维护函数用于记录在其所在的当前运行位置处的函数调用状态;在所述虚拟机中对所述第二字节码程序文件进行编译,以产生机器码程序文件;以及根据所述虚拟机获取的断点信息和调试命令,在所述虚拟机中以调试状态来执行所述机器码程序文件,并结合所述函数列表信息和所述映射信息对所述智能合约进行调试。2.根据权利要求1所述的调试方法,其中,所述虚拟机为WASM虚拟机,且所述第一字节码程序文件和所述第二字节码程序文件均为WASM文件。3.根据权利要求1所述的调试方法,其中,所述映射信息包括所述智能合约的源码的行号与相应的字节码的行号之间的映射关系。4.根据权利要求1所述的调试方法,其中,所述函数列表信息包括所述智能合约中的函数的名称、函数的词法作用域、变量的名称、变量的数据类型、变量的词法作用域、变量的索引、参数的名称和参数的索引中的至少一者。5.根据权利要求1所述的调试方法,其中,在所述虚拟机中对所述第一字节码程序文件进行修改,以产生包含用于调用中断处理函数的第一指令和用于调用堆栈维护函数的第二指令的第二字节码程序文件包括在所述虚拟机的调试器线程中执行以下操作:将所述第一字节码程序文件划分成一个或多个函数;针对所述一个或多个函数中的每个函数,分别执行以下操作:将函数划分成一个或多个基本块,使得该函数中的每条指令被包括且仅被包括在所述一个或多个基本块中的相应的一个基本块中,其中,每个基本块包括一条或多条指令,且一旦基本块被运行,包含在该基本块中的所有的指令被全部运行;以及在函数中的每个基本块的头部加入所述第一指令。6.根据权利要求5所述的调试方法,其中,将函数划分成一个或多个基本块,使得该函数中的每条指令被包括且仅被包括在所述一个或多个基本块中的相应的一个基本块中包括:查找函数中的所有非线性运行指令;以及根据查找到的非线性运行指令,将函数划分成一个或多个基本块,其中,每个非线性运行指令为其所在的基本块中的最后一条指令。7.根据权利要求6所述的调试方法,其中,所述非线性运行指令包括跳转指令、函数调用指令和修改变量值的存储类指令中的至少一者。8.根据权利要求5所述的调试方法,其中,在所述虚拟机中对所述第一字节码程序文件进行修改,以产生包含用于调用中断处理函数的第一指令和用于调用堆栈维护函数的第二指令的第二字节码程序文件还包括在所述虚拟机的调试器线程中执行以下操作:在所述一个或多个函数中的每个函数的所有入口和出口之前加入所述第二指令。
9.根据权利要求1所述的调试方法,其中,相应地修改所述映射信息包括在所述虚拟机的调试器线程中执行以下操作:将所述映射信息中的所述智能合约的源码与所述第一字节码程序文件的字节码之间的第一映射关系修改为所述智能合约的源码与所述第二字节码程序文件的字节码之间的第二映射关系。10.根据权利要求1所述的调试方法,其中,在所述虚拟机中对所述第二字节码程序文件进行编译,以产生机器码程序文件包括:所述虚拟机中的字节码编译器对所述第二字节码程序文件进行即时编译,以产生所述机器码程序文件。11.根据权利要求1所述的调试方法,其中,根据所述虚拟机获取的断点信息和调试命令,在所述虚拟机中以调试状态来执行所述机器码程序文件,并结合所述函数列表信息和所述映射信息对所述智能合约进行调试包括:在所述虚拟机的调试器线程中获取来自用户的断点信息;在所述虚拟机中运行所述机器码程序文件,直至所述中断处理函数基于所述断点信息使所述虚拟机的程序运行线程中断并处于所述调试器线程中;在所述调试器线程中获取来自用户的调试命令;以及根据所述调试命令,结合所述函数列表信息和所述映射信息对所述智能合约进行调试。12.根据权利要求11所述的调试方法,其中,在所述虚拟机的调试器线程中获取来自用户的断点信息包括:在所述机器码程序文件运行之前,在所述调试器线程中获取来自用户的初始的断点信息;和/或在所述机器码程序文件被中断时,在所述调试器线程中获取来自用户的修改的断点信息。13.根据权利要求11所述的调试方法,其中,所述第二字节码程序文件中的与每个第一指令相关联的程序块分别具有唯一地表示该程序块的程序块标识以及用于确定在该程序块处是否要中断的中断指示标识,且所有程序块的程序块标识及其相应的中断指示标识被记录在断点信息位图中。14.根据权利要求13所述的调试方法,其中,所述中断处理函数被配置为在所述虚拟机的调试器线程中执行以下操作:读取所述断点信息位图中的当前程序块的相应的中断指示标识;当根据所述中断指示标识确定在当前程序块处要中断时,使所述虚拟机处于所述调试器线程中;以及当根据所述中断指示标识确定在当前程序块处不要中断时,使所述虚拟机处于所述程序运行线程中,直至运行到与下一个第一指令相关联的程序块,并返回读取所述断点信息位图中的当前程序块的相应的中断指示标识的步骤。15.根据权利要求13所述的调试方法,其中,当所述虚拟机获取到来自用户的修改的断点信息时,相应地修改所述断点信息位图。16.根据权利要求11所述的调试方法,其中,所述堆栈维护函数被配置为在所述虚拟机
的调试器线程中执行以下操作:在当前运行位置为函数的入口时,向函数调用栈压栈与当前运行位置相关联的记录;以及在当前运行位置为函数的出口时,从所述函数调用栈出栈与当前运行位置相关联的记录。17.根据权利要求16所述的调试方法,其中,与当前运行位置相关联的记录包括当前运行位置处的指令的行号。18.根据权利要求16所述的调试方法,其中,所述调试命令包括行进命令,根据所述调试命令,结合所述函数列表信息和所述映射信息对所述智能合约进行调试包括:在所述调试器线程中记录在获取到所述行进命令时的函数调用栈的栈桢深度;在所述调试器线程中根据所记录的栈桢深度和所述行进命令来修改最大调试栈桢深度和最小调试栈桢深度,其中,所述虚拟机的程序运行线程仅在当前栈桢深度大于或等于最小调试栈桢深度、且小于或等于最大调试栈桢深度的情况下运行;以及中断所述调试器线程并进入所述程序运行线程以运行所述机器码程序文件,直至所述程序运行线程基于所修改的最小调试栈桢深度和最大调试栈桢深度再次中断并重新进入所述调试器线程。19.根据权利要求18所述的调试方法,其中,当所记录的栈桢深度为n、所述行进命令为step over命令时,最小调试栈桢深度被修改为(n+1),最大调试栈桢深度被修改为对应于无穷大,其中,所述step over命令用于使所述程序运行线程在进行到对应于所述第二字节码程序文件中的下一个要中断的位置处中断,或使所述程序运行线程在进行到对应于智能合约的源码中的不是调用当前函数的子函数的下一条指令时中断,或使所述程序运行线程进行到引用当前函数的上一级父函数时中断。20.根据权利要求18所述的调试方法,其中,当所记录的栈桢深度为n、所述行进命令为step out命令时,最小调试栈桢深度被修改为n,最大调试栈桢深度被修改为对应于无穷大,其中,所述step out命令用于使所述程序运行线程在进行到对应于所述第二字节码程序文件中的下一个要中断的位置处中断,或使所述程序运行线程进行到引用当前函数的上一级父函数时中断。21.根据权利要求18所述的调试方法,其中,当所述行进命令为step in命令时,最小调试栈桢深度被修改为大于最大调试栈桢深度,其中,所述step in命令用于使所述程序运行...

【专利技术属性】
技术研发人员:周维
申请(专利权)人:蚂蚁区块链科技上海有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1