一种在虚拟机中执行功能模块的方法和装置转让专利

申请号 : CN202010147875.X

文献号 : CN111008067B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 郭学鹏林志平

申请人 : 支付宝(杭州)信息技术有限公司

摘要 :

本说明书实施例提供了一种在虚拟机中执行功能模块的方法和装置,所述功能模块在第一模块中定义,所述方法包括:获取所述第一模块的WASM指令序列;基于所述第一模块的WASM指令序列确定全局变量标识范围;基于所述全局变量标识范围,对所述第一模块的WASM指令序列中的每个指令进行全局变量标识检查,以确定是否执行所述功能模块。

权利要求 :

1.一种在虚拟机中执行功能模块的方法,所述功能模块在第一模块中定义,所述方法包括:获取所述第一模块的WASM指令序列;

基于所述第一模块的WASM指令序列确定全局变量标识范围;

基于所述全局变量标识范围,对于所述第一模块的WASM指令序列中的每个指令,解析该指令是否为全局变量访问指令,在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内,以确定是否执行所述功能模块。

2.根据权利要求1所述的方法,还包括,在确定所述第一模块的WASM指令序列中不包括全局变量访问指令的情况中,解释执行所述功能模块的WASM指令序列。

3.根据权利要求1所述的方法,其中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内,以确定是否执行所述功能模块包括,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,结束对所述第一模块的处理。

4.根据权利要求3所述的方法,其中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内,以确定是否执行所述功能模块还包括,在检查所述第一模块的各个全局变量访问指令中包括的全局变量标识都在所述全局变量标识范围内的情况中,解释执行所述功能模块的WASM指令序列。

5.根据权利要求1所述的方法,其中,所述虚拟机为区块链节点中的虚拟机,所述第一模块为第一合约,其中,获取所述第一模块的WASM指令序列包括,在执行调用第一合约中的函数的第一交易时,从本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列。

6.根据权利要求5所述的方法,其中,从本地存储介质中读取第一合约的指令序列包括,从本地存储介质中读取第一合约的经可变长编码的指令序列,对所述经可变长编码的指令序列进行解码,以获取所述第一合约的WASM指令序列。

7.根据权利要求5所述的方法,还包括,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,相对于所述第一交易进行报错处理。

8.一种在虚拟机中执行功能模块的装置,所述功能模块在第一模块中定义,所述装置包括:获取单元,配置为,获取所述第一模块的WASM指令序列;

确定单元,配置为,基于所述第一模块的WASM指令序列确定全局变量标识范围;

检查单元,配置为,基于所述全局变量标识范围,对于所述第一模块的WASM指令序列中的每个指令,解析该指令是否为全局变量访问指令,在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内,以确定是否执行所述功能模块。

9.根据权利要求8所述的装置,所述检查单元还包括:

第一执行子单元,配置为,在确定所述第一模块的WASM指令序列中不包括全局变量访问指令的情况中,解释执行所述功能模块的WASM指令序列。

10.根据权利要求8所述的装置,其中,所述检查单元包括检查子单元,所述检查子单元包括,结束子单元,配置为,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,结束对所述第一模块的处理。

11.根据权利要求10所述的装置,其中,所述检查子单元还包括,

第二执行子单元,配置为,在检查所述第一模块的各个全局变量访问指令中包括的全局变量标识都在所述全局变量标识范围内的情况中,解释执行所述功能模块的WASM指令序列。

12.根据权利要求8所述的装置,其中,所述虚拟机为区块链节点中的虚拟机,所述第一模块为第一合约,其中,所述获取单元还配置为,在执行调用第一合约中的函数的第一交易时,从本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列。

13.根据权利要求12所述的装置,其中,所述获取单元包括,读取子单元,配置为,从本地存储介质中读取第一合约的经可变长编码的指令序列,解码子单元,配置为,对所述经可变长编码的指令序列进行解码,以获取所述第一合约的WASM指令序列。

14.根据权利要求12所述的装置,还包括,报错单元,配置为,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,相对于所述第一交易进行报错处理。

15.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行权利要求1-7中任一项的所述的方法。

16.一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现权利要求1-7中任一项所述的方法。

说明书 :

一种在虚拟机中执行功能模块的方法和装置

技术领域

[0001] 本说明书一个或多个实施例涉及区块链技术领域,更具体地,涉及一种在虚拟机中执行功能模块的方法和装置。

背景技术

[0002] 虚拟机(Virtual Machine)是通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。由于虚拟机可以隔离底层硬件平台以及操作系统对上层应用的影响,因此非常有利于上层应用的开发。上层应用开发过程中无需关注底层平台的细节,只需要关注具体的业务逻辑。开发完成后,由虚拟机运行上层应用,负责将应用的代码转换为适于底层平台执行的代码。具体地,在许多场景中,上层应用由开发人员使用高级语言编写开发,之后通过编译器编译为字节码(bytecode)。字节码是一种执行程序,由一序列操作码(op码)-数据对组成的二进制文件,是一种中间码。然后,虚拟机中的解释器对字节码代表的指令流进行解释和执行。
[0003] 例如,在支持智能合约的区块链应用场景中,可以在区块链网络的每个节点中部署虚拟机。用户可以用高级语言编写智能合约,然后经由编译器编译为字节码之后,将该字节码包含在创建智能合约的交易中,发布到区块链网络中,也就是部署到区块链网络的各个节点中。在需要执行智能合约时,由各个节点中的虚拟机对该字节码进行解释执行。
[0004] 随着WASM语言的出现,越来越多的区块链中使用WASM作为智能合约的编写语言,相对应地,使用WASM虚拟机来执行智能合约。WASM即WebAssembly,是由W3C社区组织推出的一种为栈式虚拟机设计的二进制指令形式,是一种新的平台无关的中间字节码格式。虚拟机加载执行WASM智能合约可以分为两个步骤:静态加载做LEB128解码和指令解析,动态执行解析后的WASM指令。其中第一步属于低频操作,第二步属于高频耗时操作。在第二步中,每当执行一个全局访问指令,都要进行一次越界检查,所述越界检查用于确定全局访问指令中全局变量的下标是否超出合约SCORE中定义的全局变量下标范围,以防止出现安全漏洞和恶意攻击。所述越界检查使得智能合约执行效率降低。
[0005] 在包括但不限于区块链的各种应用场景中,WASM虚拟机解释器对字节码的解释执行速度对于整个系统的性能都至关重要。因此,希望能有改进的方案,进一步提高WASM虚拟机中字节码指令流的执行效率。

发明内容

[0006] 本说明书实施例旨在提供一种更有效的执行功能模块的方法,以解决现有技术中的不足。
[0007] 为实现上述目的,本说明书一个方面提供一种在虚拟机中执行功能模块的方法,所述功能模块在第一模块中定义,所述方法包括:
[0008] 获取所述第一模块的WASM指令序列;
[0009] 基于所述第一模块的WASM指令序列确定全局变量标识范围;
[0010] 基于所述全局变量标识范围,对所述第一模块的WASM指令序列中的每个指令进行全局变量标识检查,以确定是否执行所述功能模块。
[0011] 在一种实施方式中,对所述第一模块的WASM指令序列中的每个指令进行全局变量标识检查包括:
[0012] 解析该指令是否为全局变量访问指令;
[0013] 在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内,以确定是否执行所述功能模块;
[0014] 在确定所述第一模块的WASM指令序列中不包括全局变量访问指令的情况中,解释执行所述功能模块的WASM指令序列。
[0015] 在一种实施方式中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内,以确定是否执行所述功能模块包括,
[0016] 在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,结束对所述第一模块的处理;
[0017] 在检查所述第一模块的各个全局变量访问指令中包括的全局变量标识都在所述全局变量标识范围内的情况中,解释执行所述功能模块的WASM指令序列。
[0018] 在一种实施方式中,所述虚拟机为区块链节点中的虚拟机,所述第一模块为第一合约,其中,获取所述第一模块的WASM指令序列包括,在执行调用第一合约中的函数的第一交易时,从本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列。
[0019] 在一种实施方式中,从本地存储介质中读取第一合约的指令序列包括,从本地存储介质中读取第一合约的经可变长编码的指令序列,对所述经可变长编码的指令序列进行解码,以获取所述第一合约的WASM指令序列。
[0020] 在一种实施方式中,所述方法还包括,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,相对于所述第一交易进行报错处理。
[0021] 本说明书另一方面提供一种在虚拟机中执行功能模块的装置,所述功能模块在第一模块中定义,所述装置包括:
[0022] 获取单元,配置为,获取所述第一模块的WASM指令序列;
[0023] 确定单元,配置为,基于所述第一模块的WASM指令序列确定全局变量标识范围;
[0024] 检查单元,配置为,基于所述全局变量标识范围,对所述第一模块的WASM指令序列中的每个指令进行全局变量标识检查,以确定是否执行所述功能模块。
[0025] 在一种实施方式中,所述检查单元包括:
[0026] 解析子单元,配置为,解析该指令是否为全局变量访问指令;
[0027] 检查子单元,配置为,在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内,以确定是否执行所述功能模块;
[0028] 第一执行子单元,配置为,在确定所述第一模块的WASM指令序列中不包括全局变量访问指令的情况中,解释执行所述功能模块的WASM指令序列。
[0029] 在一种实施方式中,所述检查子单元包括,
[0030] 结束子单元,配置为,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,结束对所述第一模块的处理;
[0031] 第二执行子单元,配置为,在检查所述第一模块的各个全局变量访问指令中包括的全局变量标识都在所述全局变量标识范围内的情况中,解释执行所述功能模块的WASM指令序列。
[0032] 在一种实施方式中,所述虚拟机为区块链节点中的虚拟机,所述第一模块为第一合约,其中,所述获取单元还配置为,在执行调用第一合约中的函数的第一交易时,从本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列。
[0033] 在一种实施方式中,所述获取单元包括,读取子单元,配置为,从本地存储介质中读取第一合约的经可变长编码的指令序列,解码子单元,配置为,对所述经可变长编码的指令序列进行解码,以获取所述第一合约的WASM指令序列。
[0034] 在一种实施方式中,所述装置还包括,报错单元,配置为,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,相对于所述第一交易进行报错处理。
[0035] 本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
[0036] 本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
[0037] 通过根据本说明书实施例的智能合约执行方案,在解释执行指令序列之前的静态解析过程中,对合约SCORE的指令序列进行一次全局变量下标越界的检查,而不需要每次执行全局变量访问指令时都进行一次下标越界检查,大大减少了在解释执行指令序列时的时长,实现了更高的合约执行速度。

附图说明

[0038] 通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:
[0039] 图1示意示出在区块链网络中调用合约SCORE的过程示意图;
[0040] 图2示出根据本说明书一个实施例的一种在虚拟机中执行合约SCORE的函数(func (;0;))的方法流程图;
[0041] 图3示出根据本说明书实施例的一种在虚拟机中执行功能模块的装置300。

具体实施方式

[0042] 下面将结合附图描述本说明书实施例。
[0043] 如本领域技术人员所知,区块链网络中包含若干节点,各个节点之间可以进行通信。在例如联盟链的区块链中,用户可以通过客户端向区块链中任一节点发送交易,交易既可以是普通的转账交易,也可以用于部署智能合约或调用智能合约。假设区块链的用户Bob想要发布智能合约Contract SCORE,该智能合约包括如下所示的WASM 文本序列:
[0044] (Contract SCORE
[0045]   (type (;0;) (func (result i32)))
[0046]   (func (;0;) (type 0) (result i32)
[0047]     get_global 0)
[0048]   (global (;0;) i32 (i32.const -2))
[0049]   (global (;1;) f32 (f32.const -0x1.8p+1 (;=-3;)))
[0050]   (global (;2;) f64 (f64.const -0x1p+2 (;=-4;)))
[0051]   (global (;3;) i64 (i64.const -5))
[0052]   (global (;4;) (mut i32) (i32.const -12))
[0053]   (global (;5;) (mut f32) (f32.const -0x1.ap+3 (;=-13;)))
[0054]   (global (;6;) (mut f64) (f64.const -0x1.cp+3 (;=-14;)))
[0055]   (global (;7;) (mut i64) (i64.const -15))
[0056]   (export "get-a" (func 0)))。
[0057] 其中,上述代码第3行定义了接口函数func (;0;),该函数中包括,get_global 0,用于把第0个全局变量值返回给调用者。上述合约代码中还通过第5~12行对第0~7个全局变量进行了定义。可以理解,为了便于阅读,上述WASM指令序列以文本的形式显示,在虚拟机中,WASM指令序列以二进制的格式表示。
[0058] 然后,Bob可通过其客户端向区块链中任一节点发布用于创建该合约SCORE的交易。从而,区块链网络中的各个节点均可以获取并在本地部署上述智能合约SCORE。
[0059] 图1示意示出在区块链网络中调用合约SCORE的过程示意图。如图1中所示,区块链网络100中包括节点A~D,用户Alice的客户端可与节点A~D中任一节点连接。假定区块链网络的用户Alice想要调用以上智能合约SCORE,那么Alice通过其客户端可以向例如节点A发起例如交易1(Tx 1),进行合约调用。
[0060] 具体而言,在交易1中,from字段可以是调用者Alice的地址,to字段即为上述SCORE合约的合约名称和合约地址,表示该交易所调用的智能合约。在数据字段,包含要调用的合约中的方法或函数名称(func (;0;))。
[0061] 在Alice将交易1发布到区块链中去之后,各个节点都可以获取并执行交易1。在执行交易1时,通过WASM虚拟机执行合约SCORE中的函数,从而返回合约执行结果。其中,例如在节点D的虚拟机中执行交易1时,从本地区块中获取上述合约SCORE的指令序列,然后对该指令序列中的各个全局访问指令进行静态解析,以进行越界检查,在确定各个全局访问指令中的变量下标(即上述指令get_global 0中的“0”)都未越界之后,再解释执行func (;0;),具体是,基于WASM序列获取对应的机器码(machine code)并执行该机器码。从而不需要在解释执行func (;0;)的动态过程中进行下标越界的检查,尤其在func (;0;)为循环程序的情况下,可大大节省函数的解释执行时间。
[0062] 可以理解,图1及相应的描述仅仅是示意性的,而不是限制性的,例如,所述区块链网络不限于为联盟链网络,而也可以为公链网络。另外,所述WASM指令序列不限于为区块链中智能合约的指令序列,而也可以为其它应用场景中的计算模块的指令序列。下文中将以区块链中的智能合约为例进行示例性描述。
[0063] 下文将详细描述上述在解释执行WASM智能合约之前静态分析全局变量下标越界的方案。
[0064] 图2示出根据本说明书一个实施例的一种在区块链节点的虚拟机中执行合约SCORE的函数(func (;0;))的方法流程图,包括:
[0065] 步骤S202,获取合约SCORE的WASM指令序列;
[0066] 步骤S204,基于合约SCORE的WASM指令序列确定全局变量标识范围;
[0067] 步骤S206,对于所述合约SCORE的WASM指令序列中的每个指令,解析该指令是否为全局变量访问指令;
[0068] 步骤S208,在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内;
[0069] 步骤S210,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,结束对所述合约SCORE的处理;
[0070] 步骤S212,在所述指令序列中不包括全局变量访问指令、或者所述指令序列中的全局变量访问指令都未越界的情况中,解释执行合约SCORE的函数func (;0;)。
[0071] 下面详细描述图2中各个步骤的执行过程。
[0072] 首先,在步骤S202,获取合约SCORE的WASM指令序列。
[0073] 如上文所述,当节点D中的虚拟机执行调用合约SCORE中某个函数(func (;0;))的交易(例如交易1)时,可从本地存储存储介质中找到预先部署的合约SCORE的指令序列。具体是,基于交易1中的合约SCORE的名称或合约账户,可获取合约SCORE在本地存储介质中的存储地址,并通过该地址读取合约SCORE。例如,在本地存储的区块数据库中,记录了合约的合约地址的哈希值与合约存储地址的对应关系,从而,通过从该对应关系检索合约SCORE的合约地址的哈希值,从而可找到合约SCORE在存储介质中的存储地址。
[0074] 在一种实施方式中,所述存储介质中存储的合约SCORE的指令序列为WASM指令序列,从而可从存储介质中直接获取合约SCORE的WASM指令序列。
[0075] 在一种实施方式中,所述存储介质中存储的合约SCORE的指令序列为经leb 128编码的指令序列,以减小文件体积,更好利用存储空间。Leb 128即"Little-Endian Base 128",是对任意有符号或者无符号整型数的可变长度的编码,因此,用Leb128编码的整数,会根据数字的大小改变所占字节数。根据leb 128的编码方式,每个字节的8位(8个bits)中,较低的7位为有效数据部分,最高位用于指示当前字节是否为最后一个字节,1表示最后一个字节,0表示不是最后一个字节,也就是需要接续后续字节。如此,可以采用不同字节数编码不同大小的整数。
[0076] 相应地,对于leb编码的指令序列,在解码该指令序列时,先将各个字节还原为8位,通过最高位判断是否要接续后面的字节,共同形成目标数据。因此,对该指令序列进行leb 128解码,会得到不定长的指令。为了对这些指令进行存储,可以将可变长指令转换为内存对齐的定长指令。从而,在对leb编码的指令序列进行解码之后,可获取合约SCORE的WASM指令序列。
[0077] 可以理解,在该实施例中,不限于从节点本地存储介质中获取WASM指令序列,例如,在一种实施方式中,可从内存中读取预先缓存的合约SCORE的WASM指令序列。
[0078] 在步骤S204,基于合约SCORE的WASM指令序列确定全局变量标识范围。
[0079] 参考上述合约SCORE的WASM文本序列,虚拟机在获取与该文本序列相应的WASM指令序列之后,通过逐条读取每条指令,可获知该指令序列中共包括多少全局变量。具体是,通过读取上述WASM文本序列中第5-12行对应的WASM指令之后,可确定该指令序列中包括全局变量0~7,共8个全局变量,从而为这些全局变量分配的变量下标分别为0~7,即全局变量标识范围为0~7。
[0080] 在步骤S206,对于所述合约SCORE的WASM指令序列中的每个指令,逐条解析该指令是否为全局变量访问指令。
[0081] 例如,当解析到合约SCORE的第4行的“get_global 0”,可解析出该指令为全局变量读指令。全局变量访问指令不限于为全局变量读指令,还包括全局变量写指令,例如,“set_global 1”。该步骤为相对于WASM指令序列中的各条指令的循环步骤。如图2中所示,对于WASM指令序列中的第i条指令,解析该执行是否为全局变量访问指令,如果是,则进入步骤S208,如果不是,如果还有下一条指令,则对第i+1条执行继续执行该步骤,如果没有下一条指令,即该条指令为最后一条指令,则进入步骤S212,即解释执行函数func (;0;)的指令序列。
[0082] 在步骤S208,在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内。
[0083] 例如,对于合约SCORE中的全局变量读指令get_global 0,即检查其中的变量下标“0”是否在上述全局变量标识范围0~7之内,显然,0在范围0~7之内。如图2中所示,该步骤为相对于指令序列中的每个全局变量访问指令的循环,当确定指令get_global 0中的变量下标0在范围0~7之内的情况中,如果该指令为合约SCORE的最后一条指令,则进入步骤S212,即,解释执行函数func (;0;)的指令序列,如果该指令不是合约SCORE的最后一条指令,则返回到步骤S206重新执行。
[0084] 假设合约SCORE中除了上述全局变量读指令,还包括全局变量写指令“set_global 10”,很显然,该指令中的变量下标“10”超出了上述虚拟机获取的全局变量标识范围0~7,从而,该全局变量写指令的变量下标是越界的,即,合约SCORE中包括错误指令。所述错误指令“set_global 10”可能是由于打字错误造成,也有可能是恶意方故意发送的恶意指令序列,如果在虚拟机中执行该错误指令,有可能会造成系统漏洞,从而让恶意方有机可乘。在该情况中,执行步骤S210。
[0085] 在步骤S210,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,结束对所述合约SCORE的处理。
[0086] 所述结束对所述合约SCORE的处理,也即取消该虚拟机,从而停止对交易1的执行。
[0087] 在一种实施方式中,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,在取消虚拟机之前,还进行报错处理。例如,可在状态数据库中记录交易1的执行出错,或者,可在运行日志中记录对交易1的执行出错,其中例如可记录错误码,以指示是全局变量下标越界的错误。节点在发现针对交易1的报错之后,可对发送交易1的客户端发送交易回执,在所述回执中包括所述错误码,以使得用户Alice可获知交易1中存在的错误。
[0088] 在实际执行合约函数的过程中,有可能对该函数循环成百上千次,或者有可能在该函数中,对全局变量访问指令循环成百上千次,在该情况中,通过图2所示方法中,只需要在解释执行指令序列之前的静态解析过程中,对合约SCORE的指令序列进行一次全局变量下标越界的检查,而不需要每次执行全局变量访问指令时都进行一次下标越界检查,大大减少了在解释执行指令序列时的时长,实现了更高的合约执行速度。
[0089] 可以理解,虽然上文以在WASM虚拟机中对智能合约的指令序列进行下标越界检查为例进行了描述,本说明书实施例不限于上述实施例。WASM语言可用于多种场景中,如在AutoCAD、GoogleEarth、Unity、WebPack中都通过在虚拟机中执行WASM程序而实施相应的功能,在这些场景中,类似地,通过在虚拟机中在静态解析阶段对WASM计算模块进行越界检查,从而在解释执行该计算模块中的功能模块(即函数)时,可大大减少程序执行时间,加快程序执行速度。
[0090] 图3示出根据本说明书实施例的一种在虚拟机中执行功能模块的装置300,所述功能模块在第一模块中定义,所述装置包括:
[0091] 获取单元31,配置为,获取所述第一模块的WASM指令序列;
[0092] 确定单元32,配置为,基于所述第一模块的WASM指令序列确定全局变量标识范围;
[0093] 检查单元33,配置为,基于所述全局变量标识范围,对所述第一模块的WASM指令序列中的每个指令进行全局变量标识检查,以确定是否执行所述功能模块。
[0094] 在一种实施方式中,所述检查单元33包括:
[0095] 解析子单元331,配置为,解析该指令是否为全局变量访问指令;
[0096] 检查子单元332,配置为,在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内,以确定是否执行所述功能模块;
[0097] 第一执行子单元333,配置为,在确定所述第一模块的WASM指令序列中不包括全局变量访问指令的情况中,解释执行所述功能模块的WASM指令序列。
[0098] 在一种实施方式中,所述检查子单元332包括,
[0099] 结束子单元3321,配置为,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,结束对所述第一模块的处理;
[0100] 第二执行子单元3322,配置为,在检查所述第一模块的各个全局变量访问指令中包括的全局变量标识都在所述全局变量标识范围内的情况中,解释执行所述功能模块的WASM指令序列。
[0101] 在一种实施方式中,所述虚拟机为区块链节点中的虚拟机,所述第一模块为第一合约,其中,所述获取单元31还配置为,在执行调用第一合约中的函数的第一交易时,从本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列。
[0102] 在一种实施方式中,所述获取单元31包括,读取子单元311,配置为,从本地存储介质中读取第一合约的经可变长编码的指令序列,解码子单元312,配置为,对所述经可变长编码的指令序列进行解码,以获取所述第一合约的WASM指令序列。
[0103] 在一种实施方式中,所述装置还包括,报错单元34,配置为,在检查出该指令包括的全局变量标识超出所述全局变量标识范围的情况中,相对于所述第一交易进行报错处理。
[0104] 本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
[0105] 本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
[0106] 需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。
[0107] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0108] 上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0109] 本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。其中,软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
[0110] 以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。