本公开涉及计算机,特别涉及一种智能合约编译方法、系统、电子设备和目标代码运行方法。
背景技术:
1、随着区块链技术的迅速发展,基于区块链的智能合约应用成为趋势。在智能合约源码层面,需要持久化记录一些元素(称为持久化元素),以保证这些数据的可靠性和一致性。然而在实际应用中发现,现有的编译方法在对持久化元素的进行编译时会存在各式各样的问题。
技术实现思路
1、第一方面,本公开实施例提供了一种智能合约编译方法,所述编译方法基于编译系统,所述编译系统包括软件分离的编译前端和编译后端,所述编译方法包括:
2、所述编译前端确定所述目标智能合约中的目标持久化元素;
3、所述编译前端将各所述目标持久化元素分别声明为全局变量,并生成全局变量记录信息,所述全局变量记录信息记载有各全局变量的声明信息、各全局变量分别所占用空间大小以及内存空间进行初始化时所划分出的全局变量区的空间大小;
4、所述编译前端将目标智能合约转换为对应的第一中间代码;
5、所述编译前端生成目标智能合约的运行环境初始化配置信息,并将所述运行环境初始化配置信息转换为对应的第二中间代码,所述运行环境初始化配置信息记载有内存分配信息,所述内存分配信息包括:第一配置信息和第二配置信息,所述第一配置信息用于指示内存空间进行初始化时在所述内存空间内划分有栈区、全局变量区和堆区,所述第二配置信息用于指示将从目标智能合约中所确认出的全局变量的编码数据拷贝至所述全局变量区;
6、所述编译前端将所述全局变量记录信息转化为对应的第三中间代码;
7、所述编译前端将中间代码集发送至所述编译后端,所述中间代码集包括:所述第一中间代码、所述第二中间代码和所述第三中间代码;
8、所述编译后端对所述中间代码集进行编译生成对应的目标代码。
9、在一些实施例中,所述目标持久化元素包括:状态变量、字符串常量和/或内嵌字节码。
10、在一些实施例中,所述编译前端将各所述目标持久化元素分别声明为全局变量包括:
11、在所述编译前端为目标智能合约中的各变量分配存储槽后,所述编译前端将所述状态变量所分配存储槽的槽号声明为全局变量;
12、和/或,所述编译前端直接将所述字符串常量声明为全局变量;
13、和/或,所述编译前端直接将所述内嵌字节码声明为全局变量。
14、在一些实施例中,在所述编译前端确定所述目标智能合约中的目标持久化元素之前,还包括:
15、所述编译前端对所述目标智能合约进行词法分析、语法分析、语义分析来生成对应的抽象语法树,以及遍历扫描记录所述抽象语法树中的数据元素并生成对应的元素记录信息;
16、所述编译前端确定所述目标智能合约中的目标持久化元素的步骤包括:
17、所述编译前端从所述元素记录信息中检索出所述状态变量、字符串常量和内嵌字节码;
18、所述编译前端将目标智能合约转换为对应的第一中间代码的步骤包括:
19、所述编译前端对抽象语法树进行解析以得到对应的第一中间代码。
20、在一些实施例中,所述第一配置信息还用于指示所述内存空间内所划分出的所述栈区、所述全局变量区和所述堆区由低地址向高地址的方向依次相邻设置;
21、所述内存分配信息还包括:第三配置信息,所述第三配置信息用于指示所述栈区、所述全局变量区和堆区均按照由低地址向高地址进行地址分配;
22、所述内存分配信息还包括:第四配置信息,所述第四配置信息用于指示分配给所述栈区的预设固定空间大小。
23、在一些实施例中,在所述编译前端将中间代码集发送至所述编译后端的步骤之后,且在所述编译后端对所述中间代码集进行编译生成对应的目标代码的步骤之前,还包括:
24、所述编译后端从所述目标智能合约的上下文环境中获取由所述编译前端从所述目标智能合约中所确定出的各全局变量的占用空间大小;
25、所述编译后端进行全局变量内存分配以确定各全局变量分别在所述全局变量区中的内存绝对地址,并记录各全局变量的符号与所分配内存绝对地址的对应关系;
26、所述编译后端扫描第一中间代码,并将第一中间代码中各全局变量的符号分别替换为对应的内存绝对地址,以供后续所述编译后端对所述中间代码集进行编译生成对应的目标代码过程中将全局变量的内存绝对地址作为对应的指令操作的立即数。
27、在一些实施例中,所述目标代码包括:代码只读区和全局变量只读区,所述代码只读区内存储有可供运行的字节码,所述全局变量只读区中记载有各全局变量的编码数据;
28、全局变量只读区内各全局变量的编码数据的排布顺序与所述全局变量记录信息中各全局变量的声明信息的排布顺序相同。
29、第二方面,本公开实施例还提供了一种智能合约编译系统,所述编译系统配置为能够实现如第一方面中提供的所述智能合约编译方法,所述编译系统包括:软件分离的编译前端和编译后端;
30、所述编译前端用于确定所述目标智能合约中的目标持久化元素,以及将各所述目标持久化元素分别声明为全局变量,并生成全局变量记录信息,所述全局变量记录信息记载有各全局变量的声明信息、各全局变量分别所占用空间大小以及内存空间进行初始化时所划分出的全局变量区的空间大小;以及,还用于将目标智能合约转换为对应的第一中间代码;以及,还用于生成目标智能合约的运行环境初始化配置信息,并将所述运行环境初始化配置信息转换为对应的第二中间代码,所述运行环境初始化配置信息记载有内存分配信息,所述内存分配信息包括:第一配置信息和第二配置信息,所述第一配置信息用于指示内存空间进行初始化时在所述内存空间内划分有栈区、全局变量区和堆区,所述第二配置信息用于指示将从目标智能合约中所确认出的全局变量的编码数据拷贝至所述全局变量区;以及,还用于将所述全局变量记录信息转化为对应的第三中间代码;以及,还用于将中间代码集发送至所述编译后端,所述中间代码集包括:所述第一中间代码、所述第二中间代码和所述第三中间代码;
31、所述编译后端用于对所述中间代码集进行编译生成对应的目标代码。
32、第三方面,本公开实施例还提供了一种电子设备,其中,包括:
33、一个或多个处理器;
34、存储器,用于存储一个或多个程序;
35、当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如第一方面中提供的所述智能合约编译方法。
36、第四方面,本公开实施例还提供了一种智能合约的目标代码运行方法,用于对如第一方面中提供的所述智能合约编译方法所生成的目标代码进行运行,所述智能合约的目标代码运行方法包括:
37、在进行内存空间初始化时,根据目标代码中第一配置信息所对应的可执行代码在所述内存空间内划分出栈区、全局变量区和堆区;
38、获取所述目标代码中全局变量的编码数据;
39、根据目标代码中第二配置信息所对应的可执行代码,将所述全局变量的编码数据拷贝至所述全局变量区。
1.一种智能合约编译方法,其特征在于,所述编译方法基于编译系统,所述编译系统包括软件分离的编译前端和编译后端,所述编译方法包括:
2.根据权利要求1所述的智能合约编译方法,其特征在于,所述目标持久化元素包括:状态变量、字符串常量和/或内嵌字节码。
3.根据权利要求2所述的智能合约编译方法,其特征在于,所述编译前端将各所述目标持久化元素分别声明为全局变量包括:
4.根据权利要求2所述的智能合约编译方法,其特征在于,在所述编译前端确定所述目标智能合约中的目标持久化元素之前,还包括:
5.根据权利要求1所述的智能合约编译方法,其特征在于,
6.根据权利要求1所述的智能合约编译方法,其特征在于,在所述编译前端将中间代码集发送至所述编译后端的步骤之后,且在所述编译后端对所述中间代码集进行编译生成对应的目标代码的步骤之前,还包括:
7.根据权利要求1所述的智能合约编译方法,其特征在于,所述目标代码包括:代码只读区和全局变量只读区,所述代码只读区内存储有可供运行的字节码,所述全局变量只读区中记载有各全局变量的编码数据;
8.一种智能合约编译系统,其特征在于,所述编译系统配置为能够实现如权利要求1至7中任一所述智能合约编译方法,所述编译系统包括:软件分离的编译前端和编译后端;
9.一种电子设备,其特征在于,包括:
10.一种智能合约的目标代码运行方法,其特征在于,用于对如权利要求1-7中任一所述智能合约编译方法所生成的目标代码进行运行,所述运行方法包括: