【技术实现步骤摘要】
用于智能合约的调试方法、调试设备和调试系统
[0001]本说明书实施例属于区块链
,尤其涉及一种用于智能合约的调试方法、调试设备和调试系统。
技术介绍
[0002]区块链技术构建在传输网络(例如点对点网络)之上。传输网络中的网络节点利用链式数据结构来验证与存储数据,并采用分布式节点共识算法来生成和更新数据。区块链2.0时代中出现了智能合约,将区块链的应用范围提升到了一个新高度。有了智能合约,区块链能实现的不再是单一的转账交易,而是还可以实现用户自定义的其他功能。在用户开发智能合约的过程中,通常需要对智能合约进行调试,因此存在对可靠且高效的用于智能合约的调试方法的需求。
技术实现思路
[0003]本专利技术的目的在于提供一种用于智能合约的调试方法、调试设备和调试系统,以便可靠且高效地调试智能合约。
[0004]根据本说明书一个或多个实施例的第一方面,提供了一种用于智能合约的调试方法,包括:
[0005]虚拟机获取所述智能合约的包括调试信息的第一字节码程序文件,或者所述虚拟机获取所述智能合约的第一字节码程序文件以及包括调试信息的调试信息文件,其中,所述调试信息包括所述智能合约的源码与字节码之间的映射信息以及函数列表信息;
[0006]在所述虚拟机中对所述第一字节码程序文件进行修改,以产生包含用于调用中断处理函数的第一指令和用于调用堆栈维护函数的第二指令的第二字节码程序文件,并相应地修改所述映射信息,其中,所述中断处理函数用于确定是否在其所在的当前运行位置处中断运行,所述堆栈维 ...
【技术保护点】
【技术特征摘要】
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命令用于使所述程序运行...
【专利技术属性】
技术研发人员:周维,
申请(专利权)人:蚂蚁区块链科技上海有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。