CN111399990A - 解释执行智能合约指令的方法及装置 - Google Patents
解释执行智能合约指令的方法及装置 Download PDFInfo
- Publication number
- CN111399990A CN111399990A CN202010475572.0A CN202010475572A CN111399990A CN 111399990 A CN111399990 A CN 111399990A CN 202010475572 A CN202010475572 A CN 202010475572A CN 111399990 A CN111399990 A CN 111399990A
- Authority
- CN
- China
- Prior art keywords
- instruction
- memory
- contract
- memory area
- simulation function
- 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.)
- Granted
Links
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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本说明书实施例提供一种解释执行智能合约指令的方法和装置,方法通过虚拟机执行,包括:首先确定有待执行的第一合约中第一指令的第一内存地址,所述第一内存地址位于第一内存区域,所述第一内存区域与第二内存区域存在映射关系,所述第二内存区域用于存储第一合约的经过扩容的字节码。如果该第一内存地址中存储的是用于执行第一指令的第一模拟函数信息,则根据该第一模拟函数信息执行第一指令;如果第一内存地址中存储的是预定初始值,则根据映射关系,从第二内存区域中读取第一指令对应的第一字节码片段,根据第一字节码片段确定第一模拟函数信息,将其填充在第一内存地址对应的存储空间中。
Description
技术领域
本说明书一个或多个实施例涉及计算机领域,尤其涉及解释执行智能合约指令的方法和装置。
背景技术
虚拟机(Virtual Machine)是通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。由于虚拟机可以隔离底层硬件平台以及操作系统对上层应用的影响,因此非常有利于上层应用的开发。上层应用开发过程中无需关注底层平台的细节,只需要关注具体的业务逻辑。开发完成后,由虚拟机运行上层应用,负责将应用的代码转换为适于底层平台执行的代码。具体地,在许多场景中,上层应用由开发人员使用高级语言编写开发,之后通过编译器编译为字节码(bytecode)。字节码是一种包含执行程序,由一序列 op 代码(操作码)/数据对组成的二进制文件,是一种中间码。然后,虚拟机中的解释器对字节码代表的指令流进行解释和执行。
另一方面,目前越来越多的区块链平台开始支持智能合约,以进行更为丰富的交易。智能合约是一种计算机程序代码实现的、可以自动执行的交易合约,需要虚拟机来执行。相应的,在支持智能合约的区块链应用场景中,可以在区块链网络的每个节点中部署虚拟机。例如,在以太坊中,每个节点中部署有以太坊虚拟机EVM。用户可以用高级语言编写智能合约,然后经由编译器编译为字节码之后,将该字节码包含在创建智能合约的交易中,发布到区块链网络中,也就是部署到区块链网络的各个节点中。在需要执行智能合约时,由各个节点中的虚拟机EVM对该字节码进行解释执行。
由于智能合约往往会在各个节点的各个虚拟机中多次频繁执行,虚拟机解释器对智能合约字节码的解释执行速度,对区块链平台的整体性能来说至关重要。因此,希望能有改进的方案,进一步提高智能合约指令的执行效率。
发明内容
本说明书一个或多个实施例描述了一种解释执行智能合约指令的方法和装置,根据在另外分配的内存区域中填充的用于执行指令的模拟函数信息来执行指令,从而加快字节码指令的执行效率。
根据第一方面,提供了一种解释执行智能合约指令的方法,通过虚拟机的解释器执行,包括:
确定有待执行的第一合约中第一指令的第一内存地址,所述第一内存地址位于第一内存区域,所述第一内存区域与第二内存区域存在特定映射关系,所述第二内存区域用于存储所述第一合约的经过扩容的字节码;
如果所述第一内存地址中存储的是用于执行所述第一指令的第一模拟函数信息,则根据所述第一模拟函数信息执行该第一指令;
如果所述第一内存地址中存储的是预定初始值,则根据所述线性映射关系,从所述第二内存区域中读取所述第一指令对应的第一字节码片段,根据所述第一字节码片段确定所述第一模拟函数信息,将其填充在所述第一内存地址对应的存储空间中。
根据一种实施方式,在确定有待执行的第一合约中第一指令的第一内存地址之前,还包括:在所述第二内存区域加载所述第一合约的经过扩容的字节码;为所述第一合约分配与所述第二内存区域等容量的第一内存区域,并记录所述第一内存区域和所述第二内存区域之间的线性映射关系;对所述第一内存区域进行初始化,使得其中所有存储位置均存储所述预定初始值。
进一步的,在一个实施例中,在所述第二内存区域加载所述第一合约的经过扩容的字节码具体包括:读取所述第一合约中的第一原始字节码;在所述第一原始字节码后添加冗余码,以对第一原始字节码进行存储空间扩容,使得扩容后的存储空间足以容纳所述第一原始字节码对应的模拟函数信息;修改指令地址索引,使得其中各个索引值指向添加冗余字节码后各条指令的起始存储位置;将针对所述第一合约中各原始字节码扩容后的存储空间,作为所述第二内存区域。
在另一实施例中,在所述第二内存区域加载所述第一合约的经过扩容的字节码,具体包括:读取所述第一合约中的第一扩容字节码,所述第一扩容字节码在所述第一合约编译阶段生成,所述第一扩容字节码包括第一原始字节码和冗余码,所述第一扩容字节码占用的存储空间足以容纳所述第一原始字节码对应的模拟函数信息;将所述第一扩容字节码填充到为其分配的存储空间;将存储所述第一合约中各扩容字节码的存储空间,作为所述第二内存区域。
在一个实施例中,第一模拟函数信息可以是,存储第一模拟函数的可执行代码的第三内存地址,其中所述第一模拟函数用于执行所述第一指令;在这样的情况下,根据所述第一模拟函数信息执行该第一指令,具体包括:跳转到所述第三内存地址,以执行所述第一模拟函数。
在一个例子中,上述预定初始值为,无效的地址值。
在另一实施例中,第一模拟函数信息可以是,指向第一模拟函数的跳转指令,所述第一模拟函数为用于执行所述第一指令的模拟函数;在这样的情况下,根据所述第一模拟函数信息执行该第一指令,具体包括:执行所述跳转指令,从而跳转到所述第一模拟函数进行执行。
在另一例子中,上述预定初始值为,系统异常指令。
根据一种实施方式,可通过以下方式,将第一模拟函数信息填充在所述第一内存地址对应的存储空间中:根据所述线性映射关系,确定所述第二内存区域中与所述第一内存地址对应的第二内存地址;从所述第二内存地址读取所述第一字节码片段,该第一字节码片段包括第一操作码;查询操作码-模拟函数映射表,确定与所述第一操作码对应的第一模拟函数,得到所述第一模拟函数信息;将所述第一模拟函数信息填充在所述第一内存地址对应的存储空间中。
进一步的,在一个实施例中,上述第一字节码片段还包括第一操作数;在这样的情况下,可以将所述第一操作数复制到所述存储空间中。
根据一个实施例,在查询所述映射表时,可以首先在CPU中的高速缓存中查询所述映射表,若不命中,则在内存中查询所述映射表。
根据第二方面,提供了一种解释执行智能合约指令的装置,部署在虚拟机中,包括:
地址确定单元,配置为确定有待执行的第一合约中第一指令的第一内存地址,所述第一内存地址位于第一内存区域,所述第一内存区域与第二内存区域存在特定映射关系,所述第二内存区域用于存储所述第一合约的经过扩容的字节码;
执行单元,配置为如果所述第一内存地址中存储的是用于执行所述第一指令的第一模拟函数信息,则根据所述第一模拟函数信息执行该第一指令;
填充单元,配置为如果所述第一内存地址中存储的是预定初始值,则根据所述线性映射关系,从所述第二内存区域中读取所述第一指令对应的第一字节码片段,根据所述第一字节码片段确定所述第一模拟函数信息,将其填充在所述第一内存地址对应的存储空间中。。
根据第三方面,提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行第一方面的方法。
根据第四方面,提供了一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现第一方面的方法。
根据本说明书实施例提供的方法和装置,在执行智能合约的指令时,如果在针对该合约另外分配的内存区域中已经存储该指令对应的模拟函数信息,则可以直接根据模拟函数信息执行指令;如果没有存储,则查表确定出对应的模拟函数信息,将其填充到上述内存区域。如此,当以后再一次执行到该条指令时,便可以直接执行已经填充的模拟函数信息。随着智能合约的执行,各条指令的模拟函数信息会逐渐填充到上述内存区域。后续的合约执行,就可以基于填充好的模拟函数信息进行,而不必再进行查表,如此显著提高了指令的执行速度。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1示出在一个实施例中的应用场景示意图;
图2示出虚拟机解释器解释执行字节码指令流的过程示意图;
图3概括性示出解释执行字节码的流程图;
图4示出根据一个实施例的直接转换方案的示意图;
图5示出字节码扩容的一个示意图;
图6示出在一个实施例中分配影子内存区域的步骤流程图;
图7示出在一个实施例中解释执行合约执行的的步骤流程图;
图8示出根据一个实施例的解释执行智能合约指令的装置的示意性框图。
具体实施方式
下面结合附图,对本说明书提供的方案进行描述。
图1示出在一个实施例中的应用场景示意图。如图1所示,智能合约可以通过例如C/C++的高级语言来编写,通过编译器,将高级语言编写的智能合约编译为字节码文件,部署到区块链网络的各个节点1-n中。各个节点中均部署有虚拟机,用于执行智能合约。虚拟机例如可以是EVM虚拟机,WASM虚拟机,Solidity虚拟机等。尽管图1中仅示例性详细示出了单个节点,但是需要理解,以下关于虚拟机的描述适用于每个节点。如图所示,节点中部署的虚拟机包含虚拟机解释器,该解释器对智能合约对应的字节码所代表的指令流进行解释,使其在CPU中执行。
图2示出虚拟机解释器解释执行字节码指令流的过程示意图。该过程为传统虚拟机的解释执行过程。如本领域技术人员所知,在执行字节码文件之前,虚拟机首先会将字节码文件加载到内存中,并得到图2中表A所示的指令顺序表。在表A中,示例性示出多条指令的字节码,其中每条指令包含一个操作码(opcode),用于指示本指令要执行的操作,例如指令1中的0x13,指令2中的0x26。去除掉前缀0x后,操作码都是两位十六进制数,长度为一个字节,这也正是其称为字节码的原因。取决于操作类型,有些指令还包含操作数,其指示操作码操作的对象,例如,指令1中的0x46。
虚拟机使用程序计数器(Program Counter)来记录当前执行指令的位置编号,该程序计数器的值又称为PC值。虚拟机解释器通过读取PC值来确定要执行的当前指令。
确定出当前指令后,为了执行该指令,则需要读取当前指令中的操作码,然后查阅表B所示的映射表,即操作码-模拟函数映射表,该映射表示出各个操作码对应的模拟函数。例如,根据表B,操作码13对应于Inc函数,操作码26对应于Move函数,操作码31对应于JMP函数,等等。一般地,该映射表并不记录模拟函数包含的指令代码本身,而是记录存储模拟函数的指令代码的地址。因此,通过查询表B,可以得到当前要执行的操作码所对应的模拟函数地址,经由该地址,可以访问得到模拟函数的指令代码。该指令代码可以是适于CPU直接执行的机器代码,或者是,比字节码更接近机器指令形式的代码,例如汇编代码。因此,通过执行模拟函数的指令代码,可以执行各个操作码代表的指令。
结合具体例子而言,假定当前PC值指向第一条指令,即表示当前要执行指令1。首先读取该指令1的操作码13,然后,查询表B,得到操作码13对应的模拟函数地址,根据该地址,执行模拟函数中的代码,从而执行当前指令1。一般地,字节码文件是顺序执行的指令流,因此除了个别跳转指令之外,PC值会顺序累加。在执行完当前位置处的指令后,PC值累加以指向下一条指令,指令2,作为当前要执行的指令。相应地,通过表A得到,当前要执行的指令2中的操作码为26。类似的,通过查询表B,得到操作码26对应的模拟函数地址,执行其中的代码,从而执行当前指令。如此继续。
图3概括性示出解释执行字节码的流程图。结合以上例子,可以看到,为了执行一条字节码指令,需要执行以下步骤:在步骤31,获得当前PC值;在步骤32,获得当前PC值位置处的操作码;在步骤33,查询映射表,获得对应的模拟函数地址;在步骤34,跳转到目标地址,即模拟函数地址,进行执行;在步骤35,更新PC值;然后循环回到步骤31。通过以上过程可以看到,每执行一条指令,都需要在步骤33进行查表,以得到操作码对应的模拟函数地址,然后才能执行该模拟函数。
可以理解,以上的映射表(表B)至少会存储于内存中。进一步地,综合CPU中高速缓存(cache)的容量大小,以及表B被访问的频次,映射表还有可能被存储在高速缓存中。在执行指令过程中,CPU为了查表,会优先访问高速缓存,在高速缓存不命中的情况下,再去访问内存。对于目前的多数CPU而言,访问L1级高速缓存需要约10个时钟周期(Cycle),访问L2级高速缓存需要20多个时钟周期,如果访问内存,则需要200多个时钟周期。因此,实践中,虚拟机解释执行指令时,有相当一部分时间花在查询该映射表,确定模拟函数地址这一步骤中,引起了较大耗时。这是因为,在获得最终模拟函数地址前处理器无法确定要取的指令,查询映射表会造成处理器内部流水线的停顿,也会导致无法隐藏取指令所需的访存延迟,从而影响性能。
考虑到以上过程中查表造成的耗时,在本说明书的实施例中提出一种代码直接转换的方案,也就是,在内存中将智能合约的字节码直接转换为指向模拟函数的代码,处理器在取指令时,可以直接确定下一条指令的地址,从而通过指令预取来隐藏访存延迟,从而避免每次查表造成的耗时。
图4示出根据一个实施例的直接转换方案的示意图。在直接转换的构思之下,除了常规技术中存储字节码的内存区域之外,还为智能合约开辟另外一段内存区,用于存储直接转换后的、指向模拟函数的代码。下文中,又将该转换后的代码称为“影子”代码,该影子代码包含模拟函数的信息,由此可以无需查询上述映射表而定位或跳转到模拟函数。影子代码的具体形式可以是模拟函数的地址,或者指向模拟函数的跳转指令等,这将在下文中进行详细描述。相应的,为了描述的简单和易于理解,又将上述另外开辟的、存储“影子”代码的内存区,称为影子内存区域,将包含影子代码的合约,称为影子合约。
通常,影子代码占用的内存空间会大于字节码。为了便于两个内存区域之间的直接映射,首先可以对智能合约中的原字节码进行空间扩充或扩容,使得扩容后的空间足以存储影子代码。
图4中的(A)部分示出原始字节码的一个示例,该示例与图2中表A的指令序列相同。右侧的(B)部分示出扩容后的字节码。可以看到,相对于(A)部分的原始字节码,在每条指令中,通过添加冗余码来扩展字节码占用空间。如此,为每条指令分配的内存空间比原始字节码要大。为了描述的简单,将存储(B)部分扩容后的字节码的内存区域称为扩容内存区域。
图4中的(C)部分示出,在第一次加载该智能合约时,为其分配的影子内存区域。影子内存区域的大小与扩容内存区域完全相等匹配,因此两者之间具有映射关系。并且,初始地,对影子内存区域进行初始化,使得其中所有存储位置均存储预定初始值,例如全为0。在本文上下文中,有时将影子内存区域称为第一内存区域,将扩容内存区域称为第二内存区域。
对合约中字节码的直接转换,在合约执行过程中动态进行。也就是说,在执行合约时,当执行到某条指令,就直接在影子内存区域中定位到该条指令的位置。如果发现该位置中存储的是影子代码,那么就可以通过该影子代码直接执行模拟函数,而不必进行查表。如果发现该位置中存储的仍是初始值,则通过查表确定出影子代码,将其填充到影子内存的对应位置。如此,下次执行该条指令时,便可以直接执行影子代码。由于智能合约在部署后往往会被多次调用,多次执行,因此随着合约的执行,影子内存区域会逐渐被影子代码填充。在一定次数的执行后,在影子内存区中形成影子合约代码。后续的合约执行,就可以基于影子合约代码进行,这相当于完全跳过了图3中步骤33的查表过程,显著提高了指令的执行速度。
下面分别描述实现图4整体构思方案的各个阶段实施过程。首先描述从图4的(A)部分到(B)部分的字节码扩容阶段。
根据一种实施方式,字节码的扩容通过编译器,在编译阶段实现。这需要对常规编译器进行少许改动。具体的,可以修改编译器的虚拟机指令集,从而生成字节数符合影子代码要求的长度的操作码。例如,可以在原始操作码后添加一些冗余码,该冗余码不影响原始操作码的定义和执行,只是起到扩充空间的作用,使得扩容后的存储空间足以容纳原始字节码对应的影子代码。例如,对于图4中(A)部分所示的指令1中的原始操作码为0x13,可以通过修改的编译器,直接将其编译为扩容字节码0x13,0x00,如(B)部分所示,其中0x13为原始操作码,0x00为采用操作码前缀形式的冗余码,用来扩充存储空间。
根据另一种实施方式,字节码的扩容可以在将字节码加载到内存的过程中实现。在这样的情况下,编译器针对智能合约编译输出常规的原始字节码。在虚拟机加载该智能合约的字节码时,首先,读取合约中的某条指令的原始字节码,然后,在该原始字节码后添加冗余码,以对这段原始字节码进行存储空间扩容,使得扩容后的存储空间足以容纳原始字节码对应的模拟函数信息,即影子代码。
字节码存储空间的扩容会导致指令地址发生变化,因此,需要修改与指令地址有关的索引。图5示出字节码扩容的一个示意图。图5左侧为指令序列对应的原始字节码和地址索引,其中指令1的地址索引值为0,即指令1的起始存储位置为所分配的内存区段中第0个存储单位;指令2的地址索引值为2,即指令2的起始存储位置为上述内存区域中第2个存储单位。或者说,指令2相对于指令1的偏移为2个存储单位。
通过为左侧的原始字节码中部分字节码添加冗余码,得到右侧的扩容字节码和地址索引。可以看到,为了对指令1的字节码进行扩容,在其操作码0x13后添加了冗余码,这使得指令1占据了3个存储单位。相应的,指令2的起始存储位置变更为第3个存储单位,因此,将其指令地址索引值修改为3。类似的,对于指令3和指令4,也对其字节码进行了扩容;相应的,指令3和指令4的指令地址索引值分别变更为7和9。
以上的指令地址索引,可以存储为索引表的形式,供程序计数器确定PC值。有些智能合约的执行逻辑中会涉及指令跳转,在这样的情况下,不仅要修改上述索引表中的索引值,还可以相应修改指令字节码中跳转指令所指向的指令地址。
通过以上方式,对原始字节码进行了扩容。于是,可以将存储经过扩容的字节码的存储空间,作为扩容内存区域,如图4中(B)部分所示。
下面描述图4中的(C)部分示出的分配影子内存区域的过程。图6示出在一个实施例中分配影子内存区域的步骤流程图。需要理解,分配影子内存区域可以在第一次加载智能合约时进行。因此,首先在步骤61,在扩容内存区域中加载智能合约的经过扩容的字节码。如前所述,这至少包含两种实施情况。当编译器直接将智能合约编译为经过扩容的字节码时,在该步骤61,可以将经过扩容的字节码读取并存储到扩容内存区域中。当虚拟机获取的是原始字节码时,则在该步骤61中,一边加载一边对原始字节码进行扩容,如以上结合图5所述,不再赘述其具体过程。
然后,在步骤62,为该智能合约分配与扩容内存区域等容量的影子内存区域。由于两个内存区域大小完全相等,因此,这两个内存区域之间存在映射关系,可以记录该映射关系,便于后续在两者之间进行映射。在一个例子中,两个内存区域中各个内存区块之间的映射关系可以记录为内存映射表,存储在高速缓存中。优选的,在一个例子中,使得影子内存区域与扩容内存区域之间存在简单直接的线性映射关系,该线性映射关系可以体现为两个内存区域的起始地址之间的偏移量X。可以理解,在简单直接的线性映射关系的情况下,对于任意一条指令,假定其在扩容内存区域中的存储位置地址为Ad2,只要在该地址Ad2上加上或减去上述偏移量X,就可以直接映射到该条指令在影子内存中的存储位置地址Ad1,而不必查询上述内存映射表,这使得内存映射更加快速、直接。
接着,在步骤63,对影子内存区域进行初始化,使得其中所有存储位置均存储预定初始值。需要理解,该预定初始值需要与影子代码区分开来,以使得后续执行时,可以确定出对应位置是否已填充影子代码。在一个实施例中,影子代码,即模拟函数信息,为模拟函数的地址。在这样的情况下,初始值可以是无效的地址形式,例如为0,或者为0xff。图4中的(C)部分即示出了影子内存区域被初始化为全为0的情况。在另一例子中,模拟函数信息具体是,指向模拟函数的可执行的跳转指令或调用指令。在这样的情况下,初始值可以是导致系统异常的指令,例如,针对x86处理器的单字节指令int3。在其他实施例中,初始值还可以是不同于模拟函数信息格式的预定值,只要能够区分出是否为有效的影子代码即可。
通过以上过程,为智能合约形成了初始化的影子内存区域。接下来,在执行智能合约中的指令的过程中,动态地用影子代码替代初始值,逐步填充该影子内存区域。
下面描述基于影子内存区域解释执行合约指令的过程,对应于图4中从(C)部分到(D)部分所示的过程。图7示出在一个实施例中解释执行合约执行的的步骤流程图。
如图7所示,首先在步骤71,确定当前有待执行的指令在影子内存区域中的内存地址。为了描述的方便,将当前有待执行的指令称为第一指令,将其在影子内存区域中的内存地址称为第一内存地址。可以理解,该第一指令可以是待执行的智能合约中的任意一条指令。
具体的,在针对某个智能合约形成影子内存区域之后,每次执行该智能合约时,虚拟机直接定位到对应的影子内存区域进行解释执行。对于本次执行的入口指令,程序计数器可以根据影子内存区域对应的指令地址索引表,使得PC值指向该入口指令在影子内存区域中的内存地址。这里描述的PC值实际上是虚拟机PC值。实际上,物理计算机还存在物理PC值。在虚拟机解释执行的过程中,首先要根据虚拟机PC值,确定出模拟函数地址,从而确定物理PC值,再使用跳转指令,使得物理计算机获知该物理PC值。下文中,如无特殊说明,PC值默认指代虚拟机PC值。
在执行完上一条指令后,PC值会参照上述指令地址索引表更新,从而指向下一条指令的内存地址。因此,对于有待执行的第一指令,可以直接根据PC值得到上述第一内存地址。
然后,根据第一内存地址中的存储内容进行尝试执行。如果第一内存地址中已存储影子代码,则该尝试执行的结果就是在步骤73,根据该第一模拟函数信息执行该第一指令;如果其中存储的是前述初始值,则该尝试执行的结果就是在步骤74,执行转换逻辑,以在第一内存地址中填充第一模拟函数信息。具体的,可以根据影子内存区域和扩容内存区域之间的线性映射关系,从扩容内存区域中读取第一指令对应的字节码,由此确定对应的第一模拟函数信息,将其填充在第一内存地址对应的存储空间中。
在一个实施例中,影子代码具体体现为模拟函数的内存地址,而影子内存区域中的初始值为无效地址形式,例如0,或者0xff。在这样的情况下,尝试执行意味着,尝试跳转到第一内存地址中存储的地址。如果其中的地址为有效地址,则认为该地址为对应的第一模拟函数的可执行代码的存储地址,那么,在步骤73,成功跳转到该存储地址,执行其中的可执行代码,从而通过执行第一模拟函数执行该第一指令。如果第一内存地址中存储的是无效地址,则无法成功跳转,据此可以确定该第一内存地址对应的存储单元仍处于初始化状态,尚未存储影子代码,则执行步骤74,在其中填充第一模拟函数信息。
在另一实施例中,影子代码具体体现为指向模拟函数的跳转指令或调用指令,而影子内存中的初始值为系统异常指令,例如针对x86处理器的int3指令,并且将系统设置为,当系统异常时会执行前述转换逻辑,也就是,使得系统异常指令导致转换逻辑的执行。在这样的情况下,可以直接尝试执行第一内存地址中存储的指令。如果可以正常执行,则相当于直接进入步骤73,通过正常执行的跳转指令,跳转到第一模拟函数进行执行。如果执行出现异常,则触发前述转换逻辑的执行,即步骤74。
在其他实施例中,初始值还可以是其他形式或其他值,只要其不同于模拟函数信息的可能取值。在一些实施例中,也可以主动判断,第一内存地址中存储的是否为预定的初始值。如果不是初始值,则认为已存储影子代码,执行步骤73;如果存储的是初始值,则执行步骤74。
下面描述执行步骤74的具体过程,即子步骤。如图所示,在步骤741,根据影子内存区域和扩容内存区域之间的预定映射关系,确定扩容内存区域中与第一内存地址对应的第二内存地址。如前所述,在一个例子中,在高速缓存中存储两个内存区域之间的内存映射关系表。此时,可以通过查询该表,确定与第一内存地址对应的第二内存地址。在另一例子中,扩容内容区域和影子内存区域中的存储单元之间存在线性映射关系。此时,可以通过在第一内存地址上加上或减去地址偏移量,得到第二内存地址。需要理解,由于上述一一对应的映射关系,在第一内存地址指向第一指令的情况下,第二内存地址中存储的即为第一指令对应的字节码。
于是,在步骤742,从第二内存地址读取第一字节码片段,该第一字节码片段包括第一操作码。需要理解,该第一字节码片段即为第一指令对应的字节码片段,其中至少包含操作码,即第一操作码。
然后,在步骤743,查询操作码-模拟函数映射表,确定与第一操作码对应的第一模拟函数,得到第一模拟函数信息。具体的,该映射表可以如图2中表B所示。查询到第一模拟函数后,可以将存储该第一模拟函数的可执行代码的内存地址作为第一模拟函数信息,或者可以生成指向该第一模拟函数的跳转指令或者调用指令,作为第一模拟函数信息。
于是,在步骤744,将上述第一模拟函数信息填充在第一内存地址对应的存储空间中。也就是说,用第一模拟函数信息替换原有的初始值,或者说,将原有的初始值更新为该第一模拟函数信息。
除了包含操作码,第一字节码片段还可能包含操作码针对的操作数。针对这样的情况,在一个例子中,将该操作数也复制到上述第一内存地址对应的存储空间中。在这样的情况下,虚拟机基于第一内存地址进行指令执行时,可以通过模拟函数返回的地址处的物理PC值得到操作数。在另一个例子中,也可以不复制该操作数,也就是说,该操作数只存储于扩容内存区域。在这样的情况下,虚拟机基于第一内存地址进行指令执行时,可以通过原始字节码的PC值得到操作数。
如此,通过上述步骤74,影子内存区域中第一指令对应的存储单元中填充了第一模拟函数信息。需要注意的是,在执行步骤74之后,不更新PC值,而再次回到步骤71。当再次执行时,就会发现该第一内存地址中已经存储影子代码,于是在步骤73中执行该影子代码。在执行步骤73之后,在步骤75更新PC值,然后回到步骤71,以执行下一条指令。
下面结合图4所示的具体例子,描述图7所示的执行过程。假定本次执行的入口指令为指令1,且假定当前影子内存区域的状态为,仅指令1对应的存储单元填充有影子代码,其他存储单元仍存储初始值0。
对于入口指令1,在步骤71通过当前虚拟机PC值获取到指令1在影子内存区域中的内存地址。由于其中已存储影子代码,在步骤73,执行其中的影子代码,即跳转指令jmpinc-func,该跳转指令指向指令1的原始操作码0x13所对应的模拟函数inc。于是可以通过执行该模拟函数inc,执行指令1。在这之后,在步骤75更新PC值,使其指向下一条指令,即指令2的内存地址。
再一次地,在步骤71,通过当前PC值获取到指令2在影子内存区域中的内存地址。然而,该地址中存储的是初始值0。于是,执行步骤74。从图4中(B)部分所示的扩容内存区域中读取指令2的原始操作码0x26,然后查询映射表,得到该操作码对应的模拟函数mov,进而用模拟函数信息填充影子内存区域中指令2对应的位置。在图4的(D)部分的示例中,模拟函数信息为指向模拟函数的指令。因此,在影子内存区域中对应于指令2的存储位置中填充跳转指令jmp mov-func。此时,影子内存区域的状态如图4中(D)部分所示。
然后,再次回到步骤71。此时,PC值仍然指向指令2的地址。但是,该地址现在已经存储有影子代码。于是,在步骤73,执行该影子代码jmp mov-func,从而执行指令2。
接着,按照如上同样的方式执行后续的指令。
通过以上过程可以看到,在执行智能合约的指令时,仅在第一次执行某条指令时需要查询映射表,将其模拟函数信息填充到影子内存区域中。当以后再一次执行到该条指令时,便可以直接执行影子内存区域中存储的影子代码。由于智能合约在部署后往往会被多次调用,多次执行,因此随着合约的执行,影子内存区域会逐渐被影子代码填充。在一定次数的执行后,在影子内存区中形成影子合约代码。后续的合约执行,就可以基于影子合约代码进行,这相当于完全跳过了图3中步骤33的查表过程,显著提高了指令的执行速度。
此外,需要理解,在一些情况下,也可以在合约执行之前,将影子代码一次性全部填充到影子内存区域。这样的填充方式可称为静态方式。然而,静态方式对合约代码的情况和虚拟机都有较多限制。而在执行过程中动态填充影子代码的方式,可以支持各种合约代码情况。例如,在合约代码包含间接分支指令,且这些间接分支指令的目的地址没有被存放在静态可访问的表中时,或者,在无法预先获知合约代码的所有可能入口指令时,静态方式都难以实施。但是,动态填充的方式则可以支持合约代码的所有可能情况。
根据另一方面的实施例,提供了一种解释执行智能合约指令的装置,该装置部署在虚拟机中,虚拟机可以安装在任何具有计算、处理能力的设备、平台或设备集群中,更具体的,可以安装在区块链网络的节点设备中。图8示出根据一个实施例的解释执行智能合约指令的装置的示意性框图。如图8所示,该装置800包括:
地址确定单元82,配置为确定有待执行的第一合约中第一指令的第一内存地址,所述第一内存地址位于第一内存区域,所述第一内存区域与第二内存区域存在特定映射关系,所述第二内存区域用于存储所述第一合约的经过扩容的字节码;
执行单元83,配置为如果所述第一内存地址中存储的是用于执行所述第一指令的第一模拟函数信息,则根据所述第一模拟函数信息执行该第一指令;
填充单元84,配置为如果所述第一内存地址中存储的是预定初始值,则执行转换逻辑,所述转换逻辑包括,根据所述特定映射关系,从所述第二内存区域中读取所述第一指令对应的第一字节码片段,根据所述第一字节码片段确定所述第一模拟函数信息,将其填充在所述第一内存地址对应的存储空间中。
根据一种实施方式,装置800还包括内存创建单元81,其进一步包括(未示出):
加载模块,配置为在所述第二内存区域加载所述第一合约的经过扩容的字节码;
分配模块,配置为为所述第一合约分配与所述第二内存区域等容量的第一内存区域,并记录所述第一内存区域和所述第二内存区域之间的映射关系作为所述特定映射关系;
初始化模块,配置为对所述第一内存区域进行初始化,使得其中所有存储位置均存储所述预定初始值。
根据一个实施例,上述加载模块配置为:读取所述第一合约中的第一原始字节码;在所述第一原始字节码后添加冗余码,以对第一原始字节码进行存储空间扩容,使得扩容后的存储空间足以容纳所述第一原始字节码对应的模拟函数信息;修改指令地址索引,使得其中各个索引值指向添加冗余字节码后各条指令的起始存储位置;将针对所述第一合约中各原始字节码扩容后的存储空间,作为所述第二内存区域。
在另一实施例中,上述加载模块配置为:读取所述第一合约中的第一扩容字节码,所述第一扩容字节码在所述第一合约编译阶段生成,所述第一扩容字节码包括第一原始字节码和冗余码,所述第一扩容字节码占用的存储空间足以容纳所述第一原始字节码对应的模拟函数信息;将所述第一扩容字节码填充到为其分配的存储空间;将存储所述第一合约中各扩容字节码的存储空间,作为所述第二内存区域。
在一种实施方式中,上述第一模拟函数信息为,存储第一模拟函数的可执行代码的第三内存地址,其中所述第一模拟函数用于执行所述第一指令;在这样的情况下,所述执行单元83配置为:跳转到所述第三内存地址,以执行所述第一模拟函数。
根据一个示例,上述预定初始值可以是,无效的地址值。
在另一种实施方式中,所述第一模拟函数信息为,指向第一模拟函数的跳转指令,所述第一模拟函数为用于执行所述第一指令的模拟函数;在这样的情况下,执行单元83可以配置为:执行所述跳转指令,从而跳转到所述第一模拟函数进行执行。
根据另一个示例,预定初始值可以为,系统异常指令,且所述系统异常指令导致所述转换逻辑的执行。
根据一种实施方式,所述填充单元84配置为:根据所述特定映射关系,确定所述第二内存区域中与所述第一内存地址对应的第二内存地址;从所述第二内存地址读取所述第一字节码片段,该第一字节码片段包括第一操作码;查询操作码-模拟函数映射表,确定与所述第一操作码对应的第一模拟函数,得到所述第一模拟函数信息;将所述第一模拟函数信息填充在所述第一内存地址对应的存储空间中。
在一个实施例中,上述第一字节码片段还包括第一操作数;所述填充单元84配置为,在将所述第一模拟函数信息填充在所述第一内存地址对应的存储空间中之后,将所述第一操作数复制到所述存储空间中。
更具体的,在一个例子中,所述填充单元84在查询映射表时,首先在CPU中的高速缓存中查询所述映射表,若不命中,则在内存中查询所述映射表。
在一个实施例中,所述虚拟机为EVM虚拟机,或WASM虚拟机或Solidity虚拟机。
根据另一方面的实施例,还提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行结合图7所描述的方法。
根据再一方面的实施例,还提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现结合图7所述的方法。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。
Claims (24)
1.一种解释执行智能合约指令的方法,通过虚拟机的解释器执行,包括:
确定有待执行的第一合约中第一指令的第一内存地址,所述第一内存地址位于第一内存区域,所述第一内存区域与第二内存区域存在特定映射关系,所述第二内存区域用于存储所述第一合约的经过扩容的字节码;
如果所述第一内存地址中存储的是用于执行所述第一指令的第一模拟函数信息,则根据所述第一模拟函数信息执行该第一指令;
如果所述第一内存地址中存储的是预定初始值,则执行转换逻辑,所述转换逻辑包括,根据所述特定映射关系,从所述第二内存区域中读取所述第一指令对应的第一字节码片段,根据所述第一字节码片段确定所述第一模拟函数信息,将其填充在所述第一内存地址对应的存储空间中。
2.根据权利要求1所述的方法,在确定有待执行的第一合约中第一指令的第一内存地址之前,还包括:
在所述第二内存区域加载所述第一合约的经过扩容的字节码;
为所述第一合约分配与所述第二内存区域等容量的第一内存区域,并记录所述第一内存区域和所述第二内存区域之间的映射关系作为所述特定映射关系;
对所述第一内存区域进行初始化,使得其中所有存储位置均存储所述预定初始值。
3.根据权利要求2所述的方法,其中,在所述第二内存区域加载所述第一合约的经过扩容的字节码,包括:
读取所述第一合约中的第一原始字节码;
在所述第一原始字节码后添加冗余码,以对第一原始字节码进行存储空间扩容,使得扩容后的存储空间足以容纳所述第一原始字节码对应的模拟函数信息;
修改指令地址索引,使得其中各个索引值指向添加冗余字节码后各条指令的起始存储位置;
将针对所述第一合约中各原始字节码扩容后的存储空间,作为所述第二内存区域。
4.根据权利要求2所述的方法,其中,在所述第二内存区域加载所述第一合约的经过扩容的字节码,包括:
读取所述第一合约中的第一扩容字节码,所述第一扩容字节码在所述第一合约编译阶段生成,所述第一扩容字节码包括第一原始字节码和冗余码,所述第一扩容字节码占用的存储空间足以容纳所述第一原始字节码对应的模拟函数信息;
将所述第一扩容字节码填充到为其分配的存储空间;
将存储所述第一合约中各扩容字节码的存储空间,作为所述第二内存区域。
5.根据权利要求1所述的方法,其中,所述第一模拟函数信息为,存储第一模拟函数的可执行代码的第三内存地址,其中所述第一模拟函数用于执行所述第一指令;
根据所述第一模拟函数信息执行该第一指令,包括:跳转到所述第三内存地址,以执行所述第一模拟函数。
6.根据权利要求5所述的方法,其中,所述预定初始值为,无效的地址值。
7.根据权利要求1所述的方法,其中,所述第一模拟函数信息为,指向第一模拟函数的跳转指令,所述第一模拟函数为用于执行所述第一指令的模拟函数;
根据所述第一模拟函数信息执行该第一指令,包括:执行所述跳转指令,从而跳转到所述第一模拟函数进行执行。
8.根据权利要求7所述的方法,其中,所述预定初始值为,系统异常指令,且所述系统异常指令导致所述转换逻辑的执行。
9.根据权利要求1所述的方法,其中,从所述第二内存区域中读取所述第一指令对应的第一字节码片段,根据所述第一字节码片段确定所述第一模拟函数信息,将其填充在所述第一内存地址对应的存储空间中,具体包括:
根据所述特定映射关系,确定所述第二内存区域中与所述第一内存地址对应的第二内存地址;
从所述第二内存地址读取所述第一字节码片段,该第一字节码片段包括第一操作码;
查询操作码-模拟函数映射表,确定与所述第一操作码对应的第一模拟函数,得到所述第一模拟函数信息;
将所述第一模拟函数信息填充在所述第一内存地址对应的存储空间中。
10.根据权利要求9所述的方法,其中,所述第一字节码片段还包括第一操作数;
在将所述第一模拟函数信息填充在所述第一内存地址对应的存储空间中之后,还包括,将所述第一操作数复制到所述存储空间中。
11.根据权利要求9所述的方法,其中,所述特定映射关系为,具有一定地址偏移量的线性映射关系;
根据所述特定映射关系,确定所述第二内存区域中与所述第一内存地址对应的第二内存地址,包括:基于所述第一内存地址加上或减去所述地址偏移量,得到所述第二内存地址。
12.一种解释执行智能合约指令的装置,部署在虚拟机中,包括:
地址确定单元,配置为确定有待执行的第一合约中第一指令的第一内存地址,所述第一内存地址位于第一内存区域,所述第一内存区域与第二内存区域存在特定映射关系,所述第二内存区域用于存储所述第一合约的经过扩容的字节码;
执行单元,配置为如果所述第一内存地址中存储的是用于执行所述第一指令的第一模拟函数信息,则根据所述第一模拟函数信息执行该第一指令;
填充单元,配置为如果所述第一内存地址中存储的是预定初始值,则执行转换逻辑,所述转换逻辑包括,根据所述特定映射关系,从所述第二内存区域中读取所述第一指令对应的第一字节码片段,根据所述第一字节码片段确定所述第一模拟函数信息,将其填充在所述第一内存地址对应的存储空间中。
13.根据权利要求12所述的装置,还包括内存创建单元,包括:
加载模块,配置为在所述第二内存区域加载所述第一合约的经过扩容的字节码;
分配模块,配置为为所述第一合约分配与所述第二内存区域等容量的第一内存区域,并记录所述第一内存区域和所述第二内存区域之间的映射关系作为所述特定映射关系;
初始化模块,配置为对所述第一内存区域进行初始化,使得其中所有存储位置均存储所述预定初始值。
14.根据权利要求13所述的装置,其中,所述加载模块配置为:
读取所述第一合约中的第一原始字节码;
在所述第一原始字节码后添加冗余码,以对第一原始字节码进行存储空间扩容,使得扩容后的存储空间足以容纳所述第一原始字节码对应的模拟函数信息;
修改指令地址索引,使得其中各个索引值指向添加冗余字节码后各条指令的起始存储位置;
将针对所述第一合约中各原始字节码扩容后的存储空间,作为所述第二内存区域。
15.根据权利要求13所述的装置,其中,所述加载模块配置为:
读取所述第一合约中的第一扩容字节码,所述第一扩容字节码在所述第一合约编译阶段生成,所述第一扩容字节码包括第一原始字节码和冗余码,所述第一扩容字节码占用的存储空间足以容纳所述第一原始字节码对应的模拟函数信息;
将所述第一扩容字节码填充到为其分配的存储空间;
将存储所述第一合约中各扩容字节码的存储空间,作为所述第二内存区域。
16.根据权利要求12所述的装置,其中,所述第一模拟函数信息为,存储第一模拟函数的可执行代码的第三内存地址,其中所述第一模拟函数用于执行所述第一指令;
所述执行单元配置为:跳转到所述第三内存地址,以执行所述第一模拟函数。
17.根据权利要求16所述的装置,其中,所述预定初始值为,无效的地址值。
18.根据权利要求12所述的装置,其中,所述第一模拟函数信息为,指向第一模拟函数的跳转指令,所述第一模拟函数为用于执行所述第一指令的模拟函数;
所述执行单元配置为:执行所述跳转指令,从而跳转到所述第一模拟函数进行执行。
19.根据权利要求18所述的装置,其中,所述预定初始值为,系统异常指令,且所述系统异常指令导致所述转换逻辑的执行。
20.根据权利要求12所述的装置,其中,所述填充单元配置为:
根据所述特定映射关系,确定所述第二内存区域中与所述第一内存地址对应的第二内存地址;
从所述第二内存地址读取所述第一字节码片段,该第一字节码片段包括第一操作码;
查询操作码-模拟函数映射表,确定与所述第一操作码对应的第一模拟函数,得到所述第一模拟函数信息;
将所述第一模拟函数信息填充在所述第一内存地址对应的存储空间中。
21.根据权利要求20所述的装置,其中,所述第一字节码片段还包括第一操作数;
所述填充单元配置为,在将所述第一模拟函数信息填充在所述第一内存地址对应的存储空间中之后,将所述第一操作数复制到所述存储空间中。
22.根据权利要求20所述的装置,其中,所述特定映射关系为,具有一定地址偏移量的线性映射关系;
所述填充单元配置为,基于所述第一内存地址加上或减去所述地址偏移量,得到所述第二内存地址。
23.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行权利要求1-11中任一项的所述的方法。
24.一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现权利要求1-11中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010475572.0A CN111399990B (zh) | 2020-05-29 | 2020-05-29 | 解释执行智能合约指令的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010475572.0A CN111399990B (zh) | 2020-05-29 | 2020-05-29 | 解释执行智能合约指令的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111399990A true CN111399990A (zh) | 2020-07-10 |
CN111399990B CN111399990B (zh) | 2020-09-22 |
Family
ID=71431895
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010475572.0A Active CN111399990B (zh) | 2020-05-29 | 2020-05-29 | 解释执行智能合约指令的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111399990B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111770204A (zh) * | 2020-08-31 | 2020-10-13 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点和存储介质 |
CN111770205A (zh) * | 2020-08-31 | 2020-10-13 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点、系统和存储介质 |
CN112527464A (zh) * | 2020-12-18 | 2021-03-19 | 上海万向区块链股份公司 | 基于区块链的虚拟机内存自动扩容系统和方法 |
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 |
CN117215544A (zh) * | 2023-11-09 | 2023-12-12 | 中国科学院软件研究所 | 一种智能合约专用指令集的实现及运行方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2019191515A1 (en) * | 2018-03-29 | 2019-10-03 | Neji, Inc. | Programmable network packet |
CN110688122A (zh) * | 2019-09-30 | 2020-01-14 | 支付宝(杭州)信息技术有限公司 | 编译和执行智能合约的方法及装置 |
CN110704108A (zh) * | 2019-08-30 | 2020-01-17 | 阿里巴巴集团控股有限公司 | 解释执行字节码指令流的方法及装置 |
-
2020
- 2020-05-29 CN CN202010475572.0A patent/CN111399990B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2019191515A1 (en) * | 2018-03-29 | 2019-10-03 | Neji, Inc. | Programmable network packet |
CN110704108A (zh) * | 2019-08-30 | 2020-01-17 | 阿里巴巴集团控股有限公司 | 解释执行字节码指令流的方法及装置 |
CN110688122A (zh) * | 2019-09-30 | 2020-01-14 | 支付宝(杭州)信息技术有限公司 | 编译和执行智能合约的方法及装置 |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111770204A (zh) * | 2020-08-31 | 2020-10-13 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点和存储介质 |
CN111770205A (zh) * | 2020-08-31 | 2020-10-13 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点、系统和存储介质 |
CN111770205B (zh) * | 2020-08-31 | 2020-12-04 | 支付宝(杭州)信息技术有限公司 | 一种执行智能合约的方法、区块链节点、系统和存储介质 |
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 |
US11416272B2 (en) | 2020-08-31 | 2022-08-16 | Alipay (Hangzhou) Information Technology Co., Ltd. | Methods, blockchain nodes, systems and storage media for executing smart contract |
CN112527464A (zh) * | 2020-12-18 | 2021-03-19 | 上海万向区块链股份公司 | 基于区块链的虚拟机内存自动扩容系统和方法 |
CN117215544A (zh) * | 2023-11-09 | 2023-12-12 | 中国科学院软件研究所 | 一种智能合约专用指令集的实现及运行方法 |
CN117215544B (zh) * | 2023-11-09 | 2024-02-09 | 中国科学院软件研究所 | 一种智能合约专用指令集的实现及运行方法 |
Also Published As
Publication number | Publication date |
---|---|
CN111399990B (zh) | 2020-09-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111399990B (zh) | 解释执行智能合约指令的方法及装置 | |
US7644402B1 (en) | Method for sharing runtime representation of software components across component loaders | |
US8321850B2 (en) | Sharing and persisting code caches | |
CN111770113A (zh) | 一种执行智能合约的方法、区块链节点和节点设备 | |
US9201635B2 (en) | Just-in-time dynamic translation for translation, compilation, and execution of non-native instructions | |
US11249758B2 (en) | Conditional branch frame barrier | |
US9213563B2 (en) | Implementing a jump instruction in a dynamic translator that uses instruction code translation and just-in-time compilation | |
US11573894B2 (en) | Tracking garbage collection states of references | |
US9524178B2 (en) | Defining an instruction path to be compiled by a just-in-time (JIT) compiler | |
WO2012010419A1 (en) | A string cache file for optimizing memory usage in a java virtual machine | |
US7406687B1 (en) | Sharing runtime representation of software component methods across component loaders | |
KR100725393B1 (ko) | 자바 가상 머신에서 바이트 코드의 수행 시간을 줄이는시스템 및 방법 | |
US6931638B2 (en) | Method and apparatus to facilitate sharing optimized instruction code in a multitasking virtual machine | |
CN115495086A (zh) | 一种编译方法和编译器、Wasm虚拟机 | |
US20150186166A1 (en) | Dynamic on/off just-in-time compilation in a dynamic translator using instruction code translation | |
WO2022237590A1 (zh) | 智能合约升级方法及区块链系统 | |
CN116934330A (zh) | 一种调用智能合约的方法及执行方法、计算机设备及存储介质 | |
TWI743698B (zh) | 解譯執行位元組碼指令流的方法及裝置 | |
KR100478463B1 (ko) | 응용 프로그램의 동적링크 방법 | |
KR101083271B1 (ko) | 액티브엑스 컨트롤 변환 시스템 및 방법 | |
US10802854B2 (en) | Method and apparatus for interpreting bytecode instruction stream | |
US20240134666A1 (en) | Hybrid just in time load module compiler with performance optimizations | |
CN116932085A (zh) | 一种启动WebAssembly程序的方法、计算机设备及存储介质 | |
CN116909652A (zh) | 一种启动WebAssembly程序的方法、计算机设备及存储介质 | |
WO2022180594A1 (en) | Hybrid just in time load module compiler with performance optimizations |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40032971 Country of ref document: HK |