本公开涉及计算机,特别涉及一种智能合约编译方法、系统、电子设备和目标代码运行方法。
背景技术:
1、随着区块链技术的迅速发展,基于区块链的智能合约应用成为趋势。为了提升智能合约执行效率且支持跨平台执行,相关技术中提出了一种将基于栈的虚拟机集成在目标平台并利用基于栈的虚拟机来执行智能合约的方案;其中,鉴于虚拟机没有物理寄存器,故需要编译器将智能合约编译为不依靠寄存器且基于栈的虚拟机能够理解和执行的指令序列(例如,对栈进行压栈push、弹栈pop等操作的指令),虚拟机在逐条执行这些指令时,会按照指令集中的定义对栈进行操作,从而完成智能合约的功能。然而,在实际应用中发现,这种处理方式下智能合约的执行性能偏低,且无法满足支持编译复杂逻辑的合约代码。
技术实现思路
1、第一方面,本公开实施例提供了一种智能合约编译方法,所述编译方法基于编译系统,所述编译系统包括编译前端和编译后端,所述编译方法包括:
2、所述编译前端将目标智能合约转换为对应的第一中间代码,所述第一中间代码中记载有各局部变量在对应栈帧中的偏移位置;
3、所述编译前端生成目标智能合约的运行环境初始化配置信息,并将所述运行环境初始化配置信息转换为对应的第二中间代码,所述运行环境初始化配置信息记载有内存分配信息,所述内存分配信息包括:第一配置信息,所述第一配置信息用于指示内存空间进行初始化时在所述内存空间内划分有虚拟寄存器区、栈区和堆区,所述虚拟寄存器区中的存储槽用作为虚拟寄存器;
4、所述编译前端生成虚拟寄存器配置信息,并将所述虚拟寄存器配置信息转换为对应的寄存器配置中间代码,所述虚拟寄存器配置信息中记载有将所述虚拟寄存器区中的两个预设固定位置处的存储槽分别用作为栈帧寄存器和栈指针寄存器;
5、所述编译前端将中间代码集发送至所述编译后端,所述中间代码集包括:所述第一中间代码、第二中间代码和所述寄存器配置中间代码;
6、所述编译后端将所述寄存器配置中间代码编译为对应的寄存器配置目标代码;
7、所述编译后端将所述第二中间代码编译为对应的第二目标代码;
8、所述编译后端将所述第一中间代码编译为基于对栈帧寄存器和栈指针寄存器操作的第一目标代码。
9、在一些实施例中,所述编译后端将所述第一中间代码编译为基于对栈帧寄存器和栈指针寄存器操作的第一目标代码的步骤包括:
10、所述编译后端识别所述第一中间代码中各函数方法的定义信息和调用信息;
11、所述编译后端将所述第一中间代码中的第一个函数方法作为待处理函数方法,所述编译后端根据所述待处理函数方法的定义信息和调用信息生成对应的栈帧布局,以及对所述待处理函数方法中变量进行寄存器分配;
12、所述编译后端根据所述待处理函数方法的栈帧布局以及变量的寄存器分配结果生成对应的基于对栈帧寄存器和栈指针寄存器操作的指令序列;
13、所述编译后端确定虚拟机执行所述待处理函数方法时所对应的当前栈深度;
14、所述编译后端判断所述待处理函数方法所对应的当前栈深度是否大于预设深度阈值;
15、若判断出所述当前栈深度大于所述预设深度阈值,则所述编译后端中止编译;
16、若判断出所述当前栈深度小于或等于所述预设深度阈值,则所述编译后端检测所述待处理函数方法是否为所述第一目标代码中最后一个函数方法;
17、若检测出所述待处理函数方法不是所述第一目标代码中最后一个函数方法,则将所述待处理函数方法的下一个函数方法作为新的待处理函数方法,再次执行所述编译后端根据所述待处理函数方法的定义信息和调用信息生成对应的栈帧布局的步骤;
18、若检测出所述待处理函数方法是所述第一目标代码中最后一个函数方法,则表示编译完成。
19、在一些实施例中,在所述编译后端将所述第一中间代码编译为基于对栈帧寄存器和栈指针寄存器操作的第一目标代码步骤之前,还包括:
20、所述编译后端将当前栈深度初始化取值为0;
21、所述编译后端确定虚拟机执行所述待处理函数方法时所对应的当前栈深度的步骤包括:
22、所述编译后端记录所述待处理函数方法所产生操作数的数量a和所消耗的操作数的数量b;
23、所述编译后端对所述当前栈深度进行更新以得到虚拟机执行所述待处理函数方法时所对应的当前栈深度;其中,更新后的当前栈深度等于更新前的当前栈深度加上所述待处理函数方法所产生操作数的数量a再减去所述待处理函数方法所消耗的操作数的数量b。
24、在一些实施例中,在所述编译后端将所述第一中间代码编译为基于对栈帧寄存器和栈指针寄存器操作的第一目标代码的步骤之前,和/或在所述编译后端将所述第一中间代码编译为基于对栈帧寄存器和栈指针寄存器操作的第一目标代码的过程中,还包括:
25、所述编译后端对所述第一中间代码进行代码优化。
26、在一些实施例中,所述第一配置信息还用于指示将内存空间内的前n个存储槽作为虚拟寄存器区,其中n≥2;
27、所述内存空间内第1个存储槽用作为所述栈帧寄存器,所述内存空间内第2个存储槽用作为栈指针寄存器。
28、在一些实施例中,所述寄存器配置中间代码位于所述中间代码集的最前端位置;
29、所述虚拟寄存器配置信息中还记载有所述栈帧寄存器的初始值为所述栈区的起始地址。
30、在一些实施例中,在所述编译前端将目标智能合约转换为对应的第一中间代码的步骤之前,还包括:
31、所述编译前端确定所述目标智能合约中的目标持久化元素,所述目标持久化元素包括:状态变量、字符串常量和/或内嵌字节码;
32、所述编译前端将各所述目标持久化元素分别声明为全局变量并生成全局变量记录信息,以及将所述全局变量记录信息转化为对应的第三中间代码,所述全局变量记录信息记载有各全局变量的声明信息、各全局变量分别所占用空间大小以及内存空间进行初始化时所划分出的全局变量区的空间大小;
33、所述第一配置信息还用于指示内存空间进行初始化时在所述内存空间内还划分有全局变量区,且所述虚拟寄存器区、所述栈区、所述全局变量区和所述堆区四者在所述内存空间内由低地址向高地址的方向依次设置;
34、所述内存分配信息还包括:第二配置信息,所述第二配置信息用于指示将从目标智能合约中所确认出的全局变量的编码数据拷贝至所述全局变量区;
35、所述中间代码集还包括所述第三中间代码。
36、第二方面,本公开实施例中还提供了一种智能合约编译系统,所述编译系统配置为能够实现如第一方面中提供的所述编译方法,所述编译系统包括:编译前端和编译后端;
37、所述编译前端用于将目标智能合约转换为对应的第一中间代码,所述第一中间代码中记载有各局部变量在对应栈帧中的偏移位置;以及,还用于生成目标智能合约的运行环境初始化配置信息,并将所述运行环境初始化配置信息转换为对应的第二中间代码,所述运行环境初始化配置信息记载有内存分配信息,所述内存分配信息包括:第一配置信息,所述第一配置信息用于指示内存空间进行初始化时在所述内存空间内划分有虚拟寄存器区、栈区和堆区,所述虚拟寄存器区中的存储槽用作为虚拟寄存器;以及,还用于生成虚拟寄存器配置信息,并将所述虚拟寄存器配置信息转换为对应的寄存器配置中间代码,所述虚拟寄存器配置信息中记载有将所述虚拟寄存器区中的两个预设固定位置处的存储槽分别用作为栈帧寄存器和栈指针寄存器;以及,还用于将中间代码集发送至所述编译后端,所述中间代码集包括:所述第一中间代码、第二中间代码和所述寄存器配置中间代码;
38、所述编译后端用于将所述寄存器配置中间代码编译为对应的寄存器配置目标代码;以及,还用于所述编译后端将所述第二中间代码编译为对应的第二目标代码;以及,还用于将所述第一中间代码编译为基于对栈帧寄存器和栈指针寄存器操作的第一目标代码。
39、第三方面,本公开实施例还提供了一种电子设备,其中,包括:
40、一个或多个处理器;
41、存储器,用于存储一个或多个程序;
42、当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如第一方面中提供的所述智能合约编译方法。
43、第四方面,本公开实施例还提供了一种智能合约的目标代码运行方法,用于对如第一方面中提供的所述智能合约编译方法所生成的目标代码进行运行,所述智能合约的目标代码运行方法包括:
44、在进行内存空间初始化时,根据第二目标代码中的第一配置信息所对应的可执行代码在所述内存空间内划分出虚拟寄存器区、栈区和堆区,以及根据所述寄存器配置目标代码将所述虚拟寄存器区中的两个预设固定位置处的存储槽配置为栈帧寄存器和栈指针寄存器;
45、在程序运行时,执行所述第一目标代码,其中在执行目标函数方法的指令序列时,先在帧区内生成所述目标函数方法的栈帧,然后通过将栈帧寄存器中所记载的所述目标函数方法的栈帧的起始地址加上待处理变量的偏移位置得到待处理变量的最终地址,以及根据所述最终地址来对所述待处理变量进行存储或取出操作。
1.一种智能合约编译方法,其特征在于,所述编译方法基于编译系统,所述编译系统包括编译前端和编译后端,所述编译方法包括:
2.根据权利要求1所述的编译方法,其特征在于,所述编译后端将所述第一中间代码编译为基于对栈帧寄存器和栈指针寄存器操作的第一目标代码的步骤包括:
3.根据权利要求2所述的编译方法,其特征在于,在所述编译后端将所述第一中间代码编译为基于对栈帧寄存器和栈指针寄存器操作的第一目标代码步骤之前,还包括:
4.根据权利要求1所述的编译方法,其特征在于,在所述编译后端将所述第一中间代码编译为基于对栈帧寄存器和栈指针寄存器操作的第一目标代码的步骤之前,和/或在所述编译后端将所述第一中间代码编译为基于对栈帧寄存器和栈指针寄存器操作的第一目标代码的过程中,还包括:
5.根据权利要求1所述的编译方法,其特征在于,所述第一配置信息还用于指示将内存空间内的前n个存储槽作为虚拟寄存器区,其中n≥2;
6.根据权利要求1所述的编译方法,其特征在于,所述寄存器配置中间代码位于所述中间代码集的最前端位置;
7.根据权利要求1所述的编译方法,其特征在于,在所述编译前端将目标智能合约转换为对应的第一中间代码的步骤之前,还包括:
8.一种智能合约编译系统,其特征在于,所述编译系统配置为能够实现如权利要求1至7中任一所述编译方法,所述编译系统包括:编译前端和编译后端;
9.一种电子设备,其特征在于,包括:
10.一种智能合约的目标代码运行方法,其特征在于,用于对如权利要求1-7中任一所述智能合约编译方法所生成的目标代码进行运行,所述运行方法包括: