变量编译方法、装置、电子设备及可读存储介质与流程

文档序号:33462946发布日期:2023-03-15 05:07阅读:21来源:国知局
变量编译方法、装置、电子设备及可读存储介质与流程

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.令n的初始值为1,循环执行第三步骤,直至剩余的所述变量的数量小于n时,退出循环;
30.其中,所述第三步骤包括:
31.从所述各变量中筛选出所占字节长度之和等于合约插槽字节长度的n个第一变量,得到第n轮筛选后的各第一变量组;
32.判断此刻剩余的所述变量的数量是否小于n;
33.若否,将n的当前值加1,继续循环;
34.若是,退出循环。
35.可选地,所述令n的初始值为1,循环执行第三步骤,直至剩余的所述变量的数量小于n时,退出循环,包括:
36.令n的初始值为1,循环执行第三步骤,直至剩余的所述变量的数量小于n,或者n+1>k时,退出循环,其中,k为预设值,且k≥2。
37.可选地,所述若否,将n的当前值加1,继续循环,包括:
38.若否,判断(n+1)是否大于k;
39.若否,将n的当前值加1,继续循环;
40.相应地,所述若否,判断(n+1)是否大于k之后,还包括:
41.若是,退出循环。
42.可选地,所述判断此刻剩余的所述变量的数量是否小于n,包括:
43.判断(n+1)是否大于k;
44.若否,判断此刻剩余的所述变量的数量是否小于n;
45.相应地,所述判断(n+1)是否大于k之后,还包括:
46.若是,退出循环。
47.可选地,所述对于定义并存储在区块链智能合约的持久化存储空间的各变量,执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列,包括:
48.对于定义并存储在区块链智能合约的持久化存储空间的各变量,调用预置工具包执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列;
49.所述对所述智能合约变量序列进行编译,包括:
50.调用编译器对所述智能合约变量序列进行编译。
51.可选地,所述对于定义并存储在区块链智能合约的持久化存储空间的各变量,执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列,包括:
52.对于定义并存储在区块链智能合约的持久化存储空间的各变量,调用编译器执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列;
53.所述对所述智能合约变量序列进行编译,包括:
54.通过所述编译器对所述智能合约变量序列进行编译。
55.第二方面,本技术实施例还提供了一种变量编译装置,所述装置包括:
56.第一排序模块,用于对于定义并存储在区块链智能合约的持久化存储空间的各变量,执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列;
57.第二编译模块,用于对所述智能合约变量序列进行编译;
58.其中,所述第一排序模块包括第一筛选子模块、第一排序子模块、第二排序子模块和第三排序子模块,用于执行所述第一步骤;
59.所述第一筛选子模块,用于从所述各变量中筛选出所占字节长度等于合约插槽字节长度的第一变量组,其中,所述第一变量组中包括至少一个第一变量;
60.所述第一排序子模块,用于对每个所述第一变量组中的各所述第一变量进行排序,并对各所述第一变量组进行排序,得到第一变量序列;
61.所述第二排序子模块,用于将此刻剩余的各所述变量进行排序,得到第二变量序列;
62.所述第三排序子模块,用于将所述第一变量序列和所述第二变量序列依次排序。
63.可选地,所述第二排序子模块具体用于:
64.循环执行第二步骤,直至剩余变量集合为空时,退出循环;
65.将每次执行所述第二步骤所得的各第二变量组按照筛选顺序进行排序,得到第二变量序列;
66.其中,所述第二步骤包括:
67.从此刻剩余的各所述变量中,筛选出所占字节长度最大的候选变量;
68.从此刻剩余的各所述变量中,筛选出与所述候选变量共同构成第二变量组的各第二变量,并得到剩余变量集合,其中,所述合约插槽字节长度与所述第二变量组的所占字节长度的差值小于所述剩余变量集合中任一所述变量的所占字节长度;
69.对所述第二变量组中的所述候选变量和所述各第二变量进行排序;
70.判断此刻的所述剩余变量集合是否为空;
71.若否,继续循环;
72.若是,退出循环。
73.可选地,所述第二排序子模块具体用于:
74.将此刻剩余的各所述变量按照所占字节长度依次递减的顺序进行排序,得到第二变量序列。
75.可选地,所述装置还包括:
76.第二排序模块,用于对于定义并存储在所述区块链智能合约的继承合约的持久化
存储空间的新增的各变量,执行所述第一步骤,以对所述新增的各变量进行重新排序,得到重新排序后的新增合约变量序列;
77.第三排序模块,用于将所述智能合约变量序列和所述新增合约变量序列依次排序,得到合约升级后的合约变量序列;
78.第二编译模块,用于对所述合约升级后的合约变量序列进行编译。
79.可选地,所述第一筛选子模块,包括:
80.循环单元,用于令n的初始值为1,循环执行第三步骤,直至剩余的所述变量的数量小于n时,退出循环;
81.其中,所述循环单元包括第一子单元、第二子单元、第三子单元和第四子单元,用于执行所述第三步骤;
82.所述第一子单元,用于从所述各变量中筛选出所占字节长度之和等于合约插槽字节长度的n个第一变量,得到第n轮筛选后的各第一变量组;
83.所述第二子单元,用于判断此刻剩余的所述变量的数量是否小于n;
84.所述第三子单元,用于若否,将n的当前值加1,继续循环;
85.所述第四子单元,用于若是,退出循环。
86.可选地,所述循环单元具体用于:
87.循环单元,用于令n的初始值为1,循环执行第三步骤,直至剩余的所述变量的数量小于n,或者n+1>k时,退出循环,其中,k为预设值,且k≥2。
88.可选地,所述第三子单元具体用于:
89.若否,判断(n+1)是否大于k;
90.若否,将n的当前值加1,继续循环;
91.相应地,所述若否,判断(n+1)是否大于k之后,还包括:
92.若是,退出循环。
93.可选地,所述第二子单元具体用于:
94.判断(n+1)是否大于k;
95.若否,判断此刻剩余的所述变量的数量是否小于n;
96.相应地,所述判断(n+1)是否大于k之后,还包括:
97.若是,退出循环。
98.可选地,所述第一排序模块具体用于:
99.对于定义并存储在区块链智能合约的持久化存储空间的各变量,调用预置工具包执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列;
100.所述第一编译模块具体用于:
101.调用编译器对所述智能合约变量序列进行编译。
102.可选地,所述第一排序模块具体用于:
103.对于定义并存储在区块链智能合约的持久化存储空间的各变量,调用编译器执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列;
104.所述第一编译模块具体用于:
105.通过所述编译器对所述智能合约变量序列进行编译。
106.第三方面,本技术实施例还提供了一种电子设备,包括:
107.处理器;以及
108.存储器,用于存储数据处理程序,该电子设备通电并通过所述处理器运行该程序后,执行如第一方面所述的方法。
109.第四方面,本技术实施例还提供了一种计算机可读存储介质,存储有数据处理程序,该程序被处理器运行,执行如第一方面所述的方法。
110.与现有技术相比,本技术具有以下优点:
111.本技术实施例提供的变量编译方法,对于定义并存储在区块链智能合约的持久化存储空间的各变量,首先可以从各变量中筛选出所占字节长度等于合约插槽字节长度的第一变量组,其中,第一变量组中包括至少一个第一变量,也即筛选出单独或组合后能够刚好填满所需插槽的各第一变量;然后对每个第一变量组中的各第一变量进行排序,并对各第一变量组进行排序,得到刚好能够填满所需插槽的第一变量序列;再将此刻剩余的各变量进行排序,得到第二变量序列;进而将第一变量序列和第二变量序列依次排序。
112.由于第一变量序列能够填满所占用的各个插槽,使得所占用的各个插槽均无空间浪费,因此,能够在不删除区块链数据的情况下,通过优化智能合约持久化存储空间的变量排序,节约区块链存储空间。并且,在本技术实施例中,电子设备通过该变量编译方法,在变量编译之前进行变量排序优化,如此,无需开发人员事先学习智能合约编写语言的存储结构,也无需浪费开发人员的人力进行变量定义顺序的构思,从而降低了开发人员的学习负担和开发难度,提高了智能合约的开发效率。
附图说明
113.图1是相关技术中的一种智能合约变量的存储示意图;
114.图2是相关技术中的另一种智能合约变量的存储示意图;
115.图3是相关技术中的第三种智能合约变量的存储示意图;
116.图4是相关技术中的第四种智能合约变量的存储示意图;
117.图5是相关技术中的第五种智能合约变量的存储示意图;
118.图6是相关技术中的第六种智能合约变量的存储示意图;
119.图7是本技术实施例提供的一种变量编译方法的流程图;
120.图8是本技术实施例提供的一种筛选第一变量组的流程图;
121.图9是本技术实施例提供的另一种筛选第一变量组的流程图;
122.图10是本技术实施例提供的第三种筛选第一变量组的流程图;
123.图11是本技术实施例提供的一种智能合约变量的存储示意图;
124.图12是本技术实施例提供的另一种智能合约变量的存储示意图;
125.图13是本技术实施例提供的第三种智能合约变量的存储示意图;
126.图14是本技术实施例提供的一种变量编译装置的框图;
127.图15是本技术实施例提供的一种用于实现变量编译的电子设备的逻辑结构示意图。
具体实施方式
128.在下面的描述中阐述了很多具体细节以便于充分理解本技术。但是本技术能够以
很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本技术内涵的情况下做类似推广,因此本技术不受下面公开的具体实施的限制。
129.在详细说明本技术的实施方式之前,首先对相关技术进行介绍。
130.智能合约是一套以数字形式定义和实现的契约,区块链上的智能合约是指可运行的计算机代码,这些代码能够实现资产的交易过程,例如资产的发行、申购、转让、赎回等等。
131.solidity是一种智能合约开发语言,这门语言有自己的存储结构定义规则。通过solidity语言编写的智能合约(下文将简称为solidity智能合约)的存储结构,是以插槽(slot)为单位存储合约中的变量,每一个插槽的字节长度是32个字节。在现有技术中,合约中定义的变量按照定义的顺序依次存储。当一个变量的字节长度为32字节时,该变量便可单独占用1个插槽。当一个变量的字节长度小于32字节时,并且定义的下一个变量的字节长度与该变量的字节长度之和小于或等于32字节时,会将这两个变量存储在同一个插槽中。
132.在solidity语言中,uint256变量类型占用32个字节,address变量类型占用20个字节,uint8变量类型占用1个字节,以下以上述三种变量类型为例,对现有技术中的区块链存储占用情况进行说明。
133.情况一:变量定义顺序为:
134.address x;
135.变量x的变量类型为address,需占用20个字节,小于32个字节。因此,如图1所示,变量x需要占用1个插槽,所占用的插槽剩余12个字节的存储空间。
136.情况二:变量定义顺序为:
137.uint256 x;
138.uint256 y;
139.变量x和y的变量类型均为uint256,每个变量需占用32个字节,共需占用64个字节,大于32个字节。因此,如图2所示,变量x和y需要各占用1个插槽,共占用2个插槽,所占用的每个插槽均无剩余的空闲存储空间。
140.情况三:变量定义顺序为:
141.address x;
142.address y;
143.变量x和y的变量类型均为address,每个变量需占用20个字节,共需占用40个字节,大于32个字节。因此,如图3所示,变量x和y需要各占用1个插槽,共占用2个插槽,所占用的每个插槽均剩余12个字节的空闲存储空间。
144.情况四:变量定义顺序为:
145.address x;
146.uint8 y;
147.变量x的变量类型为address,需占用20个字节,变量y的变量类型为uint8,需占用1个字节,共需占用21个字节,小于32个字节。因此,如图4所示,变量x和y只需要占用1个插槽,所占用的插槽剩余11个字节的空闲存储空间。
148.情况五:变量定义顺序为:
149.uint256 x;
150.uint8 y;
151.uint256 z;
152.address k;
153.变量x的变量类型为uint256,需占用32个字节,变量y的变量类型为uint8,需占用1个字节,变量z的变量类型为uint256,需占用32个字节,变量k的变量类型为address,需占用20个字节,共需占用85个字节。如图5所示,变量x需要占用1个插槽;变量y与z共需33字节,大于32字节,因此,变量y和z需要分别占用1个插槽;变量k需要占用12个插槽,变量x、y、z和k共需占用4个插槽,其中,第1个和第3个插槽均无剩余的空闲存储空间,第2个插槽剩余31个字节的存储空间,第4个插槽剩余12个字节的空闲存储空间。
154.以上述情况五为例,情况五需要占用4个插槽,但是,若改变一下变量的定义顺序,变为:
155.uint256 x;
156.uint256 z;
157.address k;
158.uint8 y;
159.则如图6所示,只需要占用3个插槽,如此,仅通过改变变量的定义顺序,便节省了一个插槽的存储空间。
160.但是,通过改变变量定义顺序的方式节省区块链存储空间,要求开发人员掌握solidity语言的存储结构,这无疑增加了开发人员的学习负担和开发难度。并且,开发人员还需要事先根据具体变量,构思变量的定义顺序,再根据构思的顺序进行变量定义,如此,降低了智能合约的开发效率。
161.为解决上述问题,本技术提供了一种变量编译方法,本技术提供的变量编译方法的执行主体为电子设备,具体可以是终端、服务器等可用于开发区块链智能合约的电子设备,本技术不作具体限定。
162.如图7所示,该方法包括以下步骤s110~s120。
163.步骤s110:对于定义并存储在区块链智能合约的持久化存储空间的各变量,执行第一步骤s01,以对各变量进行重新排序,得到重新排序后的智能合约变量序列;
164.其中,第一步骤s01包括步骤s011~s014:
165.步骤s011:从各变量中筛选出所占字节长度等于合约插槽字节长度的第一变量组,其中,第一变量组中包括至少一个第一变量;
166.步骤s012:对每个第一变量组中的各第一变量进行排序,并对各第一变量组进行排序,得到第一变量序列;
167.步骤s013:将此刻剩余的各变量进行排序,得到第二变量序列;
168.步骤s014:将第一变量序列和第二变量序列依次排序。
169.区块链智能合约的开发人员首先在区块链智能合约的存储空间中定义变量。其中,区块链智能合约可以包括多个存储空间,各变量可以根据其性质,存入相应的存储空间。
170.其中,以solidity智能合约为例,solidity智能合约有三个存储空间:
171.1、storage存储空间:即持久化存储空间,在storage存储空间存储的变量将会永
久地存储在区块链上。
172.2、memory存储空间:memory存储空间与普通程序的内存类似,在memory存储空间存储的变量仅在函数执行过程中有效,函数退出后,变量无效,也即memory存储空间是即分配,即使用,用完即回收。
173.3、calldata存储空间:一般只有外部函数的参数(不包括返回参数)被强制指定为calldata存储空间。calldata存储空间存储的数据是只读的,不会持久化到区块链。
174.根据上述内容可知,只有在storage存储空间存储的变量才会永久地存储在区块链上,因此,在本技术实施例中,在对变量进行编译之前,对定义并存储区块链智能合约的持久化存储空间(即storage存储空间)进行重新排序,以优化持久化存储空间的变量存储顺序,使得变量占用的持久化存储空间达到最小化。
175.具体地,电子设备可以通过第一步骤s01,对定义并存储区块链智能合约的持久化存储空间的各变量进行重新排序。
176.首先,在步骤s011中,从各变量中筛选出所占字节长度等于合约插槽字节长度(即32个字节的长度)的第一变量组。
177.其中,第一变量组中包括至少一个第一变量,也即该至少一个第一变量所占字节长度之和刚好等于合约插槽字节长度。
178.在步骤s011中,1个刚好等于32字节长度的变量,可以作为一个第一变量组被筛选出;2个相加刚好等于32字节长度的变量,可以作为一个第一变量组被筛选出;3个相加刚好等于32字节长度的变量,可以作为一个第一变量组被筛选出。以此类推,通过步骤s011,可以将正好能够占满一个插槽的变量筛选出。
179.在步骤s012中,由于同一个第一变量组内的各第一变量相加刚好等于32字节长度,因此,可以对每个第一变量组中的各第一变量进行排序,并对各第一变量组进行排序,即可得到第一变量序列。该第一变量序列中的各第一变量,可以将所占用的各插槽填满,使得所占用的各个插槽均无空间浪费。
180.其中,本技术实施例对于步骤s012中“对每个第一变量组中的各第一变量进行排序”的步骤,以及“对各第一变量组进行排序”的步骤的执行顺序,不作限定。
181.对于刚好等于32字节长度的各第一变量,这些第一变量均可单独作为一个第一变量组,无需与其他变量进行组合而凑够32字节。在一种可选方案中,这些第一变量可以按照定义的先后顺序进行排序。当然,也可以按照任意的排序方式进行排序,本技术实施例对此不作具体限定。
182.对于需要通过组合而凑够32字节的各第一变量,也即包括至少两个第一变量的第一变量组,在一种可选方案中,这些第一变量组组内的各第一变量的排序,可以按照定义的先后顺序进行排序。当然,也可以按照其他任意的排序方式进行排序,本技术实施例对此不作具体限定。而这些第一变量组的排序,可以遵循使变量定义顺序尽量改动较小的原则进行排序。当然,也可以按照其他任意的排序方式进行排序,本技术实施例对此不作具体限定。
183.在步骤s013中,在筛选出第一变量之后,可以将此刻剩余的各变量进行排序,得到第二变量序列。此刻剩余的各变量无论任意数量如何进行组合,已经无法凑成刚好32个字节长度,因此,按照一定的规则进行排序即可。
184.在一种可选的实施方式中,可以直接按照此刻剩余的各变量的定义顺序,对此刻剩余的各变量进行排序。
185.在另一种可选的实施方式中,还可以进一步对此刻剩余的各变量进行排序优化,以节省更多的存储空间,具体可参见下文的相关内容。
186.在步骤s014中,可以将第一变量序列和第二变量序列依次排序。
187.定义并存储在区块链智能合约的持久化存储空间的各变量,经过重新排序之后,所占用的存储空间总和减小。
188.步骤s120:对智能合约变量序列进行编译。
189.经过上述步骤,区块链智能合约的持久化存储空间的各变量已进行了重新排序,并得到了重新排序后的智能合约变量序列,进而电子设备将进行区块链智能合约的编译。在本技术实施例中,在对合约变量进行编译时,对重新排序所得的智能合约变量序列进行编译。
190.本技术实施例提供的变量编译方法,对于定义并存储在区块链智能合约的持久化存储空间的各变量,首先可以从各变量中筛选出所占字节长度等于合约插槽字节长度的第一变量组,其中,第一变量组中包括至少一个第一变量,也即筛选出单独或组合后能够刚好填满所需插槽的各第一变量;然后对每个第一变量组中的各第一变量进行排序,并对各第一变量组进行排序,得到刚好能够填满所需插槽的第一变量序列;再将此刻剩余的各变量进行排序,得到第二变量序列;进而将第一变量序列和第二变量序列依次排序。
191.由于第一变量序列能够填满所占用的各个插槽,使得所占用的各个插槽均无空间浪费,因此,能够在不删除区块链数据的情况下,通过优化智能合约持久化存储空间的变量排序,节约区块链存储空间。并且,在本技术实施例中,电子设备通过该变量编译方法,在变量编译之前进行变量排序优化,如此,无需开发人员事先学习智能合约编写语言的存储结构,也无需浪费开发人员的人力进行变量定义顺序的构思,从而降低了开发人员的学习负担和开发难度,提高了智能合约的开发效率。
192.需要提前说明的是,下文均以合约插槽字节长度为32字节长度为例进行说明,可以理解的是,随着合约插槽设计的变换,合约插槽字节长度还可能是其他的字节长度,本技术实施例并不旨在对其进行限定。
193.在一种实施方式中,参照图8,步骤s011具体可以通过以下步骤s0111实现。
194.步骤s0111:令n的初始值为1,循环执行第三步骤s03,直至剩余的变量的数量小于n时,退出循环;
195.其中,第三步骤s03包括:
196.步骤s031:从各变量中筛选出所占字节长度之和等于合约插槽字节长度的n个第一变量,得到第n轮筛选后的各第一变量组;
197.步骤s032:判断此刻剩余的变量的数量是否小于n。
198.步骤s033:若否,将n的当前值加1,继续循环。
199.步骤s034:若是,退出循环。
200.在该实施方式中,参照图8,首先,n的初始值为1,开始第1次执行第三步骤s03,从各变量中筛选出所占字节长度等于合约插槽字节长度的1个第一变量,也即筛选出32字节长度的单独的变量,这样的变量单独即可作为一个第一变量组。至此,得到了第1轮筛选结
果,也即第1轮筛选后的各第一变量组。在步骤s031执行完毕后,需要判断是否达到了当前退出循环的条件,即判断此刻剩余的变量数量是否小于1。若是,则退出循环;若否,则将n的当前值加1,使得n的值变为2,然后继续执行下一次第三步骤s03。
201.第2次执行第三步骤s03,从各变量中筛选出所占字节长度相加等于合约插槽字节长度的2个第一变量,也即组合任意2个变量,并对所有组合进行遍历,若2个变量的字节长度相加刚好等于32字节,则将这2个变量作为一个第一变量组中的第一变量选出。至此,得到了第2轮筛选结果,也即第2轮筛选后的各第一变量组。在步骤s031执行完毕后,需要判断是否达到了当前退出循环的条件,即判断此刻剩余的变量数量是否小于2。若是,则退出循环;若否,则将n的当前值加1,使得n的值变为3,然后继续执行下一次第三步骤s03。
202.第3次执行第三步骤s03,从各变量中筛选出所占字节长度相加等于合约插槽字节长度的3个第一变量,也即组合任意3个变量,并对所有组合进行遍历,若3个变量的字节长度相加刚好等于32字节,则将这3个变量作为一个第一变量组中的第一变量选出。至此,得到了第3轮筛选结果,也即第3轮筛选后的各第一变量组。在步骤s031执行完毕后,需要判断是否达到了当前退出循环的条件,即判断此刻剩余的变量数量是否小于3。若是,则退出循环;若否,则将n的当前值加1,使得n的值变为4,然后继续执行下一次第三步骤s03。
203.第4次执行第三步骤s03,从各变量中筛选出所占字节长度相加等于合约插槽字节长度的4个第一变量,也即组合任意4个变量,并对所有组合进行遍历,若4个变量的字节长度相加刚好等于32字节,则将这4个变量作为一个第一变量组中的第一变量选出。至此,得到了第4轮筛选结果,也即第4轮筛选后的各第一变量组。在步骤s031执行完毕后,需要判断是否达到了当前退出循环的条件,即判断此刻剩余的变量数量是否小于4。若是,则退出循环;若否,则将n的当前值加1,使得n的值变为5,然后继续执行下一次第三步骤s03。
204.以此类推,可以执行第三步骤s03至少一次,直至剩余的变量的数量小于n时,不再执行。通过第三步骤s03的循环执行,可以将所占字节长度刚好等于合约插槽字节长度的第一变量组全部选出。
205.需要说明的是,每次执行第三步骤s03,都可以将上一轮筛选后剩余的各变量作为下一轮筛选的变量筛选范围,如此,可以节约组合变量的时间,以及遍历组合的时间,提高排序效率。当然,也可以每一轮筛选都将全部变量作为变量筛选范围,本技术实施例对此不作限定。
206.其中,由于每一轮筛选出的第一变量组,均可以单独或组合为32字节,从而刚好填满所需插槽,因此,本技术实施例对于每一轮筛选结果如何排序,以及同一轮筛选结果内部的各第一变量组如何排序,不作具体限定。
207.在一种可选方案中,各第一变量组可以遵循使变量定义顺序尽量改动较小的原则进行排序,从而可以节约排序时间,节省电子设备的计算资源。
208.通过该实施方式,可以逐步筛选出单独或组合后能够刚好填满所需插槽的各第一变量,然后对每个第一变量组中的各第一变量进行排序,并对各第一变量组进行排序,可以得到刚好能够填满所需插槽的第一变量序列。对于各第一变量所需的插槽,均无存储空间的浪费,节约了区块链存储空间。
209.进一步可选地,在上述实施方式的基础上,步骤s0111具体可以包括:
210.令n的初始值为1,循环执行第三步骤s03,直至剩余的变量的数量小于n,或者n+1
>k时,退出循环,其中,k为预设值,且k≥2。
211.在该实施方式中,对步骤s0111增加了一个退出循环的判断条件,即(n+1)是否大于预设值k,通过该条件,可以限制第三步骤s03的循环次数,从而避免了变量组合的多次且大量的遍历,如此,在一定程度上节省了存储空间的情况下,还能够节约第一变量的遍历时间,进而节约了各变量重新排序的时间。
212.剩余的变量的数量是否小于n,以及(n+1)是否大于k这两个判断条件的判断顺序,本技术实施例不作限定。如图9所示,一个可选方案是先判断剩余的变量的数量是否小于n,若是,则退出循环,若否,再判断(n+1)是否大于k;若n+1≯k,则将n的当前值加1,并继续循环,若n+1>k,则退出循环。如图10所示,另一个可选方案是先判断(n+1)是否大于k,若是,则退出循环,若否,再判断剩余的变量的数量是否小于n;若不小于n,则将n的当前值加1,并继续循环,若小于n,则退出循环。
213.根据上述第1种可选方案,步骤s033具体可以包括:
214.若否,判断(n+1)是否大于k;
215.若否,将n的当前值加1,继续循环;
216.相应地,在若否,判断(n+1)是否大于k的步骤之后,还包括以下步骤:
217.若是,退出循环。
218.根据上述第2种可选方案,步骤s032具体可以包括:
219.判断(n+1)是否大于k;
220.若否,判断此刻剩余的所述变量的数量是否小于n;
221.相应地,在判断(n+1)是否大于k的步骤之后,还包括以下步骤:
222.若是,退出循环。
223.具体地,以k=5、先判断剩余的变量的数量是否小于n为例,比如当前已执行了4次第三步骤s03,此时n=5,且剩余的变量的数量仍大于或等于5,按照上述实施方式,接下来会继续执行第5次第三步骤s03。而在本实施方式中,还需判断(n+1)是否大于k,此时n=5,k=5,n+1=6>k,则在本实施方式中,会退出循环,不再继续执行第5次第三步骤s03。
224.通过上述各实施方式,筛选出单独或组合后刚好等于32字节长度的各第一变量之后,剩余的变量已无法凑成32字节长度,因此,需要将剩余变量尽可能组合到较少的插槽中。
225.在一种可选的实施方式中,步骤s013具体可以通过以下步骤s0131~s0312实现。
226.步骤s0131:循环执行第二步骤s02,直至剩余变量集合为空时,退出循环;
227.步骤s0132:将每次执行第二步骤s02所得的各第二变量组按照筛选顺序进行排序,得到第二变量序列;
228.其中,第二步骤s02包括:
229.步骤s021:从此刻剩余的各变量中,筛选出所占字节长度最大的候选变量;
230.步骤s022:从此刻剩余的各变量中,筛选出与该候选变量共同构成第二变量组的各第二变量,并得到剩余变量集合,其中,合约插槽字节长度与第二变量组的所占字节长度的差值小于剩余变量集合中任一变量的所占字节长度;
231.步骤s023:对该第二变量组中的候选变量和各第二变量进行排序;
232.步骤s024:判断此刻的所述剩余变量集合是否为空;
233.步骤s025:若否,继续循环;
234.步骤s026:若是,退出循环。
235.在该实施方式中,对于除各第一变量之外的剩余变量,开始第1次执行第二步骤s02。首先,在步骤s021中,遍历此刻剩余的各变量,筛选出所占字节长度最大的变量,作为候选变量。
236.然后,在步骤s022中,再次遍历此刻剩余的变量(不包括该候选变量),选出字节长度最大的变量。若该变量与候选变量的字节长度之和大于32字节,则将候选变量单独作为一个第二变量组,并结束步骤s022。若该变量与候选变量的字节长度之和小于32字节,则将该变量作为第二变量选出,并继续按照本步骤进行遍历,直至候选变量与选出的所有第二变量的字节长度之和,再加上任何一个剩余变量的字节长度都大于32字节,则结束步骤s022。通过步骤s022所选出的各第二变量,可以与通过步骤s021所选出的候选变量共同构成一个第二变量组。
237.之后,在步骤s023中,将上述步骤筛选出的第二变量组进行组内变量排序。其中,第二变量组的组内变量排序方式,可以参考上文所述的第一变量组的组内变量排序方式,在此不再赘述。
238.在步骤s023之后,需要判断此时是否满足退出循环的条件,即判断此刻的剩余变量集合是否为空,若否,则继续循环,继续执行下一次第二步骤s02,若是,则退出循环。
239.其中,每个第二变量组虽然无法填满所需插槽,但因每个第二变量组都是尽量按照接近32字节的原则进行变量组合,因而已使所需插槽的存储空间浪费率达到最低,从而在通过各个第一变量组的排序节约了区块链存储空间的基础上,通过各个第二变量组的排序进一步节约了区块链存储空间。
240.在第二步骤s02每次执行完毕后,需要判断是否达到了退出循环的条件,即判断此刻剩余变量集合是否为空。若是,则退出循环;若否,则继续执行下一次第二步骤s02。
241.在该实施方式中,可以按照被筛选出的先后顺序,对每次执行第二步骤s02所得的各第二变量组进行排序,得到第二变量序列。具体地,可以是全选完第二变量组后再全部进行排序,当然,也可以是每次执行完第二步骤s02之后,将本次选出的第二变量组排在上次选出的第二变量组之后,也即每次选出一个第二变量组后立即对其进行排序。在该实施方式中,第二步骤的执行与第二变量组的排序可以分立进行,也可以穿插进行,本技术实施例对此不作具体限定。
242.在另一种可选的实施方式中,步骤s013具体可以通过以下步骤s0132实现。
243.步骤s0132:将此刻剩余的各变量按照所占字节长度依次递减的顺序进行排序,得到第二变量序列。
244.在该实施方式中,可以直接按照所占字节长度从大到小的顺序,将此刻剩余的各变量进行排序,得到第二变量序列。
245.在步骤s013的上述两种实施方式中,第一种实施方式在一些情况下可以更多地节省区块链存储空间,第二种实施方式的处理逻辑简单,则可以更多地节约重新排序的时间,在实际应用中,可根据具体需求进行选择。
246.以下列举2种情况,以分别对比步骤s013的上述两种实施方式的各自优势。
247.情况一:
248.此刻剩余的各变量为变量a、变量b、变量c和变量d,其中,变量a的字节长度为24,变量b的字节长度为20,变量c的字节长度为6,变量d的字节长度为10。
249.通过上述第一种实施方式对变量a、变量b、变量c和变量d进行排序,如图11所示,排序结果依次为:变量a、变量c、变量b、变量d,其中,变量a和变量c占用一个插槽,变量b和变量d占用一个插槽,共占用2个插槽。
250.而通过上述第二种实施方式对变量a、变量b、变量c和变量d进行排序,如图12所示,排序结果依次为:变量a、变量b、变量d、变量c,其中,变量a占用一个插槽,变量b和变量d占用一个插槽,变量c占用一个插槽,共占用3个插槽。
251.由此可知,对于情况一,两种实施方式的排序方式不同,采用第一种实施方式可以更多地节省区块链存储空间。
252.情况二:
253.此刻剩余的各变量为变量a、变量b和变量d,其中,变量a的字节长度为24,变量b的字节长度为20,变量d的字节长度为10。
254.通过上述第一种实施方式对变量a、变量b和变量d进行排序,如图13所示,排序结果依次为:变量a、变量b、变量d,其中,变量a占用一个插槽,变量b和变量d占用一个插槽,共占用2个插槽。
255.而通过上述第二种实施方式对变量a、变量b和变量d进行排序,仍然如图13所示,排序结果仍然依次为:变量a、变量b、变量d,其中,变量a占用一个插槽,变量b和变量d占用一个插槽,共占用2个插槽。
256.由此可知,对于情况二,两种实施方式的排序方式相同,采用第二种实施方式可以更多地节约排序时间。
257.此外,solidity智能合约已经发展出了可升级特性,并且要求升级后的合约和升级前的合约的相同变量部分的存储结构必须相同,也即相同变量部分中的每个变量需要在升级后合约和升级前合约中的相同插槽的相同位置。如果在升级后的合约中新增加了变量,且升级后的合约的变量按照上述方式进行重新排序,则会导致升级后的合约和升级前的合约的相同变量部分的存储结构不同,这将使得智能合约不可升级。
258.因此,为了兼顾智能合约的可升级性,以及区块链存储空间的节约,在本技术实施例中,将采用继承合约方式进行智能合约的升级,并在合约升级的过程中加入变量重新排序的过程。
259.具体地,在步骤s120之后,该变量编译方法还可以包括以下步骤s130~s150:
260.步骤s130:对于定义并存储在区块链智能合约的继承合约的持久化存储空间的新增的各变量,执行第一步骤s01,以对新增的各变量进行重新排序,得到重新排序后的新增合约变量序列;
261.步骤s140:将智能合约变量序列和新增合约变量序列依次排序,得到合约升级后的合约变量序列;
262.步骤s150:对合约升级后的合约变量序列进行编译。
263.其中,对于继承合约b中相较于升级前的合约a的新增变量(仅指持久化存储空间的新增变量),可以通过上述第一步骤s01进行重新排序,从而得到重新排序后的新增合约变量序列。
264.由于该合约b继承合约a,因此,在本技术实施例中,合约b也继承合约a的变量排序,也即合约b中与合约a的相同变量部分的排序,遵循合约a的变量排序,而合约b中的新增变量部分的排序,则另外重新排序。在本技术实施例中,合约b的变量排序=合约a的变量排序+合约b的新增变量排序。
265.之后,可以按照合约b的变量排序,对合约b的持久化存储空间的各变量进行编译。
266.通过上述方式,可以在通过变量重新排序的方式节约区块链存储空间的同时,通过合约继承的方式进行合约升级,保证了智能合约的可升级性。
267.进一步地,在一种实施方式中,步骤s110可以包括:对于定义并存储在区块链智能合约的持久化存储空间的各变量,调用预置工具包执行第一步骤s01,以对各变量进行重新排序,得到重新排序后的智能合约变量序列。
268.相应地,步骤s120可以包括:调用编译器对智能合约变量序列进行编译。
269.在另一种实施方式中,步骤s110可以包括:对于定义并存储在区块链智能合约的持久化存储空间的各变量,调用编译器执行第一步骤s01,以对各变量进行重新排序,得到重新排序后的智能合约变量序列。
270.相应地,步骤s120可以包括:通过编译器对智能合约变量序列进行编译。
271.其中,对智能合约持久化存储空间的各变量的重新排序,需要在对各变量进行编译之前进行。
272.在上述第1种实施方式中,重新排序的实现代码可以封装为一个工具包,从而通过在编译之前调用该工具包来实现重新排序的步骤。如此,开发人员无需对编译器进行改进,也就无需开发人员对编译器有所了解,进一步降低了对开发人员的学习负担和开发难度。
273.在上述第2种实施方式中,重新排序的实现代码可以写入编译器中,从而将重新排序的功能作为编译器的第一个功能,编译器可以先对合约变量重新排序,再对重新排序后的合约变量进行编译。如此,当开发人员需要对合约变量进行重新排序和编译时,仅需调用编译器即可实现,操作方式更加简单易行,提高了开发人员进行操作的便捷性。
274.与本技术实施例提供的变量编译方法相对应的,本技术实施例还提供一种变量编译装置。如图14所示,所述装置200包括:
275.第一排序模块201,用于对于定义并存储在区块链智能合约的持久化存储空间的各变量,执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列;
276.第二编译模块202,用于对所述智能合约变量序列进行编译;
277.其中,所述第一排序模块201包括第一筛选子模块2011、第一排序子模块2012、第二排序子模块2013和第三排序子模块2014,用于执行所述第一步骤;
278.所述第一筛选子模块2011,用于从所述各变量中筛选出所占字节长度等于合约插槽字节长度的第一变量组,其中,所述第一变量组中包括至少一个第一变量;
279.所述第一排序子模块2012,用于对每个所述第一变量组中的各所述第一变量进行排序,并对各所述第一变量组进行排序,得到第一变量序列;
280.所述第二排序子模块2013,用于将此刻剩余的各所述变量进行排序,得到第二变量序列;
281.所述第三排序子模块2014,用于将所述第一变量序列和所述第二变量序列依次排
序。
282.可选地,所述第二排序子模块2013具体用于:
283.循环执行第二步骤,直至剩余变量集合为空时,退出循环;
284.将每次执行所述第二步骤所得的各第二变量组按照筛选顺序进行排序,得到第二变量序列;
285.其中,所述第二步骤包括:
286.从此刻剩余的各所述变量中,筛选出所占字节长度最大的候选变量;
287.从此刻剩余的各所述变量中,筛选出与所述候选变量共同构成第二变量组的各第二变量,并得到剩余变量集合,其中,所述合约插槽字节长度与所述第二变量组的所占字节长度的差值小于所述剩余变量集合中任一所述变量的所占字节长度;
288.对所述第二变量组中的所述候选变量和所述各第二变量进行排序;
289.判断此刻的所述剩余变量集合是否为空;
290.若否,继续循环;
291.若是,退出循环。
292.可选地,所述第二排序子模块2013具体用于:
293.将此刻剩余的各所述变量按照所占字节长度依次递减的顺序进行排序,得到第二变量序列。
294.可选地,所述装置还包括:
295.第二排序模块,用于对于定义并存储在所述区块链智能合约的继承合约的持久化存储空间的新增的各变量,执行所述第一步骤,以对所述新增的各变量进行重新排序,得到重新排序后的新增合约变量序列;
296.第三排序模块,用于将所述智能合约变量序列和所述新增合约变量序列依次排序,得到合约升级后的合约变量序列;
297.第二编译模块,用于对所述合约升级后的合约变量序列进行编译。
298.可选地,所述第一筛选子模块2011,包括:
299.循环单元,用于令n的初始值为1,循环执行第三步骤,直至剩余的所述变量的数量小于n时,退出循环;
300.其中,所述循环单元包括第一子单元、第二子单元、第三子单元和第四子单元,用于执行所述第三步骤;
301.所述第一子单元,用于从所述各变量中筛选出所占字节长度之和等于合约插槽字节长度的n个第一变量,得到第n轮筛选后的各第一变量组;
302.所述第二子单元,用于判断此刻剩余的所述变量的数量是否小于n;
303.所述第三子单元,用于若否,将n的当前值加1,继续循环;
304.所述第四子单元,用于若是,退出循环。
305.可选地,所述循环单元具体用于:
306.循环单元,用于令n的初始值为1,循环执行第三步骤,直至剩余的所述变量的数量小于n,或者n+1>k时,退出循环,其中,k为预设值,且k≥2。
307.可选地,所述第三子单元具体用于:
308.若否,判断(n+1)是否大于k;
309.若否,将n的当前值加1,继续循环;
310.相应地,所述若否,判断(n+1)是否大于k之后,还包括:
311.若是,退出循环。
312.可选地,所述第二子单元具体用于:
313.判断(n+1)是否大于k;
314.若否,判断此刻剩余的所述变量的数量是否小于n;
315.相应地,所述判断(n+1)是否大于k之后,还包括:
316.若是,退出循环。
317.可选地,所述第一排序模块201具体用于:
318.对于定义并存储在区块链智能合约的持久化存储空间的各变量,调用预置工具包执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列;
319.所述第一编译模块202具体用于:
320.调用编译器对所述智能合约变量序列进行编译。
321.可选地,所述第一排序模块201具体用于:
322.对于定义并存储在区块链智能合约的持久化存储空间的各变量,调用编译器执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列;
323.所述第一编译模块202具体用于:
324.通过所述编译器对所述智能合约变量序列进行编译。
325.与本技术实施例提供的变量编译方法相对应的,本技术实施例还提供了一种用于编译变量的电子设备。如图15所示,所述电子设备包括:处理器601;以及存储器602,用于存储变量编译方法的程序,该设备通电并通过所述处理器运行该变量编译方法的程序后,执行如下步骤:
326.对于定义并存储在区块链智能合约的持久化存储空间的各变量,执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列;
327.对所述智能合约变量序列进行编译;
328.其中,所述第一步骤包括:
329.从所述各变量中筛选出所占字节长度等于合约插槽字节长度的第一变量组,其中,所述第一变量组中包括至少一个第一变量;
330.对每个所述第一变量组中的各所述第一变量进行排序,并对各所述第一变量组进行排序,得到第一变量序列;
331.将此刻剩余的各所述变量进行排序,得到第二变量序列;
332.将所述第一变量序列和所述第二变量序列依次排序。
333.与本技术实施例提供的变量编译方法相对应的,本技术实施例提供一种计算机可读存储介质,存储有变量编译方法的程序,该程序被处理器运行,执行下述步骤:
334.对于定义并存储在区块链智能合约的持久化存储空间的各变量,执行第一步骤,以对所述各变量进行重新排序,得到重新排序后的智能合约变量序列;
335.对所述智能合约变量序列进行编译;
336.其中,所述第一步骤包括:
337.从所述各变量中筛选出所占字节长度等于合约插槽字节长度的第一变量组,其
中,所述第一变量组中包括至少一个第一变量;
338.对每个所述第一变量组中的各所述第一变量进行排序,并对各所述第一变量组进行排序,得到第一变量序列;
339.将此刻剩余的各所述变量进行排序,得到第二变量序列;
340.将所述第一变量序列和所述第二变量序列依次排序。
341.需要说明的是,对于本技术实施例提供的装置、电子设备及计算机可读存储介质的详细描述可以参考对本技术实施例中对方法的相关描述,这里不再赘述。
342.本技术虽然以较佳实施例公开如上,但其并不是用来限定本技术,任何本领域技术人员在不脱离本技术的精神和范围内,都可以做出可能的变动和修改,因此本技术的保护范围应当以本技术权利要求所界定的范围为准。
343.在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
344.内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
345.1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他属性的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储介质或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
346.2、本领域技术人员应明白,本技术的实施例可提供为方法、系统或计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本技术可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
347.本技术虽然以较佳实施例公开如上,但其并不是用来限定本技术,任何本领域技术人员在不脱离本技术的精神和范围内,都可以做出可能的变动和修改,因此本技术的保护范围应当以本技术权利要求所界定的范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1