一种区块链智能合约执行方法、装置及设备
技术领域
本发明涉及区块链技术领域,尤其涉及一种区块链智能合约执行方法、装置及设备。
背景技术
区块链上的合约代码(bytecode)的执行,是通过虚拟机(Virtual Machine,VM)来实现的。wasm为WebAssembly的简写,是一种可以在展示虚拟机上执行的二进制指令格式,常常被用于作为区块链中的合约代码,利用wasm携程的合约代码被称为wasm合约。
wasm合约采用基于栈的虚拟机执行,即栈式虚拟机。栈式虚拟机要求指令操作的数据必须存放在栈上,因此在执行合约代码之前,虚拟机需要创建一个模拟的栈来保存后续所有指令的操作数据与结果,虚拟机使用模拟cpu的方式来执行合约代码。在执行时,首先需要初始化宿主环境,初始化后取一条指令,并判断手续费是否足够,在手续费足够时执行该指令,在执行完毕后重复执行取指令的过程,直至代码执行完毕。现有智能合约执行方法需要逐条读取指令并执行,使得智能合约的执行速度较慢,影响了区块链的共识效率和吞吐量。
因此,如何解决现有智能合约执行方法执行速度较慢,影响了区块链的共识效率和吞吐量的问题,是本领域技术人员需要解决的技术问题。
发明内容
本发明的主要目的在于提供一种区块链智能合约执行方法、区块链智能合约执行装置及区块链智能合约执行设备,旨在解决现有智能合约执行方法执行速度较慢,影响了区块链的共识效率和吞吐量的问题。
为实现上述目的,本发明提供的一种区块链智能合约执行方法,包括:
获取目标智能合约,判断是否存在所述目标智能合约对应的合约动态库;
若存在所述目标智能合约对应的所述合约动态库,则调用所述合约动态库执行所述目标智能合约。
可选地,还包括:
若不存在所述目标智能合约对应的所述合约动态库,则调用虚拟机执行所述目标智能合约。
可选地,在所述若不存在所述目标智能合约对应的所述合约动态库,则调用虚拟机执行所述目标智能合约之后,还包括:
对所述目标智能合约的合约字节码进行解析并构建所述合约动态库;
或,
从区块链网络中的其它节点获取与所述目标智能合约对应的所述合约动态库。
可选地,在所述对所述目标智能合约的合约字节码进行解析并构建所述合约动态库之后,还包括:
向所述区块链网络中的所述其他节点共享所述合约动态库。
可选地,所述对所述目标智能合约的合约字节码进行解析并构建所述合约动态库,包括:
利用wasm MVP规范对所述合约字节码进行解析,得到导入段字段、全局段字段、函数表段字段和其他字段;
利用C数组对所述导入段字段、所述全局段字段和所述函数表段字段进行格式转换,得到对应的外部函数列表、全局变量列表和函数全局索引表;
利用所述其他字段、所述外部函数列表、所述全局变量列表和所述函数全局索引表构建所述合约动态库。
可选地,所述利用所述其他字段、所述外部函数列表、所述全局变量列表和所述函数全局索引表构建所述合约动态库,包括:
利用所述其它字段中的类型字段生成对应的C格式函数签名;
读取所述其它字段中的代码字段,确定所述代码字段中各个指令的指令类型;
根据所述指令类型对应的代码转换规则将所述指令转换为C格式指令;
利用所述C格式指令构建C格式函数,并构建所述C格式函数对应的栈式生成器;
生成手续费判断宏,利用所述手续费判断宏、所述C格式函数签名、所述C格式函数、所述外部函数列表、所述全局变量列表和所述函数全局索引表构建C格式代码;
利用所述C格式代码和所述栈式生成器构建所述合约动态库。
可选地,所述读取所述其它字段中的代码字段,确定所述代码字段中各个指令的指令类型,包括:
定义指令指针,读取所述指令指针指向的所述指令;
确定所述指令的所述指令类型,并更新所述指令指针;
相应的,在所述根据所述指令类型对应的代码转换规则将所述指令转换为C格式指令之后,还包括:
利用所述指令指针判断所述代码字段是否读取完毕;
若是,则执行利用所述C格式指令构建C格式函数的步骤。
可选地,所述判断是否存在所述目标智能合约对应的合约动态库,包括:
查询本地数据库,判断是否存在所述合约动态库的生成记录;
若存在所述合约动态库的生成记录,则确定存在所述目标智能合约对应的合约动态库;
若不存在所述合约动态库的生成记录,则确定不存在所述目标智能合约对应的合约动态库。
本发明还提供了一种区块链智能合约执行装置,包括:
判断模块,用于获取目标智能合约,判断是否存在所述目标智能合约对应的合约动态库;
执行模块,用于若存在所述目标智能合约对应的所述合约动态库,则调用所述合约动态库执行所述目标智能合约。
本发明还提供了一种区块链智能合约执行设备,所述区块链智能合约执行设备包括存储器和处理器,所述存储器上存储有可在所述处理器上运行的区块链智能合约执行程序,所述区块链智能合约执行程序被所述处理器执行时实现上述的区块链智能合约执行方法。
本发明还提供了一种计算机可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现上述的区块链智能合约执行方法。
本发明提供的区块链智能合约执行方法,获取目标智能合约,判断是否存在目标智能合约对应的合约动态库;其中,目标智能合约为wasm合约。若存在目标智能合约对应的合约动态库,则调用合约动态库执行目标智能合约。
可见,该方法在确定存在目标智能合约对应的合约动态库后,利用合约动态库执行目标智能合约。合约动态库为一种在操作系统中实现共享函数库概念的方式,在执行目标智能合约时不需要逐条获取指令并执行,而是可以以更接近原生的方式来执行目标智能合约,极大地提升了智能合约的执行效率,提高了区块链的共识效率和吞吐量,同时有利于复杂合约的运行,解决了解决现有智能合约执行方法执行速度较慢,影响了区块链的共识效率和吞吐量的问题。
此外,本发明还提供了一种区块链智能合约执行装置及区块链智能合约执行设备,同样具有上述有益效果。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例提供的一种区块链智能合约执行方法流程示意图;
图2为本发明实施例提供的另一种智能合约执行方法流程示意图;
图3为本发明实施例提供的一种合约动态库构建方法流程示意图;
图4为本发明实施例提供的一种具体的合约动态库构建方法流程示意图;
图5为本发明实施例提供的一种区块链智能合约执行装置的结构示意图;
图6为本发明实施例提供的一种区块链智能合约执行设备的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
需要说明的是,在本发明中涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。另外,各个实施例之间的技术方案可以相互结合,但是必须是以本领域普通技术人员能够实现为基础,当技术方案的结合出现相互矛盾或无法实现时应当认为这种技术方案的结合不存在,也不在本发明要求的保护范围之内。
本发明提供一种区块链智能合约执行方法。
请参考图1,图1为本发明实施例提供的一种区块链智能合约执行方法流程示意图。该方法包括:
S101:获取目标智能合约,判断是否存在目标智能合约对应的合约动态库,如果是,则执行S102步骤,否则执行S103步骤。
现有智能合约执行方法在执行智能合约时,直接利用虚拟机逐条执行智能合约对应的指令,这种执行方法导致合约代码的执行速度较慢。
在本实施例中,目标智能合约为由本节点执行的智能合约,本节点即为执行本发明提供的区块链智能合约执行方法中各个步骤的节点。对于智能合约的具体类型和内容,本实施例不做限定,例如可以为wasm合约。在获取目标智能合约后,判断是否已经存在目标智能合约对应的合约动态库。合约动态库即为动态链接库(Dynamic Link Library或Dynamic-link Library),其可以以更加接近原生的方式执行智能合约,极大地提升合约执行的性能。
本实施例并不限定具体的判断方法,例如可以遍历本节点已有的所有合约动态库,判断是否存在目标智能合约对应的合约动态库;或者可以查询日志记录,判断是否存在该智能合约对应的合约动态库的生成记录,当存在生成记录时,可以判定存在对应的合约动态库,当不存在生成记录时,可以判定不存在对应的合约动态库。
S102:调用合约动态库执行目标智能合约。
在确定存在合约动态库时,可以条用合约动态库执行目标智能合约。具体的,可以确定该目标智能合约对应的合约动态库,并利用该合约动态库执行目标智能合约,例如可以执行合约动态库的入口函数,进而利用合约动态库执行目标智能合约。本实施例并不限定合约动态库的具体执行过程,该过程与目标智能合约的种类及具体内容相关。
S103:预设操作。
当不存在合约动态库时,可以执行预设操作,本实施例并不限定预设操作的具体内容,例如可以利用虚拟机执行目标执行合约;或者可以在确定不存在合约动态库后,对目标智能合约的合约字节码进行解析,根据合约字节码构建目标智能合约对应的合约动态库。合约动态库的具体构建过程与目标智能合约相关,本实施例对此不做限定;或者可以执行其他操作,例如无操作,既不执行任何操作。
应用本发明实施例提供的区块链智能合约执行方法,在确定存在目标智能合约对应的合约动态库后,利用合约动态库执行目标智能合约。合约动态库为一种在操作系统中实现共享函数库概念的方式,在执行目标智能合约时不需要逐条获取指令并执行,而是可以以更接近原生的方式来执行目标智能合约,极大地提升了智能合约的执行效率,提高了区块链的共识效率和吞吐量,同时有利于复杂合约的运行,解决了解决现有智能合约执行方法执行速度较慢,影响了区块链的共识效率和吞吐量的问题。
基于上述实施例,为了尽快将目标智能合约执行完毕,提高智能合约的执行效率,优选的,在确定不存在目标智能合约对应的合约动态库时,还可以调用虚拟机执行目标智能合约。具体的,请参考图2,图2为本发明实施例提供的另一种智能合约执行方法流程示意图,包括:
S201:获取目标智能合约,判断是否存在目标智能合约对应的合约动态库,如果是,则执行S205步骤,否则执行S202步骤。
在本实施例中,目标智能合约为由本节点执行的智能合约,本节点即为执行本发明提供的区块链智能合约执行方法中各个步骤的节点。对于智能合约的具体类型和内容,本实施例不做限定,例如可以为wasm合约。在获取目标智能合约后,判断是否已经存在目标智能合约对应的合约动态库。合约动态库即为动态链接库(Dynamic Link Library或Dynamic-link Library),其可以以更加接近原生的方式执行智能合约,极大地提升合约执行的性能。
本实施例并不限定具体的判断方法,例如可以遍历本节点已有的所有合约动态库,判断是否存在目标智能合约对应的合约动态库;或者可以查询日志记录,判断是否存在该智能合约对应的合约动态库的生成记录,当存在生成记录时,可以判定存在对应的合约动态库,当不存在生成记录时,可以判定不存在对应的合约动态库。
S205:调用合约动态库执行目标智能合约。
在确定存在合约动态库时,可以条用合约动态库执行目标智能合约。具体的,可以确定该目标智能合约对应的合约动态库,并利用该合约动态库执行目标智能合约,例如可以执行合约动态库的入口函数,进而利用合约动态库执行目标智能合约。本实施例并不限定合约动态库的具体执行过程,该过程与目标智能合约的种类及具体内容相关。
S202:调用虚拟机执行目标智能合约。
在确定不存在目标能合约对应的合约动态库后,为了保证目标智能合约的尽快执行,因此调用虚拟机执行目标智能合约。具体的执行过程本实施例不做限定,可以参考相关技术。
S203:对目标智能合约的合约字节码进行解析并构建合约动态库;或,从区块链网络中的其它节点获取与目标智能合约对应的合约动态库。
需要说明的是,在目标智能合约执行完毕后,为了提高智能合约的执行效率,以便在后续接受到同类型的智能合约后提高执行速度,在确定本节点不存在目标智能合约对应的合约动态库后,对合约字节码进行解析,并在解析后构建目标智能合约对应的合约动态库,以便后续利用合约动态库执行与目标智能合约相同类型的智能合约。
在另一种实施方式中,为了节省计算资源,也可以在构建目标智能合约对应的合约动态库之前,判断区块链网络中的其他节点是否存在该合约动态库,若存在,则从其他节点处获取该合约动态库,以便避免同一合约动态库的重复构建。
S204:向区块链网络中的其他节点共享合约动态库。
需要说明的是,S204步骤为可选步骤。
在本实施例中,为了避免同一动态库的重复构建,在构建目标智能合约对应的合约动态库后,主动向区块链网络中的其他节点贡献合约动态库,以便节省计算资源。
基于上述实施例,在实际应用中,wasm作为一种二进制指令格式经常被用作合约代码。本发明实施例将具体说明wasm目标智能合约对应的合约动态库的构建过程。请参考图3,图3为本发明实施例提供的一种合约动态库构建方法流程示意图,包括:
S301:利用wasm MVP规范对合约字节码进行解析,得到导入段字段、全局段字段、函数表段字段和其他字段。
在本发明实施例中,目标智能合约的种类为wasm智能合约。在确定不存在合约动态库后,利用wasm MVP规范对目标智能合约的合约字节码进行解析。wasm合约字节码的本质为一个module,其基本组成单位为section(字段),各个section的格式定义如表一所示:
表一
payload_data的格式与id相关,其具体格式由wasm MVP规范定义。section具体有多种,例如导入段字段、全局段字段、函数表段字段等。具体的,import section(导入段字段),用于声明wasm合约依赖的外部函数,这些函数是需要宿主环境提供的接口;typesection(类型段字段),用于声明wasm合约所有函数的签名,包括其依赖的外部函数;global section(全局段字段),用于声明wasm合约内部使用到的全局变量;memorysection(内存段字段),用于声明wasm合约需要的内存大小,需要宿主环境在执行合约前准备好一块连续的内存;data section(数据段字段),用于声明wasm合约的常量数据段,需要宿主环境在执行合约前在内存中初始化好这些数据;table section(函数表段字段),用于声明wasm合约函数索引表;code section(代码段字段),用于声明wasm合约所有内部函数定义的指令序列。
在本发明实施例中,对合约字节码进行解析后,可以得到导入段字段、全局段字段、函数表段字段和其他字段,其它字段可以包括一种或多种字段,各个字段的具体内容与目标智能合约相关。
S302:利用C数组对导入段字段、全局段字段和函数表段字段进行格式转换,得到对应的外部函数列表、全局变量列表和函数全局索引表。
具体的,本发明实施例中合约动态库由C语言构建而成,需要说明的是,合约动态库还可以利用其他变成语言进行构建。在得到导入段字段后,利用C数组对导入段字段进行格式转换,得到对应的外部函数列表,该外部函数列表即为目标智能合约依赖的外部函数,其具体形式可以如下所示:
extern uint64_t GoFunc(vm_t*,const char*,int32_t,uint64_t*);
static const char*env_func_names[]={};
在后续执行过程中,可以直接根据函数索引作为env_func_names的下标来进行引用,函数索引在目标智能合约代码中记录。
在得到全局段字段后,根据global section的定义,用C数组对其进行格式转换操作,可以得到对应的全局变量列表,全局变量列表的具体形式可以如下所示:
static uint64_t globals[]={};
在后续执行过程中,对于访问全局变量的指令,可以将其转化为对globals数组的访问指令。
在得到函数表段字段后,根据table section的定义,用C数组对目标智能合约的函数全局索引表以及合约函数入口地址列表进行声明,可以得到对应的函数全局索引表,函数全局索引表由两个数组构成,其具体形式可以如下所示:
static uint32_t table_index_space[]={};
static void*funcs_addr_table[]={};
S303:利用其他字段、外部函数列表、全局变量列表和函数全局索引表构建合约动态库。
具体的,在得到外部函数列表、全局变量列表和函数全局索引表后,对其他字段进行格式转换处理,并在处理后构建合约动态库。其他字段中包括多个字段,各个字段的处理过程不同。具体的,请参考图4,图4为本发明实施例提供的一种具体的合约动态库构建方法流程示意图,包括:
S401:利用其它字段中的类型字段生成对应的C格式函数签名。
在本实施例中,其他字段包括类型字段,即类型段字段。由于类型段字段用于记录函数签名,因此对其进行转换,可以生成对应的C格式函数签名。C格式函数签名的具体形式可以如下所示:
void wfun_XX(vm_t*vm,uint32_t lc0,uint32_t lc1)
其中,XX为wasm函数的索引编号,其为正整数。lc0和lc1为函数的输入参数,类型为uint32_t,函数的返回类型为void,因此表示该签名函数无返回值。
S402:读取其它字段中的代码字段,确定代码字段中各个指令的指令类型。
代码字段即代码段字段,用于记录目标智能合约对应的指令,不同指令对应的指令类型可能不同,因此在对指令进行格式转换之前,需要确定代码字段中各个指令的指令类型。
进一步,为了保证代码段字段中每一条指令均被进行格式转换处理。本发明实施例中优选的,定义指令指针,在读取代码字段时,读取指令指针指向的指令。在读取指令后,确定该指令的指令类型,并更新指令指针,以便继续进行指令的读取。
相应的,在根据指令类型对应的代码转换规则将指令转换为C格式指令后,还可以包括:利用指令指针判断代码字段是否读取完毕,具体的,可以判断指令指针的具体位置是否位于代码字段的尾端,当位于代码字段的尾端时,可以确定代码字段读取完毕,因此可以执行后续步骤。
S403:根据指令类型对应的代码转换规则将指令转换为C格式指令。
在确定指令类型后,根据指令类型确定对应的代码转换规则,利用代码转换规则将指令转换为对应的C格式指令。具体的,指令类型的具体分类可以如表二所示:
表二
不同类型指令的格式转换规则不同,得到的C格式指令也不同。例如,常量数据指令对应的C格式指令为:
value_t vn;
vn.field=const_value;
其中,n表示栈上变量的编号,const_value为指令操作数,field为变量vn对应的类型的字段。
比较指令对应的C格式指令为:
value_t vn.vi32=(vx.field op vy.field);
其中,n、x和y为栈上变量的编号,vn、vx和vy分别表示编号为n、x和y的栈上变量的值。op表示对应的比较操作,vx和vy为参与比较的数,比较的结果保存为vn。以i32.lt_s指令为例,转换后的C格式指令为:
value_t v3.vi32=(v1.vi32<v3.vi32);
数值运算指令对应的C格式指令为:
value_t vn.field=(vx.field op vy.field);
其中,op为对应的运算符,vx和vy为参与运算的操作数,vn为运算结果。以i32.add指令为例,转换后得到的C格式指令为:
valut_t v9.vu32=(v7.vu32+v8.vu32);
类型转化指令对应的C格式指令为:
vn.field=(new_field_type)(vn.old_filed_type);
其中,new_field_type表示新格式,old_filed_type表示旧格式,以i32.wrap/i64指令为例,转换后得到的C格式指令为:
v1.vu32=(uint32_t)(v1.vu64);
内存操作指令需要按照wasm MVP规范定义的小端模式读写内存数据,内存的变异地址包含在操作柱和栈顶变量中。具体的,以i32.load和i32.store指令为例,转换后得到的C格式指令为:
static inline uint32_t loadU32(uint8_t*p){
return(((uint32_t)p[0])|(((uint32_t)p[1])<<8)|(((uint32_t)p[2])<<16)|(((uint32_t)p[3])<<24));
}
static inline void storeU32(uint8_t*p,uint32_t v){
p[0]=(((uint8_t)v)&0xff);
p[1]=((uint8_t)((v>>8)&0xff));
p[2]=((uint8_t)((v>>16)&0xff));
p[3]=((uint8_t)((v>>24)&0xff));
}
函数调用指令分为call指令和call_indirect指令,其中,call指令的作用在于在本函数中直接调用另一函数,因此需要确定函数名称、函数入参变量类型与个数、函数返回值类型等信息。由于wasm为栈式虚拟机上运行的代码,因此各个函数均有对应的栈式生成器。在执行call指令时,函数名称可以由栈式生成器在栈顶位置的函数索引值确定,函数入参变量可根据函数签名来确定需要从栈式生成器中读取的变量。call_indirect指令为间接调用指令,该指令在对应的栈式生成器的栈顶位置保存函数表索引值,即函数表段字段对应的函数全局索引表提供的索引值,
跳转控制指令分为br、br_if和br_table三种指令,br和br_if指令可以利用C语言中的goto语句进行转换,br_table可以利用C语言中的switch-case语句进行转换。
S404:利用C格式指令构建C格式函数,并构建C格式函数对应的栈式生成器。
在转换得到C格式指令后,利用C格式指令构建C格式函数,并构建各个C格式函数对应的栈式生成器。
S405:生成手续费判断宏,利用手续费判断宏、C格式函数签名、C格式函数、外部函数列表、全局变量列表和函数全局索引表构建C格式代码。
在现有智能合约的执行过程中,需要在每一条指令执行之前判断手续费是否足够,在手续费足够的情况下才能够执行该指令。因此本发明实施例中,生成手续费判断宏,用于判断手续费是否足够,保证手续费的一致性。由于不同的指令对应的手续费多少不同,因此手续费判断宏需要能够根据指令种类进行手续费判断。具体的,手续费判断宏可以为:
#define GAS_CHECKER(cost)\
if(likely(vm->gas>=cost)){\
vm->gas-=cost;\
vm->gas_used+=cost;\
}else{\
panic(vm,"OutOfGas");\
}
其中,vm-gas为合约调用这传递的最大手续费,cost为当前指令需要收取的手续费。在生成手续费判断宏后,利用手续费判断宏、C格式函数签名、C格式函数、外部函数列表、全局变量列表和函数全局索引表构建C格式代码。
S406:利用C格式代码和栈式生成器构建合约动态库。
在生成C格式代码后,利用栈式生成器和C格式代码构建合约动态库。
应用本发明实施例提供的区块链智能合约执行方法,根据指令种类不同按照不同的转换规则对其进行转换,并在C格式代码中插入手续费判断宏,以便保证手续费一致性。
基于上述实施例,为了提高目标智能合约的执行速度,优选的,判断是否存在目标智能合约对应的合约动态库的步骤,可以包括:
查询本地数据库,判断是否存在合约动态库的生成记录。
在本实施例中,为了提高目标智能合约的执行速度,通过查询生成记录的方式来判断是否存在对应的合约动态库,可以快速地确定是否存在合约动态库,以便进行后续步骤。具体的,若存在合约动态库的生成记录,则确定存在目标智能合约对应的合约动态库,若不存在合约动态库的生成记录,则确定不存在目标智能合约对应的合约动态库。
下面对本发明实施例提供的区块链智能合约执行装置进行介绍,下文描述的区块链智能合约执行装置与上文描述的区块链智能合约执行方法可相互对应参照。
请参考图5,图5为本发明实施例提供的一种区块链智能合约执行装置的结构示意图,包括:
判断模块510,用于获取目标智能合约,判断是否存在目标智能合约对应的合约动态库;
执行模块520,用于若存在目标智能合约对应的合约动态库,则调用合约动态库执行目标智能合约。
可选地,还包括:
虚拟机执行模块,用于若不存在目标智能合约对应的合约动态库,则调用虚拟机执行目标智能合约。
可选地,还包括:
动态库构建模块,用于对目标智能合约的合约字节码进行解析并构建合约动态库;
或,
动态库获取模块,用于从区块链网络中的其它节点获取与目标智能合约对应的合约动态库。
可选地,动态库构建模块,还包括:
分享单元,用于向区块链网络中的其他节点共享合约动态库。
可选地,动态库构建模块,包括:
解析单元,用于利用wasm MVP规范对合约字节码进行解析,得到导入段字段、全局段字段、函数表段字段和其他字段;
转换单元,用于利用C数组对导入段字段、全局段字段和函数表段字段进行格式转换,得到对应的外部函数列表、全局变量列表和函数全局索引表;
构建单元,用于利用其他字段、外部函数列表、全局变量列表和函数全局索引表构建合约动态库。
可选地,构建单元,包括:
签名生成子单元,用于利用其它字段中的类型字段生成对应的C格式函数签名;
指令类型确定子单元,用于读取其它字段中的代码字段,确定代码字段中各个指令的指令类型;
指令转换子单元,用于根据指令类型对应的代码转换规则将指令转换为C格式指令;
栈式生成器构建子单元,用于利用C格式指令构建C格式函数,并构建C格式函数对应的栈式生成器;
C格式代码构建子单元,用于生成手续费判断宏,利用手续费判断宏、C格式函数签名、C格式函数、外部函数列表、全局变量列表和函数全局索引表构建C格式代码;
合约动态库构建子单元,用于利用C格式代码和栈式生成器构建合约动态库。
可选地,指令类型确定子单元,包括:
指令读取子单元,用于定义指令指针,读取指令指针指向的指令;
类型确定子单元,用于确定指令的指令类型,并更新指令指针;
相应的,构建单元,还包括:
完毕判断子单元,用于利用指令指针判断代码字段是否读取完毕;
相应的,栈式生成器构建子单元为当代码字段读取完毕时,利用C格式指令构建C格式函数的子单元。
可选地,判断模块510,包括:
生成记录判断单元,用于查询本地数据库,判断是否存在合约动态库的生成记录;
第一确定单元,用于若存在合约动态库的生成记录,则确定存在目标智能合约对应的合约动态库;
第二确定单元,用于若不存在合约动态库的生成记录,则确定不存在目标智能合约对应的合约动态库。
下面对本发明实施例提供的区块链智能合约执行设备进行介绍,下文描述的区块链智能合约执行设备与上文描述的区块链智能合约执行方法可相互对应参照。
请参考图6,图6为本发明实施例提供的一种区块链智能合约执行设备的结构示意图。在本实施例中,区块链智能合约执行设备600可以是PC(Personal Computer,个人电脑),也可以是智能手机、平板电脑、掌上电脑、便携计算机等终端设备。
可选地,该区块链智能合约执行设备600可以是组成CDN网络或者区块链网络的节点。
该区块链智能合约执行设备600可以包括存储器601、处理器602和总线603。
其中,存储器601至少包括一种类型的可读存储介质,所述可读存储介质包括闪存、硬盘、多媒体卡、卡型存储器(例如,SD或DX存储器等)、磁性存储器、磁盘、光盘等。存储器601在一些实施例中可以是区块链智能合约执行设备600的内部存储单元,例如该区块链智能合约执行设备600的硬盘。存储器601在另一些实施例中也可以是区块链智能合约执行设备600的外部存储设备,例如区块链智能合约执行设备600上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等。进一步地,存储器601还可以既包括区块链智能合约执行设备600的内部存储单元也包括外部存储设备。存储器601不仅可以用于存储安装于区块链智能合约执行设备600的应用软件及各类数据,例如区块链智能合约执行程序01的代码等,还可以用于暂时地存储已经输出或者将要输出的数据。
处理器602在一些实施例中可以是一中央处理器(Central Processing Unit,CPU)、控制器、微控制器、微处理器或其他数据处理芯片,用于运行存储器601中存储的程序代码或处理数据,例如执行区块链智能合约执行程序01等。
该总线603可以是外设部件互连标准(peripheral component interconnect,简称PCI)总线或扩展工业标准结构(extended industry standard architecture,简称EISA)总线等。该总线可以分为地址总线、数据总线、控制总线等。为便于表示,图5中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
进一步地,区块链智能合约执行设备600还可以包括网络接口604,网络接口604可选的可以包括有线接口和/或无线接口(如WI-FI接口、蓝牙接口等),通常用于在该区块链智能合约执行设备600与其他电子设备之间建立通信连接。
可选地,该区块链智能合约执行设备600还可以包括用户接口,用户接口可以包括显示器(Display)、输入单元比如键盘(Keyboard),可选的用户接口还可以包括标准的有线接口、无线接口。可选地,在一些实施例中,显示器可以是LED显示器、液晶显示器、触控式液晶显示器以及OLED
(Organic Light-Emitting Diode,有机发光二极管)触摸器等。其中,显示器也可以适当的称为显示屏或显示单元,用于显示在区块链智能合约执行设备600中处理的信息以及用于显示可视化的用户界面。
图6仅示出了具有组件601-603以及区块链智能合约执行程序01的区块链智能合约执行设备600,本领域技术人员可以理解的是,图6示出的结构并不构成对区块链智能合约执行设备600的限定,可以包括比图示更少或者更多的部件,或者组合某些部件,或者不同的部件布置。
下面对本发明实施例提供的计算机可读存储介质进行介绍,下文描述的计算机可读存储介质与上文描述的区块链智能合约执行方法可相互对应参照。
本发明还提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述的区块链智能合约执行方法的步骤。
该计算机可读存储介质可以包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。
所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存储的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘Solid State Disk(SSD))等
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的设备,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的设备,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
需要说明的是,上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。并且本文中的术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、装置、物品或者方法不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、装置、物品或者方法所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、装置、物品或者方法中还存在另外的相同要素。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。