CN111045792A - 缓存和执行智能合约的方法和装置 - Google Patents
缓存和执行智能合约的方法和装置 Download PDFInfo
- Publication number
- CN111045792A CN111045792A CN202010172887.8A CN202010172887A CN111045792A CN 111045792 A CN111045792 A CN 111045792A CN 202010172887 A CN202010172887 A CN 202010172887A CN 111045792 A CN111045792 A CN 111045792A
- Authority
- CN
- China
- Prior art keywords
- contract
- wasm
- sequence
- instruction
- instructions
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 60
- 230000006870 function Effects 0.000 claims abstract description 160
- 238000007781 pre-processing Methods 0.000 claims description 17
- 238000004458 analytical method Methods 0.000 claims description 3
- 238000004590 computer program Methods 0.000 claims description 3
- 238000007689 inspection Methods 0.000 claims description 2
- 238000004364 calculation method Methods 0.000 description 37
- 238000010586 diagram Methods 0.000 description 10
- 230000008569 process Effects 0.000 description 6
- 230000005055 memory storage Effects 0.000 description 4
- 238000011161 development Methods 0.000 description 2
- 238000012545 processing Methods 0.000 description 2
- 238000004422 calculation algorithm Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000004927 fusion Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45583—Memory management, e.g. access or allocation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本说明书实施例提供了一种智能合约缓存方法和装置,所述方法由区块链节点的虚拟机执行第一交易时执行,所述第一交易用于调用第一合约的第一函数,所述方法包括:确定内存中是否缓存有所述第一合约的WASM指令序列;在确定内存中缓存了所述第一合约的WASM指令序列的情况中,从内存中读取所述第一合约的WASM指令序列,以获取所述第一函数的WASM指令序列;基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
Description
技术领域
本说明书一个或多个实施例涉及区块链技术领域,更具体地,涉及在区块链中缓存和执行智能合约的方法和装置。
背景技术
虚拟机(Virtual Machine)是通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。由于虚拟机可以隔离底层硬件平台以及操作系统对上层应用的影响,因此非常有利于上层应用的开发。上层应用开发过程中无需关注底层平台的细节,只需要关注具体的业务逻辑。开发完成后,由虚拟机运行上层应用,负责将应用的代码转换为适于底层平台执行的代码。具体地,在许多场景中,上层应用由开发人员使用高级语言编写开发,之后通过编译器编译为字节码(bytecode)。字节码是一种执行程序,由一序列操作码(op码)-数据对组成的二进制文件,是一种中间码。然后,虚拟机中的解释器对字节码代表的指令流进行解释和执行。
例如,在支持智能合约的区块链应用场景中,可以在区块链网络的每个节点中部署虚拟机。用户可以用高级语言编写智能合约,然后经由编译器编译为字节码之后,将该字节码包含在创建智能合约的交易中,发布到区块链网络中,也就是部署到区块链网络的各个节点中。在需要执行智能合约时,由各个节点中的虚拟机对该字节码进行解释执行。
随着WASM语言的出现,越来越多的区块链中使用WASM作为智能合约的编写语言,相对应地,使用WASM虚拟机来执行智能合约。WASM即WebAssembly,是由W3C社区组织推出的一种为栈式虚拟机设计的二进制指令形式,是一种新的平台无关的中间字节码格式。WASM虚拟机为栈式虚拟机,其中,将所有指令的操作数都放到栈上,即,每次操作都从栈上获取操作数,并在指令执行结束后将结果压入栈中。
在通过区块链各个节点的WASM虚拟机执行智能合约的应用场景中,WASM虚拟机解释器对合约的执行速度对于整个系统的性能都至关重要。因此,希望能有改进的方案,进一步提高WASM虚拟机对智能合约的执行效率。
发明内容
本说明书实施例旨在提供一种更有效的缓存和执行智能合约的方案,以解决现有技术中的不足。
为实现上述目的,本说明书一个方面提供一种智能合约执行方法,所述方法由区块链节点的虚拟机执行第一交易时执行,所述第一交易用于调用第一合约的第一函数,所述方法包括:
确定内存中是否缓存有所述第一合约的WASM指令序列;
在确定内存中缓存了所述第一合约的WASM指令序列的情况中,从内存中读取所述第一合约的WASM指令序列,以获取所述第一函数的WASM指令序列;
基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
在一种实施方式中,所述方法还包括,
在确定内存中没有缓存所述第一合约的WASM指令序列的情况中,从所述节点本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列;
将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中。
在一种实施方式中,从所述节点本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列包括,从节点本地存储介质中读取第一合约的经可变长编码的指令序列,通过对第一合约的经可变长编码的指令序列进行解码,获取所述第一合约的WASM指令序列。
在一种实施方式中,所述方法还包括,在获取第一合约的WASM指令序列之后,对第一合约的WASM指令序列进行预处理,以获取第一合约的经预处理的WASM指令序列,其中,将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中包括,将所述第一合约的经预处理的WASM指令序列与所述第一合约的标识关联地缓存到内存中。
在一种实施方式中,对第一合约的WASM指令序列进行预处理包括,
基于所述第一合约的WASM指令序列确定全局变量标识范围;
对于所述第一合约的WASM指令序列中的每个指令,解析该指令是否为全局变量访问指令;
在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内;
在检查所述第一合约的各个全局变量访问指令中包括的全局变量标识都在所述全局变量标识范围内的情况中,获取所述第一合约的经全局变量越界检查的WASM指令序列。
在一种实施方式中,对第一合约的WASM指令序列进行预处理包括,
确定所述WASM指令序列中是否包括预定连续指令,所述预定连续指令被预设有相应的合并指令,并且所述预定连续指令与其对应的合并指令具有相同的解释执行结果;
在确定所述指令序列中包括至少一组预定连续指令的情况中,将所述指令序列中的各组预定连续指令分别合并为对应的合并指令,从而获取所述第一合约的经指令融合的WASM指令序列。
在一种实施方式中,所述方法还包括,在将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中之后,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
在一种实施方式中,将所述第一合约的WASM指令序列与第一合约的标识关联地缓存到内存中包括,将所述第一合约的WASM指令序列在内存中的存储地址与第一合约的合约地址的哈希值关联地存储到内存中。
本说明书另一方面提供一种智能合约执行方法,所述方法由区块链节点的虚拟机执行第一交易时执行,所述第一交易用于调用第一合约的第一函数,所述方法包括:
确定内存中是否缓存有所述第一函数的WASM指令序列;
在确定内存中缓存了所述第一函数的WASM指令序列的情况中,从内存中读取所述第一函数的WASM指令序列;
基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
在一种实施方式中,所述方法还包括,
在确定内存中没有缓存所述第一函数的WASM指令序列的情况中,
从所述节点本地存储介质中读取所述第一合约的指令序列,以获取所述第一函数的WASM指令序列;
将所述第一函数的WASM指令序列与所述第一函数的标识关联地缓存到内存中。
在一种实施方式中,将所述第一函数的WASM指令序列与所述第一函数的标识关联地缓存到内存中包括,将所述第一函数的WASM指令序列在内存中的存储地址与第一数据的哈希值关联地存储到内存中,其中,所述第一数据基于第一合约的合约地址和第一函数的名称获取。
本说明书另一方面提供一种智能合约执行装置,所述装置在区块链节点的虚拟机执行第一交易时部署,所述第一交易用于调用第一合约的第一函数,所述装置包括:
确定单元,配置为,确定内存中是否缓存有所述第一合约的WASM指令序列;
第一读取单元,配置为,在确定内存中缓存了所述第一合约的WASM指令序列的情况中,从内存中读取所述第一合约的WASM指令序列,以获取所述第一函数的WASM指令序列;
第一执行单元,配置为,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
在一种实施方式中,所述装置还包括,
第二读取单元,配置为,在确定内存中没有缓存所述第一合约的WASM指令序列的情况中,从所述节点本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列;
缓存单元,配置为,将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中。
在一种实施方式中,所述第二读取单元还配置为,从节点本地存储介质中读取第一合约的经可变长编码的指令序列,通过对第一合约的经可变长编码的指令序列进行解码,获取所述第一合约的WASM指令序列。
在一种实施方式中,所述装置还包括,预处理单元,配置为,在获取第一合约的WASM指令序列之后,对第一合约的WASM指令序列进行预处理,以获取第一合约的经预处理的WASM指令序列,其中,所述缓存单元还配置为,将所述第一合约的经预处理的WASM指令序列与所述第一合约的标识关联地缓存到内存中。
在一种实施方式中,所述预处理单元包括,
第一确定子单元,配置为,基于所述第一合约的WASM指令序列确定全局变量标识范围;
解析子单元,配置为,对于所述第一合约的WASM指令序列中的每个指令,解析该指令是否为全局变量访问指令;
检查子单元,配置为,在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内;
获取子单元,配置为,在检查所述第一合约的各个全局变量访问指令中包括的全局变量标识都在所述全局变量标识范围内的情况中,获取所述第一合约的经全局变量越界检查的WASM指令序列。
在一种实施方式中,所述预处理单元包括,
第二确定子单元,配置为,确定所述WASM指令序列中是否包括预定连续指令,所述预定连续指令被预设有相应的合并指令,并且所述预定连续指令与其对应的合并指令具有相同的解释执行结果;
合并子单元,配置为,在确定所述指令序列中包括至少一组预定连续指令的情况中,将所述指令序列中的各组预定连续指令分别合并为对应的合并指令,从而获取所述第一合约的经指令融合的WASM指令序列。
在一种实施方式中,所述装置还包括,第二执行单元,配置为,在将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中之后,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
在一种实施方式中,所述缓存单元还配置为,将所述第一合约的WASM指令序列在内存中的存储地址与第一合约的合约地址的哈希值关联地存储到内存中。
本说明书另一方面提供一种智能合约执行装置,所述装置在区块链节点的虚拟机执行第一交易时部署,所述第一交易用于调用第一合约的第一函数,所述装置包括:
确定单元,配置为,确定内存中是否缓存有所述第一函数的WASM指令序列;
第一读取单元,配置为,在确定内存中缓存了所述第一函数的WASM指令序列的情况中,从内存中读取所述第一函数的WASM指令序列;
执行单元,配置为,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
在一种实施方式中,所述装置还包括,
第二读取单元,配置为,在确定内存中没有缓存所述第一函数的WASM指令序列的情况中,从所述节点本地存储介质中读取所述第一合约的指令序列,以获取所述第一函数的WASM指令序列;
缓存单元,配置为,将所述第一函数的WASM指令序列与所述第一函数的标识关联地缓存到内存中。
在一种实施方式中,所述缓存单元还配置为,将所述第一函数的WASM指令序列在内存中的存储地址与第一数据的哈希值关联地存储到内存中,其中,所述第一数据基于第一合约的合约地址和第一函数的名称获取。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
在根据本说明书实施例的智能合约缓存和执行方案,通过虚拟机在执行交易时将获取的合约的指令序列缓存到内存中,从而后续交易可直接从内存中读取该合约的指令序列,而不需要从节点存储介质中读取该指令序列,也不需要对编码的指令序列重复解码,并且不需要对指令序列重复进行预处理,缩短了后续交易的执行时间,提升了系统性能。
附图说明
通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:
图1是在区块链网络中调用合约SCORE的过程示意图;
图2示出根据本说明书一个实施例的智能合约执行方法流程图;
图3示意示出了一种记录合约与地址键值对的表格示例;
图4示出在节点中缓存和执行合约SCORE的示意图;
图5示出根据本说明书另一实施例的智能合约缓存方法流程图;
图6示出根据本说明书另一实施例的智能合约缓存方法流程图;
图7示出根据本说明书另一实施例的一种智能合约执行方法流程图;
图8示出根据本说明书一个实施例的一种智能合约执行装置800;
图9示出根据本说明书另一实施例的一种智能合约执行装置900。
具体实施方式
下面将结合附图描述本说明书实施例。
如本领域技术人员所知,区块链网络中包含若干节点,各个节点之间可以进行通信。在例如联盟链的区块链中,用户可以通过客户端向区块链中任一节点发送交易,交易既可以是普通的转账交易,也可以用于创建智能合约或调用智能合约。假设区块链的用户Bob想要发布智能合约Contract SCORE,该智能合约例如通过如下的公式(1)基于平台中用户的消费金额x和销售金额y计算用户的奖励分值s:
S=(x+y*2)*3 (1)
Bob例如可使用C++等高级语言编写该智能合约,然后通过编译器将该C++智能合约转换成如下所示的WASM指令序列:
Contract SCORE
function calculation(param x i32) (param y i32){
get_local y
i32.const 2
i32.mul
get_local x
i32.add
i32.const 3
i32.mul
}
可以理解,为了便于阅读,上述WASM指令序列以文本的形式显示,在实际运行中,WASM指令序列以二进制的格式表示,从而上述function calculation具有如下的形式(这里为了简化表示,以十六进制数示出二进制码):
{20 y
41 02
6c
20 x
6a
41 03
6c }
然后,Bob可通过其客户端向区块链中任一节点发布用于创建该合约SCORE的交易,从而区块链网络中的各个节点均可以获取到上述智能合约的字节码,从而区块链网络的各个节点可将该智能合约部署到本地介质中。
在现有技术中,在各个节点部署了合约SCORE之后,在后期每次执行调用合约SCORE的交易时,都要从本地介质中获取合约SCORE的上述指令序列,并顺序执行上述指令序列。在交易1中的指令序列为经leb 128编码的指令序列的情况中,还需要在从介质中获取合约的指令序列之后,先进行leb 128解码,然后再顺序执行合约的指令序列。每次执行调用合约SCORE的交易时从存储介质中读取合约并解码的过程大大增加了交易执行时间。
为了减少交易执行时间,在本说明书实施例中,在执行调用合约SCORE的交易的过程中,通过WASM虚拟机从本地存储介质中获取合约SCORE的经leb 128编码的指令序列,对该编码的指令序列进行解码,并将该解码的指令序列缓存入内存中,以供后续的合约调用。从而在后续进行合约调用时,一方面,可从内存直接获取合约SCORE的指令序列,而不需要从存储介质中获取指令序列,从而减少了读取时间,另一方面,省去了对编码的指令序列进行解码的过程,从而大大减少合约执行时间。
图1是在区块链网络100中调用合约SCORE中函数calculation的过程示意图,其中区块链网络100包括节点A~D,区块链的用户可通过客户端连接节点A~D中任一节点。假定区块链的用户Alice想要调用合约SCORE中的函数calculation,Alice可以通过其客户端向区块链中的节点A发送例如交易1(Tx 1),进行合约调用。
具体而言,在交易1中,from字段可以是调用者Alice的地址,to字段即为上述SCORE合约的合约名称和合约地址,表示该交易所调用的智能合约。在Data字段,包含要调用的合约中的方法或函数名称(calculation)和传入的参数值(Alice的消费金额x=50和销售金额y=100)。
在Alice将交易1发布到区块链中去之后,各个节点都可以获取交易1,通过WASM虚拟机执行合约SCORE中的函数calculation,从而返回合约执行结果。在一种情况中,例如,节点A内存中没有缓存的合约SCORE的WASM指令序列,从而节点A从本地存储介质中获取合约SCORE的经编码的字节码序列,对该字节码序列进行解码,将经解码的指令序列缓存到内存中,并解释执行该经解码的指令序列,从而使得后续的调用该合约的交易可以直接执行该合约的经解码的指令序列。在另一种情况中,例如,例如节点D在先前已经执行了其它调用合约SCORE的交易,从而本地的内存中缓存有合约SCORE的WASM指令序列,从而,节点D在执行该调用合约SCORE的交易时,从内存中获取合约SCORE的指令序列,并解释执行其中的函数calculation的指令序列。
可以理解,图1及相应的描述仅仅是示意性的,而不是限制性的,例如,所述区块链网络不限于为联盟链网络,而也可以为公链网络,等等。
下文将详细描述上述智能合约缓存和执行方案。
图2示出根据本说明书一个实施例的智能合约执行方法流程图,所述方法由区块链任一节点的WASM虚拟机执行,包括以下步骤。
步骤S202,确定内存中是否缓存有合约SCORE的WASM指令序列。
该方法例如由图1中的节点A或节点D中的虚拟机执行。节点在接收到包括上述交易的区块之后,相对于交易1实例化虚拟机来执行交易1。虚拟机在执行交易1的过程中,需要获取到合约SCORE的WASM指令序列,以执行其中的函数calculation。
可通过多种方式确定内存中是否缓存有合约SCORE的WASM指令序列。
在一种实施方式中,在内存中记录有缓存的合约SCORE与存储合约SCORE的WASM指令序列的内存地址的关联关系,例如通过表格的形式将合约SCORE的合约地址哈希值与合约SCORE的内存存储地址关联起来,从而,通过在该表格中查询是否存储有合约SCORE的合约地址哈希值,可确定内存中是否缓存有合约SCORE的WASM指令序列。
在一种实施方式中,可通过在内存中搜索所述合约SCORE的合约地址,从而确定内存中是否缓存有合约SCORE的WASM指令序列。
步骤S204,在确定内存中缓存了所述第一合约的WASM指令序列的情况中,从内存中读取所述第一合约的WASM指令序列,以获取所述第一函数的WASM指令序列。
例如图1中的节点D在确定内存中缓存有合约SCORE的WASM指令序列的情况中,在节点D中设置的虚拟机可直接从内存读取合约SCORE的WASM指令序列。例如,如在上文中所述,当在所述表格中查询到存储有合约SCORE的合约地址哈希值之后,根据该表格,可读取与该哈希值关联存储的合约SCORE在内存中的存储地址,从而可从该存储地址读取到合约SCORE的WASM指令序列。在另一种实施方式中,当在内存中搜索到合约SCORE的合约地址之后,例如,可预先将合约地址与合约代码关联地存储在一起,从而在搜索到合约SCORE的合约地址之后,即找到了合约SCORE的WASM指令序列的存储地址,从而可读取合约SCORE的WASM指令序列。在获取到合约SCORE的WASM指令序列之后,可从该指令序列中读取函数calculation的指令序列,例如,通过搜索函数calculation的函数名称,从而可在合约SCORE的WASM指令序列中找到函数calculation的WASM指令序列。
步骤S206,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
在通过从内存中读取到函数calculation的WASM指令序列之后,基于交易1中的数据字段解释执行该合约中的函数calculation包括的指令序列,从而完成对交易1的执行。例如,如上文所述,交易1的数据字段中包含要调用的合约中的方法或函数名称(calculation)和传入的参数值(Alice的消费金额x=50和销售金额y=100),从而将x=50和y=100作为传入参数执行函数calculation的WASM指令序列,从而函数返回的值即为分数值。
步骤S208,在确定内存中没有缓存所述合约SCORE的WASM指令序列的情况中,从所述节点本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列。
例如,当上文中的节点A执行调用合约SCORE中某个函数的交易(例如交易1)时,当确定内存中没有缓存合约SCORE的WASM指令序列的情况下,可从本地存储介质中找到预先部署的合约SCORE的指令序列。在节点的存储介质(例如硬盘)中以非结构化的键值对的形式存储了合约SCORE的指令序列,例如,可通过搜索所述合约SCORE的合约地址,而找到所述合约SCORE在介质中的存储地址。或者,与内存中的存储类似地,介质中存储有合约的合约地址哈希值与合约的存储地址的关联表格,通过从该表格中搜索合约SCORE的合约地址哈希值,从而可找到合约SCORE在介质中的存储地址,从而可从介质中读取到合约SCORE的指令序列。
在一种实施方式中,在存储介质中存储的合约SCORE的指令序列为WASM指令序列,从而可从存储介质中直接读取合约SCORE的WASM指令序列。
在一种实施方式中,在存储介质中存储的合约SCORE的指令序列采用leb 128可变长编码方式进行编码,以减小文件体积,更好利用存储空间。Leb 128即"Little-EndianBase 128",是对任意有符号或者无符号整型数的可变长度的编码,因此,用Leb128编码的整数,会根据数字的大小改变所占字节数。根据leb 128的编码方式,每个字节的8位(8个bits)中,较低的7位为有效数据部分,最高位用于指示当前字节是否为最后一个字节,1表示最后一个字节,0表示不是最后一个字节,也就是需要接续后续字节。如此,可以采用不同字节数编码不同大小的整数。
相应地,对于leb编码的指令序列,在解码该数据时,先将各个字节还原为8位,通过最高位判断是否要接续后面的字节,共同形成目标数据。因此,对该指令序列进行解析和解码,会得到不定长的指令。为了对这些指令进行存储,可以将可变长指令转换为内存对齐的定长指令。从而可获取合约SCORE的WASM指令序列。
步骤S210,将所述第一合约的WASM指令序列与第一合约的标识关联地缓存到内存中。
在一种实施方式中,节点A可在其内存中分配用于存储所述WASM指令序列的起始地址,从而在节点A中设置的虚拟机1将该指令序列从该起始地址开始存入内存中,并在内存中的预定表格中记录合约SCORE与该起始地址相对应。该表例如记录键值对,键例如为合约SCORE的合约地址哈希值,值为所述起始地址。可以理解,这里虽然描述了在预定表格中记录合约SCORE的合约地址哈希值用于标识合约SCORE,本说明书实施例不限于此,在预定表格中只要记录可唯一标识合约SCORE的标识即可,例如,在预定表格中也可以记录合约SCORE的合约地址用于标识合约SCORE。
图3示意示出了一种记录合约标识与地址键值对的表格示例。如图3中所示,该表格中上部一行为各个合约的合约地址哈希值,下部一行记录相应合约在内存中的存储起始地址。例如合约SCORE的合约地址哈希值为“21c…”,其对应的内存存储地址为300。
从而通过进行该缓存,节点A后续在执行其它调用该合约SCORE的交易时,可从其内存中的所述预定表格中找到合约SCORE的合约地址哈希值“21c…”,从而获取合约SCORE在内存中的存储地址300,通过在内存中访问该地址300,可直接读取到合约SCORE的WASM指令序列,从而加速了合约执行时间。
在一种实施方式中,节点A可在其内存中分配用于存储所述WASM指令序列的起始地址,从而虚拟机1将该指令序列与合约SCORE的合约地址一起从所述起始地址开始存入内存中。从而在后续调用该合约SCORE 时,可通过搜索合约SCORE的合约地址而找到合约SCORE。
在节点A在进行上述缓存之后,可执行上述步骤S206,即,节点A中的虚拟机1可基于交易1中的数据字段解释执行合约SCORE中的函数calculation包括的指令序列,从而完成对交易1的执行。
图4示出在节点A中缓存和执行合约SCORE的示意图。在节点A中,包括内存41、CPU42和存储介质43。当执行内存41中的交易队列中的调用合约SCORE中函数的交易1时,通过CPU42实例化虚拟机1来执行交易1。虚拟机1首先确定内存41中是否缓存有合约SCORE的WASM指令序列,当确定内存41中未缓存所述指令序列的情况中,虚拟机1从介质43中获取合约SCORE的经leb 128编码的指令序列,对该编码指令序列进行leb 128解码(未示出),并将解码后的指令序列缓存到内存41中,然后基于交易1的数据字段中的函数参数解释执行合约SCORE中的相应函数。在执行了交易1之后,当执行交易队列中的调用合约SCORE中某函数的交易2时,通过CPU42实例化虚拟机2来执行交易2。类似地,虚拟机2首先确定内存41中是否缓存有合约SCORE的WASM指令序列,当确定内存中缓存有所述指令序列的情况中,读取该WASM指令序列,并基于交易2的数据字段中的函数参数执行相应函数的WASM指令序列。从而在执行交易1时进行对合约SCORE的WASM指令序列的缓存之后,后续在执行其它调用合约SCORE中函数的交易时不再需要从介质43中读取合约SCORE,也不需要重复进行leb 128解码,从而缩短了后续交易的执行时间,提升了系统性能。
图5示出根据本说明书另一实施例的智能合约缓存方法流程图,所述方法由区块链中任一节点的虚拟机执行用于调用合约SCORE中函数的交易时执行,所述方法包括:
步骤S502,确定内存中是否缓存有合约SCORE的WASM指令序列;
步骤S504,在确定内存中没有缓存合约SCORE的WASM指令序列的情况中,从所述节点本地存储介质中读取合约SCORE的指令序列,以获取合约SCORE的WASM指令序列。
步骤S502和S504可参考上文对步骤S202和S204的描述,在此不再详述。
步骤S506,确定所述WASM指令序列中是否包括预定连续指令,所述预定连续指令被预设有相应的合并指令,并且所述预定连续指令与其对应的合并指令具有相同的解释执行结果。
所述预定连续指令是预先确定的可以进行合并的若干个连续指令,对于这样的预定连续指令,已经预先设置了对应的合并指令,以及与该合并指令相对应的机器码,该机器码在执行之后与其对应的连续指令具有相同的执行结果。
例如,对于上述函数calculation的指令序列,可以相对于连续指令“get_localy/i32.const 2/i32.mul”预设一个合并指令“i32. mul y, const 2”,同样地,该合并指令实际中为二进制码,可选定一个在WASM指令集中未使用的二进制码来表示该合并指令。同时,在虚拟机的解释器中,预先设定了与该合并指令相对应的机器码(machine code),该机器码对应的操作为,获取参数y的值,将参数y的值与2相乘,并将乘积推入栈中,其中,可从调用合约SCORE的交易中的数据中获取参数y的值。可见,该合并指令对应的机器码的操作结果与所述三个连续指令对应的机器码执行结果是相同的,都是将参数y的值与2的乘积推入栈中。
另外,可相对于连续指令“get_local x/i32.add”预设一个合并指令“i32.addx”,同时,在虚拟机的解释器中,预先设定了与该合并指令相对应的机器码,该机器码对应的操作为,从栈中弹出最新的值,获取参数x的值,将弹出的值与参数x的值相加,并将相加的结果推入栈中,其中,可从调用合约SCORE的交易的数据中获取x的值。可见,该合并指令对应的机器码的操作结果与所述两个连续指令对应的机器码执行结果是相同的,都是将上述乘积与参数x的值的相加结果推入栈中。
另外,可相对于连续指令“i32.const 3/i32.mul”预设一个合并指令“i32.mulconst 3”,同时,在虚拟机的解释器中,预先设定了与该合并指令相对应的机器码,该机器码对应的操作为,从栈中弹出最新的值,并该弹出的值与3相乘,并将乘积推入栈中。可见,该合并指令对应的机器码的操作结果与所述两个连续指令对应的机器码执行结果是相同的,都是将上述相加的结果与3的乘积推入栈中,该最后推入栈中的值即为该函数的返回值。
从上面的示例中可以看出,在预定连续指令中,各个指令具有一定的相关性。例如,对于连续指令“get_local y/i32.const 2/i32.mul”,最后一个指令i32.mul会用到前面两个指令的获取值(y)或立即数(即常数2)。
步骤S508,在确定所述指令序列中包括至少一组预定连续指令的情况中,将所述指令序列中的各组预定连续指令分别合并为对应的合并指令,从而获取所述合约SCORE的经指令融合的WASM指令序列。
例如,在上述步骤S506中,已经确定所述指令序列中包括三组预定连续指令,从而,可将这三组指令分别合并为对应的合并指令,即,经合并之后的WASM指令序列为:
{ i32. mul y const 2
i32.add x
i32.mul const 3
}。
步骤S510,将所述合约SCORE的经指令融合的WASM指令序列与合约SCORE的标识关联地缓存到内存中。
该步骤可参考上文对步骤S206的描述,在此不再赘述。
在执行交易1时进行对合约SCORE的经指令融合的指令序列的缓存之后,后续在执行调用合约SCORE中函数的交易时不再需要从存储介质中读取合约SCORE,也不需要重复进行leb 128解码,也不需要重复进行指令融合,从而缩短了后续交易的执行时间,提升了系统性能,而通过执行指令融合的WASM指令序列,可进一步减少交易的执行时间。
图6示出根据本说明书另一实施例的智能合约缓存方法流程图,所述方法由区块链中任一节点的虚拟机执行用于调用合约SCORE2中函数的交易时执行,所述方法包括:
步骤S602,确定内存中是否缓存有所述合约SCORE2的WASM指令序列.
步骤S604,在确定内存中没有缓存所述合约SCORE2的WASM指令序列的情况中,从所述节点本地存储介质中读取合约SCORE2的指令序列,以获取合约SCORE2的WASM指令序列。
步骤S602和S604可参考上文对步骤S202和S204的描述,在此不再详述。
假设获取的合约SCORE2的WASM指令序列为
(Contract SCORE2
(type (;0;) (func (result i32)))
(func (;0;) (type 0) (result i32)
get_global 0)
(global (;0;) i32 (i32.const -2))
(global (;1;) f32 (f32.const -0x1.8p+1 (;=-3;)))
(global (;2;) f64 (f64.const -0x1p+2 (;=-4;)))
(global (;3;) i64 (i64.const -5))
(global (;4;) (mut i32) (i32.const -12))
(global (;5;) (mut f32) (f32.const -0x1.ap+3 (;=-13;)))
(global (;6;) (mut f64) (f64.const -0x1.cp+3 (;=-14;)))
(global (;7;) (mut i64) (i64.const -15))
(export "get-a" (func 0)))。
步骤S606,基于所述合约SCORE2的WASM指令序列确定全局变量标识范围。
参考上述合约SCORE2的WASM指令序列,虚拟机在获取与该指令序列之后,通过逐条读取每条指令,可获知该指令序列中共包括多少全局变量,即全局变量0~7,共8个全局变量,从而为这些全局变量分配的变量下标分别为0~7,即全局变量标识范围为0~7。
步骤S608,对于所述合约SCORE2的WASM指令序列中的每个指令,解析该指令是否为全局变量访问指令。
例如,当解析到合约SCORE2的第4行的“get_global 0”,可解析出该指令为全局变量读指令。全局变量访问指令不限于为全局变量读指令,还包括全局变量写指令,例如,“set_global 1”。
步骤S610,在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内。
例如,对于合约SCORE2中的全局变量读指令get_global 0,即检查其中的变量下标“0”是否在上述全局变量标识范围0~7之内,显然,0在范围0~7之内。
假设合约SCORE2中除了上述全局变量读指令,还包括全局变量写指令“set_global 10”,很显然,该指令中的变量下标“10”超出了上述虚拟机获取的全局变量标识范围0~7,从而,该全局变量写指令的变量下标是越界的,即,合约SCORE2中包括错误指令。在该情况中,将退出对该交易的执行。
步骤S612,在检查所述合约SCORE2中不包括全局变量访问指令的情况中、或者在检查所述合约SCORE2的各个全局变量访问指令中包括的全局变量标识都在所述全局变量标识范围内的情况中,将所述合约SCORE2的经越界检查的WASM指令序列与合约SCORE2的标识关联地缓存到内存中。
在执行该交易时进行对合约SCORE2的经越界检查的指令序列的缓存之后,后续在执行其它调用合约SCORE2中函数的交易时不再需要从存储介质中读取合约SCORE2,也不需要重复进行leb 128解码,也不需要重复进行越界检查,从而缩短了后续交易的执行时间,提升了系统性能,而通过在虚拟机中在静态解析阶段对WASM指令序列进行越界检查,从而在解释执行该WASM指令序列时,可大大减少程序执行时间,加快程序执行速度。
图5和图6所示方法仅仅是在缓存合约之前对合约的WASM指令序列进行预处理的两个示例,实际中,在缓存之前可根据具体的场景对合约的WASM指令序列进行多种需要的预处理,在此不一一列出。
图7示出根据本说明书另一实施例的一种智能合约执行方法流程图,所述方法由区块链节点的虚拟机执行第一交易时执行,所述第一交易用于调用第一合约的第一函数,所述方法包括:
步骤S702,确定内存中是否缓存有所述第一函数的WASM指令序列。
在一种实施方式中,在内存中记录有缓存的合约SCORE的函数calculation与存储函数calculation的WASM指令序列的内存存储地址的关联关系,例如通过表格的形式将包括合约SCORE的合约地址和函数calculation的函数名称的数据的哈希值与函数calculation的内存存储地址关联起来,从而,通过在该表格中查询是否存储有与函数calculation对应的哈希值,可确定内存中是否缓存有函数calculation的WASM指令序列。
在一种实施方式中,可通过在内存中搜索所述合约SCORE的合约地址,从而确定内存中是否缓存有合约SCORE的WASM指令序列,从而可确定是否缓存有函数calculation的WASM指令序列。
步骤S704,在确定内存中缓存了所述第一函数的WASM指令序列的情况中,从内存中读取所述第一函数的WASM指令序列。
在一种实施方式中,如在上文中所述,当在所述表格中查询到与函数calculation对应的哈希值之后,根据该表格,可读取与该哈希值关联存储的函数calculation在内存中的存储地址,从而可从该存储地址读取到函数calculation的WASM指令序列。
在另一种实施方式中,当在内存中搜索到合约SCORE的合约地址之后,例如,可预先将合约地址与合约代码关联地存储在一起,从而在搜索到合约SCORE的合约地址之后,即找到了合约SCORE的WASM指令序列的存储地址,通过从该存储地址开始搜索函数calculation的名称,从而可读取函数calculation的WASM指令序列。
步骤S706,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
该步骤可参考上文中对步骤S206的描述,在此不再详述。
步骤S708,在确定内存中没有缓存所述第一函数的WASM指令序列的情况中,从所述节点本地存储介质中读取所述第一合约的指令序列,以获取所述第一函数的WASM指令序列。
从所述节点本地存储介质中读取所述第一合约的指令序列可参考上文中对步骤S208的描述,在此不再详述。在获取到第一合约的指令序列之后,可获取到该合约中的各个函数的WASM指令序列。例如,第一合约中不仅包括上述函数calculation的WASM指令序列,可能还包括函数calculation2的WASM指令序列。例如,函数calculation是用于计算平台中用户的分数,函数calculation2用于计算平台中商户的分数,它们可能具有不同的计算公式,从而具有不同的WASM指令序列。在执行交易的过程中,部分交易调用函数calculation,用于计算用户的分数,部分交易调用函数calculation2,用于计算商户的分数。因此,在获取合约SCORE的WASM指令序列之后,可获取其中包括的各个函数的WASM指令序列,以分别将这些函数缓存到内存中,以供交易进行调用。
步骤S710,将所述第一函数的WASM指令序列与所述第一函数的标识关联地缓存到内存中。
在一种实施方式中,将所述第一函数的WASM指令序列在内存中的存储地址与第一数据的哈希值关联地存储到内存中,其中,所述第一数据基于第一合约的合约地址和第一函数的名称获取。例如,所述第一数据通过将第一合约的合约地址和第一函数的名称拼接到一起获取,或者基于预定公式对第一合约的合约地址和第一函数的名称进行计算而获取,等等。具体地,可通过与图3所示表格类似的表格来存储上述关联关系,该表格例如记录键值对,键例如为第一数据的哈希值,值为所述起始地址。
在一种实施方式中,节点可将合约SCORE的WASM指令序列与合约SCORE的合约地址一起从所述起始地址开始存入内存中。从而在后续调用函数calculation时,可通过搜索合约SCORE的合约地址和函数calculation的函数名称而找到函数calculation的WASM指令序列。
在合约SCORE包括多个函数的情况中,例如还包括函数calculation2,对于函数calculation2,也进行与函数calculation相同的处理,从而使得后续调用函数calculation2的交易可直接从内存中读取到函数calculation2的WASM指令序列。
图8示出根据本说明书一个实施例的一种智能合约执行装置800,所述装置在区块链节点的虚拟机执行第一交易时部署,所述第一交易用于调用第一合约的第一函数,所述装置包括:
确定单元81,配置为,确定内存中是否缓存有所述第一合约的WASM指令序列;
第一读取单元82,配置为,在确定内存中缓存了所述第一合约的WASM指令序列的情况中,从内存中读取所述第一合约的WASM指令序列,以获取所述第一函数的WASM指令序列;
第一执行单元83,配置为,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
在一种实施方式中,所述装置还包括,
第二读取单元84,配置为,在确定内存中没有缓存所述第一合约的WASM指令序列的情况中,从所述节点本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列;
缓存单元85,配置为,将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中。
在一种实施方式中,所述第二读取单元84还配置为,从节点本地存储介质中读取第一合约的经可变长编码的指令序列,通过对第一合约的经可变长编码的指令序列进行解码,获取所述第一合约的WASM指令序列。
在一种实施方式中,所述装置800还包括,预处理单元86,配置为,在获取第一合约的WASM指令序列之后,对第一合约的WASM指令序列进行预处理,以获取第一合约的经预处理的WASM指令序列,其中,所述缓存单元85还配置为,将所述第一合约的经预处理的WASM指令序列与所述第一合约的标识关联地缓存到内存中。
在一种实施方式中,所述预处理单元86包括,
第一确定子单元861,配置为,基于所述第一合约的WASM指令序列确定全局变量标识范围;
解析子单元862,配置为,对于所述第一合约的WASM指令序列中的每个指令,解析该指令是否为全局变量访问指令;
检查子单元863,配置为,在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内;
获取子单元864,配置为,在检查所述第一合约的各个全局变量访问指令中包括的全局变量标识都在所述全局变量标识范围内的情况中,获取所述第一合约的经全局变量越界检查的WASM指令序列。
在一种实施方式中,所述预处理单元包括,
第二确定子单元865,配置为,确定所述WASM指令序列中是否包括预定连续指令,所述预定连续指令被预设有相应的合并指令,并且所述预定连续指令与其对应的合并指令具有相同的解释执行结果;
合并子单元866,配置为,在确定所述指令序列中包括至少一组预定连续指令的情况中,将所述指令序列中的各组预定连续指令分别合并为对应的合并指令,从而获取所述第一合约的经指令融合的WASM指令序列。
在一种实施方式中,所述装置800还包括,第二执行单元87,配置为,在将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中之后,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
在一种实施方式中,所述缓存单元85还配置为,将所述第一合约的WASM指令序列在内存中的存储地址与第一合约的合约地址的哈希值关联地存储到内存中。
图9示出根据本说明书另一实施例的一种智能合约执行装置900,所述装置在区块链节点的虚拟机执行第一交易时部署,所述第一交易用于调用第一合约的第一函数,所述装置包括:
确定单元91,配置为,确定内存中是否缓存有所述第一函数的WASM指令序列;
第一读取单元92,配置为,在确定内存中缓存了所述第一函数的WASM指令序列的情况中,从内存中读取所述第一函数的WASM指令序列;
执行单元93,配置为,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
在一种实施方式中,所述装置还包括,
第二读取单元94,配置为,在确定内存中没有缓存所述第一函数的WASM指令序列的情况中,从所述节点本地存储介质中读取所述第一合约的指令序列,以获取所述第一函数的WASM指令序列;
缓存单元95,配置为,将所述第一函数的WASM指令序列与所述第一函数的标识关联地缓存到内存中。
在一种实施方式中,所述缓存单元95还配置为,将所述第一函数的WASM指令序列在内存中的存储地址与第一数据的哈希值关联地存储到内存中,其中,所述第一数据基于第一合约的合约地址和第一函数的名称获取。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
在根据本说明书实施例的智能合约缓存和执行方案,通过虚拟机在执行交易时将获取的合约的指令序列缓存到内存中,从而后续交易可直接从内存中读取该合约的指令序列,而不需要从存储介质中读取该指令序列,也不需要对编码的指令序列重复解码,另外,也不需要对在执行调用合约的交易时对合约的指令序列重复进行预处理,缩短了后续交易的执行时间,提升了系统性能。
需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。其中,软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (24)
1.一种智能合约执行方法,所述方法由区块链节点的虚拟机执行第一交易时执行,所述第一交易用于调用第一合约的第一函数,所述方法包括:
确定内存中是否缓存有所述第一合约的WASM指令序列;
在确定内存中缓存了所述第一合约的WASM指令序列的情况中,从内存中读取所述第一合约的WASM指令序列,以获取所述第一函数的WASM指令序列;
基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
2.根据权利要求1所述的方法,还包括,
在确定内存中没有缓存所述第一合约的WASM指令序列的情况中,从所述节点本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列;
将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中。
3.根据权利要求2所述的方法,其中,从所述节点本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列包括,从节点本地存储介质中读取第一合约的经可变长编码的指令序列,通过对第一合约的经可变长编码的指令序列进行解码,获取所述第一合约的WASM指令序列。
4.根据权利要求2所述的方法,还包括,在获取第一合约的WASM指令序列之后,对第一合约的WASM指令序列进行预处理,以获取第一合约的经预处理的WASM指令序列,其中,将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中包括,将所述第一合约的经预处理的WASM指令序列与所述第一合约的标识关联地缓存到内存中。
5.根据权利要求4所述的方法,其中,对第一合约的WASM指令序列进行预处理包括,
基于所述第一合约的WASM指令序列确定全局变量标识范围;
对于所述第一合约的WASM指令序列中的每个指令,解析该指令是否为全局变量访问指令;
在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内;
在检查所述第一合约的各个全局变量访问指令中包括的全局变量标识都在所述全局变量标识范围内的情况中,获取所述第一合约的经全局变量越界检查的WASM指令序列。
6.根据权利要求4所述的方法,其中,对第一合约的WASM指令序列进行预处理包括,
确定所述WASM指令序列中是否包括预定连续指令,所述预定连续指令被预设有相应的合并指令,并且所述预定连续指令与其对应的合并指令具有相同的解释执行结果;
在确定所述指令序列中包括至少一组预定连续指令的情况中,将所述指令序列中的各组预定连续指令分别合并为对应的合并指令,从而获取所述第一合约的经指令融合的WASM指令序列。
7.根据权利要求2所述的方法,还包括,在将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中之后,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
8.根据权利要求2所述的方法,其中,将所述第一合约的WASM指令序列与第一合约的标识关联地缓存到内存中包括,将所述第一合约的WASM指令序列在内存中的存储地址与第一合约的合约地址的哈希值关联地存储到内存中。
9.一种智能合约执行方法,所述方法由区块链节点的虚拟机执行第一交易时执行,所述第一交易用于调用第一合约的第一函数,所述方法包括:
确定内存中是否缓存有所述第一函数的WASM指令序列;
在确定内存中缓存了所述第一函数的WASM指令序列的情况中,从内存中读取所述第一函数的WASM指令序列;
基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
10.根据权利要求9所述的方法,还包括,
在确定内存中没有缓存所述第一函数的WASM指令序列的情况中,
从所述节点本地存储介质中读取所述第一合约的指令序列,以获取所述第一函数的WASM指令序列;
将所述第一函数的WASM指令序列与所述第一函数的标识关联地缓存到内存中。
11.根据权利要求10所述的方法,其中,将所述第一函数的WASM指令序列与所述第一函数的标识关联地缓存到内存中包括,将所述第一函数的WASM指令序列在内存中的存储地址与第一数据的哈希值关联地存储到内存中,其中,所述第一数据基于第一合约的合约地址和第一函数的名称获取。
12.一种智能合约执行装置,所述装置在区块链节点的虚拟机执行第一交易时部署,所述第一交易用于调用第一合约的第一函数,所述装置包括:
确定单元,配置为,确定内存中是否缓存有所述第一合约的WASM指令序列;
第一读取单元,配置为,在确定内存中缓存了所述第一合约的WASM指令序列的情况中,从内存中读取所述第一合约的WASM指令序列,以获取所述第一函数的WASM指令序列;
第一执行单元,配置为,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
13.根据权利要求12所述的装置,还包括,
第二读取单元,配置为,在确定内存中没有缓存所述第一合约的WASM指令序列的情况中,从所述节点本地存储介质中读取第一合约的指令序列,以获取所述第一合约的WASM指令序列;
缓存单元,配置为,将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中。
14.根据权利要求13所述的装置,其中,所述第二读取单元还配置为,从节点本地存储介质中读取第一合约的经可变长编码的指令序列,通过对第一合约的经可变长编码的指令序列进行解码,获取所述第一合约的WASM指令序列。
15.根据权利要求13所述的装置,还包括,预处理单元,配置为,在获取第一合约的WASM指令序列之后,对第一合约的WASM指令序列进行预处理,以获取第一合约的经预处理的WASM指令序列,其中,所述缓存单元还配置为,将所述第一合约的经预处理的WASM指令序列与所述第一合约的标识关联地缓存到内存中。
16.根据权利要求15所述的装置,其中,所述预处理单元包括,
第一确定子单元,配置为,基于所述第一合约的WASM指令序列确定全局变量标识范围;
解析子单元,配置为,对于所述第一合约的WASM指令序列中的每个指令,解析该指令是否为全局变量访问指令;
检查子单元,配置为,在解析出所述指令为全局变量访问指令的情况中,检查该指令包括的全局变量标识是否在所述全局变量标识范围内;
获取子单元,配置为,在检查所述第一合约的各个全局变量访问指令中包括的全局变量标识都在所述全局变量标识范围内的情况中,获取所述第一合约的经全局变量越界检查的WASM指令序列。
17.根据权利要求15所述的装置,其中,所述预处理单元包括,
第二确定子单元,配置为,确定所述WASM指令序列中是否包括预定连续指令,所述预定连续指令被预设有相应的合并指令,并且所述预定连续指令与其对应的合并指令具有相同的解释执行结果;
合并子单元,配置为,在确定所述指令序列中包括至少一组预定连续指令的情况中,将所述指令序列中的各组预定连续指令分别合并为对应的合并指令,从而获取所述第一合约的经指令融合的WASM指令序列。
18.根据权利要求13所述的装置,还包括,第二执行单元,配置为,在将所述第一合约的WASM指令序列与所述第一合约的标识关联地缓存到内存中之后,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
19.根据权利要求13所述的装置,其中,所述缓存单元还配置为,将所述第一合约的WASM指令序列在内存中的存储地址与第一合约的合约地址的哈希值关联地存储到内存中。
20.一种智能合约执行装置,所述装置在区块链节点的虚拟机执行第一交易时部署,所述第一交易用于调用第一合约的第一函数,所述装置包括:
确定单元,配置为,确定内存中是否缓存有所述第一函数的WASM指令序列;
第一读取单元,配置为,在确定内存中缓存了所述第一函数的WASM指令序列的情况中,从内存中读取所述第一函数的WASM指令序列;
执行单元,配置为,基于所述第一交易中的数据字段解释执行所述第一函数的WASM指令序列。
21.根据权利要求20所述的装置,还包括,
第二读取单元,配置为,在确定内存中没有缓存所述第一函数的WASM指令序列的情况中,从所述节点本地存储介质中读取所述第一合约的指令序列,以获取所述第一函数的WASM指令序列;
缓存单元,配置为,将所述第一函数的WASM指令序列与所述第一函数的标识关联地缓存到内存中。
22.根据权利要求21所述的装置,其中,所述缓存单元还配置为,将所述第一函数的WASM指令序列在内存中的存储地址与第一数据的哈希值关联地存储到内存中,其中,所述第一数据基于第一合约的合约地址和第一函数的名称获取。
23.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行权利要求1-11中任一项的所述的方法。
24.一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现权利要求1-11中任一项所述的方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010172887.8A CN111045792A (zh) | 2020-03-13 | 2020-03-13 | 缓存和执行智能合约的方法和装置 |
PCT/CN2021/073557 WO2021179809A1 (zh) | 2020-03-13 | 2021-01-25 | 缓存和执行智能合约的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010172887.8A CN111045792A (zh) | 2020-03-13 | 2020-03-13 | 缓存和执行智能合约的方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111045792A true CN111045792A (zh) | 2020-04-21 |
Family
ID=70231109
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010172887.8A Pending CN111045792A (zh) | 2020-03-13 | 2020-03-13 | 缓存和执行智能合约的方法和装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN111045792A (zh) |
WO (1) | WO2021179809A1 (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111381938A (zh) * | 2020-05-29 | 2020-07-07 | 支付宝(杭州)信息技术有限公司 | 一种基于基础指令集执行区块链中智能合约的方法及系统 |
CN111770204A (zh) * | 2020-08-31 | 2020-10-13 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点和存储介质 |
CN111815330A (zh) * | 2020-08-31 | 2020-10-23 | 支付宝(杭州)信息技术有限公司 | 一种部署智能合约的方法、区块链节点和存储介质 |
CN112950378A (zh) * | 2020-10-28 | 2021-06-11 | 支付宝(杭州)信息技术有限公司 | 在区块链中执行智能合约的方法和装置 |
WO2021179809A1 (zh) * | 2020-03-13 | 2021-09-16 | 支付宝(杭州)信息技术有限公司 | 缓存和执行智能合约的方法和装置 |
US11327732B2 (en) | 2020-08-31 | 2022-05-10 | Alipay (Hangzhou) Information Technology Co., Ltd. | Method for executing smart contract, blockchain node, and storage medium |
US11379830B2 (en) | 2020-08-31 | 2022-07-05 | Alipay (Hangzhou) Information Technology Co., Ltd. | Method for executing smart contract, blockchain node, and storage medium |
WO2022141703A1 (zh) * | 2020-12-29 | 2022-07-07 | 杭州趣链科技有限公司 | 基于区块链平台的智能合约部署和调用方法及相关设备 |
US11385917B2 (en) | 2020-08-31 | 2022-07-12 | Alipay (Hangzhou) Information Technology Co., Ltd. | Method for executing smart contract and blockchain node |
WO2022152114A1 (zh) * | 2021-01-18 | 2022-07-21 | 腾讯科技(深圳)有限公司 | 基于节点内存的数据处理方法、装置、设备以及介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103365626A (zh) * | 2012-03-28 | 2013-10-23 | 国际商业机器公司 | 用于在循环缓冲器中缓存优化后的内部指令的方法和系统 |
CN109949156A (zh) * | 2019-02-28 | 2019-06-28 | 矩阵元技术(深圳)有限公司 | 一种区块链合约的数据处理方法及服务器 |
CN110647542A (zh) * | 2018-06-11 | 2020-01-03 | 北京神州泰岳软件股份有限公司 | 一种数据获取方法和装置 |
CN110675256A (zh) * | 2019-08-30 | 2020-01-10 | 阿里巴巴集团控股有限公司 | 部署和执行智能合约的方法及装置 |
CN110704063A (zh) * | 2019-09-30 | 2020-01-17 | 支付宝(杭州)信息技术有限公司 | 编译和执行智能合约的方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111045792A (zh) * | 2020-03-13 | 2020-04-21 | 支付宝(杭州)信息技术有限公司 | 缓存和执行智能合约的方法和装置 |
-
2020
- 2020-03-13 CN CN202010172887.8A patent/CN111045792A/zh active Pending
-
2021
- 2021-01-25 WO PCT/CN2021/073557 patent/WO2021179809A1/zh active Application Filing
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103365626A (zh) * | 2012-03-28 | 2013-10-23 | 国际商业机器公司 | 用于在循环缓冲器中缓存优化后的内部指令的方法和系统 |
CN110647542A (zh) * | 2018-06-11 | 2020-01-03 | 北京神州泰岳软件股份有限公司 | 一种数据获取方法和装置 |
CN109949156A (zh) * | 2019-02-28 | 2019-06-28 | 矩阵元技术(深圳)有限公司 | 一种区块链合约的数据处理方法及服务器 |
CN110675256A (zh) * | 2019-08-30 | 2020-01-10 | 阿里巴巴集团控股有限公司 | 部署和执行智能合约的方法及装置 |
CN110704063A (zh) * | 2019-09-30 | 2020-01-17 | 支付宝(杭州)信息技术有限公司 | 编译和执行智能合约的方法及装置 |
Non-Patent Citations (1)
Title |
---|
张应辉等: "《软件工程技术》", 31 August 2006 * |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2021179809A1 (zh) * | 2020-03-13 | 2021-09-16 | 支付宝(杭州)信息技术有限公司 | 缓存和执行智能合约的方法和装置 |
CN111381938A (zh) * | 2020-05-29 | 2020-07-07 | 支付宝(杭州)信息技术有限公司 | 一种基于基础指令集执行区块链中智能合约的方法及系统 |
CN111770204A (zh) * | 2020-08-31 | 2020-10-13 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点和存储介质 |
CN111815330A (zh) * | 2020-08-31 | 2020-10-23 | 支付宝(杭州)信息技术有限公司 | 一种部署智能合约的方法、区块链节点和存储介质 |
US11301222B2 (en) | 2020-08-31 | 2022-04-12 | Alipay (Hangzhou) Information Technology Co., Ltd. | Method for executing smart contract, blockchain node, and storage medium |
US11327732B2 (en) | 2020-08-31 | 2022-05-10 | Alipay (Hangzhou) Information Technology Co., Ltd. | Method for executing smart contract, blockchain node, and storage medium |
US11379830B2 (en) | 2020-08-31 | 2022-07-05 | Alipay (Hangzhou) Information Technology Co., Ltd. | Method for executing smart contract, blockchain node, and storage medium |
US11385917B2 (en) | 2020-08-31 | 2022-07-12 | Alipay (Hangzhou) Information Technology Co., Ltd. | Method for executing smart contract and blockchain node |
CN112950378A (zh) * | 2020-10-28 | 2021-06-11 | 支付宝(杭州)信息技术有限公司 | 在区块链中执行智能合约的方法和装置 |
CN112950378B (zh) * | 2020-10-28 | 2022-06-07 | 支付宝(杭州)信息技术有限公司 | 在区块链中执行智能合约的方法和装置 |
WO2022141703A1 (zh) * | 2020-12-29 | 2022-07-07 | 杭州趣链科技有限公司 | 基于区块链平台的智能合约部署和调用方法及相关设备 |
WO2022152114A1 (zh) * | 2021-01-18 | 2022-07-21 | 腾讯科技(深圳)有限公司 | 基于节点内存的数据处理方法、装置、设备以及介质 |
Also Published As
Publication number | Publication date |
---|---|
WO2021179809A1 (zh) | 2021-09-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111045792A (zh) | 缓存和执行智能合约的方法和装置 | |
CN110675256B (zh) | 部署和执行智能合约的方法及装置 | |
US10783082B2 (en) | Deploying a smart contract | |
US7703088B2 (en) | Compressing “warm” code in a dynamic binary translation environment | |
CN110704063B (zh) | 编译和执行智能合约的方法及装置 | |
CN110688122B (zh) | 编译和执行智能合约的方法及装置 | |
CN110704064B (zh) | 编译和执行智能合约的方法及装置 | |
CN111249736B (zh) | 代码处理方法及装置 | |
WO2019092565A1 (en) | Using comments of a program to provide optimizations | |
WO2021175053A1 (zh) | 一种在虚拟机中执行功能模块的方法和装置 | |
CN105446704A (zh) | 一种着色器的解析方法和装置 | |
CN114625844B (zh) | 一种代码搜索方法、装置及设备 | |
CN115509534A (zh) | 适配ai模型的编译方法、装置、存储介质及电子设备 | |
US9405652B2 (en) | Regular expression support in instrumentation languages using kernel-mode executable code | |
WO2021179697A1 (zh) | 一种在虚拟机中执行功能模块的方法和装置 | |
CN113076089B (zh) | 一种基于对象类型的api补全方法 | |
CN114610364A (zh) | 应用程序更新、应用程序开发方法、装置及计算机设备 | |
CN115878254A (zh) | 内存分配方法、装置、计算机设备、存储介质及程序产品 | |
JP7175148B2 (ja) | 判定装置及び判定方法 | |
CN115114627B (zh) | 一种恶意软件检测方法及装置 | |
CN112783500B (zh) | 编译优化信息生成方法、装置及电子设备 | |
CN113703740A (zh) | 一种基于业务规则配置执行业务请求命令的方法和系统 | |
CN116149898B (zh) | 内核异常类型的确定方法、电子设备及存储介质 | |
CN114253526A (zh) | 在线计价方法、装置、设备及存储介质 | |
CN112883379A (zh) | 基于IAST的Node.js数据流跟踪方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20200421 |
|
RJ01 | Rejection of invention patent application after publication |