CN116155934A - 智能合约调用账本的方法、装置、电子设备和存储介质 - Google Patents
智能合约调用账本的方法、装置、电子设备和存储介质 Download PDFInfo
- Publication number
- CN116155934A CN116155934A CN202211551574.9A CN202211551574A CN116155934A CN 116155934 A CN116155934 A CN 116155934A CN 202211551574 A CN202211551574 A CN 202211551574A CN 116155934 A CN116155934 A CN 116155934A
- Authority
- CN
- China
- Prior art keywords
- instruction
- machine code
- intelligent contract
- account book
- calling
- 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
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/12—Protocols specially adapted for proprietary or special-purpose networking environments, e.g. medical networks, sensor networks, networks in vehicles or remote metering networks
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/34—Network arrangements or protocols for supporting network services or applications involving the movement of software or configuration parameters
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Health & Medical Sciences (AREA)
- Computing Systems (AREA)
- General Health & Medical Sciences (AREA)
- Medical Informatics (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本申请涉及区块链技术领域,提出一种智能合约调用账本的方法、装置、电子设备和存储介质。该方法包括:调用并执行已完成编译的智能合约机器码;当执行到智能合约机器码中的账本调用指令时,保存智能合约机器码中处于账本调用指令之后的第一条指令的地址,并返回执行区块链平台机器码;调用并执行区块链平台机器码中预设的账本操作指令;当执行完账本操作指令之后,根据该地址跳转至执行智能合约机器码中处于账本调用指令之后的第一条指令。采用该方法,即便针对使用包含内存管理机制的语言编写的区块链平台,也可以实现智能合约对账本操作方法的调用。
Description
技术领域
本申请涉及区块链技术领域,尤其涉及一种智能合约调用账本的方法、装置、电子设备和存储介质。
背景技术
在智能合约执行的过程中,经常需要对区块链账本进行操作。区块链账本属于区块链平台的一部分,其包含了区块链的状态集。通常来说,区块链平台会封装一些账本操作方法以供智能合约调用,这些账本操作方法最终以账本操作指令的形式成为区块链平台机器码中的一部分。
目前,对于已经编译成机器码的智能合约,当其需要与区块链账本进行交互时,如果区块链平台使用C++等语言编写,则可以使用CALL机器指令来完成账本操作方法的调用。CALL机器指令是机器码指令集中的一类指令,如x86-64指令集架构下的CALL指令,其含义是将当前程序信息保存在堆栈上并跳转到使用目标操作数指定的调用程序上执行。
然而,如果区块链平台使用包含内存管理机制的语言(例如Golang)编写,由于存在内存管理机制的限制,会导致无法使用CALL机器指令来完成账本操作方法的调用。因此,目前针对使用包含内存管理机制的语言编写的区块链平台,还无法实现智能合约对账本操作方法的调用。
发明内容
有鉴于此,本申请实施例提供了一种智能合约调用账本的方法、装置、电子设备和存储介质,即便针对使用包含内存管理机制的语言编写的区块链平台,也可以实现智能合约对账本操作方法的调用。
本申请实施例的第一方面提供了一种智能合约调用账本的方法,包括:
调用并执行已完成编译的智能合约机器码;
当执行到所述智能合约机器码中的账本调用指令时,保存所述智能合约机器码中处于所述账本调用指令之后的第一条指令的地址,并返回执行区块链平台机器码;
调用并执行所述区块链平台机器码中预设的账本操作指令;
当执行完所述账本操作指令之后,根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令。
在本申请实施例中,首先调用并执行已完成编译的智能合约机器码,当执行到该智能合约机器码中的账本调用指令时,保存该账本调用指令之后的第一条指令的地址,并返回执行区块链平台机器码;然后,调用并执行区块链平台机器码中预设的账本操作指令,也即调用账本操作方法实现智能合约与区块链账本之间的交互;最后,当执行完该账本操作指令之后,可以根据之前保存的地址,跳转至执行该智能合约机器码中处于该账本调用指令之后的第一条指令,从而继续完成对智能合约的调用。上述过程没有使用CALL机器指令,而是通过保存的指令地址,达到从智能合约机器码切换到区块链平台机器码,并从区块链平台机器码重新进入智能合约机器码的目的,也即通过调用切换机器码的方式实现了智能合约对账本操作方法的调用,这种方式适用于使用包含内存管理机制的语言编写的区块链平台。
在本申请实施例的一种实现方式中,所述当执行到所述智能合约机器码中的账本调用指令时,还可以包括:
设置调用状态量为指定数值;
所述调用并执行所述区块链平台机器码中预设的账本操作指令,可以包括:
若检测到所述调用状态量为所述指定数值,则确定所述智能合约机器码的调用返回状态为账本调用;
若所述智能合约机器码的调用返回状态为账本调用,则调用并执行所述区块链平台机器码中预设的账本操作指令。
在本申请实施例的一种实现方式中,所述调用并执行已完成编译的智能合约机器码,可以包括:
当执行到所述区块链平台机器码中的智能合约调用指令时,调用并执行所述智能合约机器码。
进一步的,在根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令之后,还可以包括:
当执行完所述智能合约机器码的最后一条指令之后,返回执行所述区块链平台机器码中处于所述智能合约调用指令之后的第一条指令。
在本申请实施例的一种实现方式中,在调用并执行已完成编译的智能合约机器码之前,还可以包括:
获取智能合约的字节码;
检测所述字节码中存在的用于操作账本的目标指令;
将所述目标指令替换为指定指令,得到更新后的字节码;其中,所述指定指令的处理逻辑包括保存所述指定指令之后的第一条指令的地址、设置调用状态量和子程序返回;
对所述更新后的字节码进行编译,得到所述智能合约机器码;其中,所述智能合约机器码中的所述账本调用指令由所述指定指令编译后得到。
在本申请实施例的另一种实现方式中,在调用并执行已完成编译的智能合约机器码之前,还可以包括:
获取智能合约的字节码;
检测所述字节码中存在的用于操作账本的目标指令;
在将所述字节码编译成所述智能合约机器码的过程中,将所述目标指令编译成所述智能合约机器码中的所述账本调用指令;其中,所述账本调用指令的处理逻辑包括保存所述账本调用指令之后的第一条指令的地址、设置调用状态量和子程序返回。
在本申请实施例的一种实现方式中,所述保存所述智能合约机器码中处于所述账本调用指令之后的第一条指令的地址,可以包括:
将所述地址存储至内存空间;
在根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令之前,还可以包括:
从所述内存空间中读取所述地址。
本申请实施例的第二方面提供了一种智能合约调用账本的装置,包括:
合约机器码调用模块,用于调用并执行已完成编译的智能合约机器码;
地址保存模块,用于当执行到所述智能合约机器码中的账本调用指令时,保存所述智能合约机器码中处于所述账本调用指令之后的第一条指令的地址,并返回执行区块链平台机器码;
账本操作指令调用模块,用于调用并执行所述区块链平台机器码中预设的账本操作指令;
指令跳转模块,用于当执行完所述账本操作指令之后,根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令。
本申请实施例的第三方面提供了一种电子设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如本申请实施例的第一方面提供的智能合约调用账本的方法。
本申请实施例的第四方面提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如本申请实施例的第一方面提供的智能合约调用账本的方法。
本申请实施例的第五方面提供了一种计算机程序产品,当计算机程序产品在电子设备上运行时,使得电子设备执行如本申请实施例的第一方面提供的智能合约调用账本的方法。
可以理解的是,上述第二方面至第五方面的有益效果可以参见上述第一方面中的相关描述,在此不再赘述。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种智能合约调用账本的方法的流程图;
图2是本申请实施例提供的智能合约调用账本的方法在一个实际应用场景下的操作示意图;
图3是本申请实施例提供的一种智能合约调用账本的装置的结构示意图;
图4是本申请实施例提供的一种电子设备的示意图。
具体实施方式
以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本申请实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本申请。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本申请的描述。另外,在本申请说明书和所附权利要求书的描述中,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
在区块链技术领域中,为了提高智能合约的执行效率,通常会将智能合约编译成机器码。当编译成机器码的智能合约需要与区块链账本进行交互时,一般可以使用CALL机器指令来完成账本操作方法的调用。然而,如果区块链平台使用包含内存管理机制的语言(例如Golang)编写,由于存在内存管理机制的限制(即GC限制),会导致无法使用CALL机器指令来完成账本操作方法的调用。
有鉴于此,本申请实施例提供了一种智能合约调用账本的方法、装置、电子设备和存储介质,通过调用切换机器码的方式而不是使用CALL机器指令的方式,来实现智能合约对账本操作方法的调用,这种方法同样适用于使用包含内存管理机制的语言编写的区块链平台。关于本申请实施例更具体的技术实现细节,请参照下文所述的方法实施例。
请参阅图1,示出了本申请实施例提供的一种智能合约调用账本的方法,包括:
101、调用并执行已完成编译的智能合约机器码;
应当理解,本方法实施例的执行主体是区块链系统中的任意区块链节点。
首先,将智能合约编译成智能合约机器码,调用并执行该智能合约机器码。此时会从该智能合约机器码的指令列表的第一条指令开始,依次往下执行每条指令。另外,该智能合约机器码中包含用于操作区块链账本的账本调用指令,关于该账本调用指令的生成方式,可以参照下文。
在本申请实施例的一种实现方式中,在调用并执行已完成编译的智能合约机器码之前,还可以包括:
(1)获取智能合约的字节码;
(2)检测所述字节码中存在的用于操作账本的目标指令;
(3)将所述目标指令替换为指定指令,得到更新后的字节码;其中,所述指定指令的处理逻辑包括保存所述指定指令之后的第一条指令的地址、设置调用状态量和子程序返回;
(4)对所述更新后的字节码进行编译,得到所述智能合约机器码;其中,所述智能合约机器码中的所述账本调用指令由所述指定指令编译后得到。
在实施本方法实施例之前,需要将智能合约编译成机器码。首先,获取智能合约的字节码,并检测该字节码中存在的用于操作账本的目标指令,这里的目标指令可以理解为实现操作账本的处理逻辑的代码段;在找到字节码中的目标指令之后,将目标指令替换为具有特殊处理逻辑的指定指令,这里的特殊处理逻辑包括:保存指令之后的第一条指令的地址、设置调用状态量和子程序返回(例如使用RET机器指令);最后,对替换目标指令后的字节码(即更新后的字节码)进行编译,从而得到智能合约机器码,字节码中的指定指令在编译后即成为智能合约机器码中的账本调用指令。在对字节码进行编译的时候,具体可以解析字节码的全部方法体中需要调用账本的代码段(也即目标指令),然后将该代码段替换为上述特殊处理逻辑的指定指令。
在本申请实施例的另一种实现方式中,在调用并执行已完成编译的智能合约机器码之前,还可以包括:
(1)获取智能合约的字节码;
(2)检测所述字节码中存在的用于操作账本的目标指令;
(3)在将所述字节码编译成所述智能合约机器码的过程中,将所述目标指令编译成所述智能合约机器码中的所述账本调用指令;其中,所述账本调用指令的处理逻辑包括保存所述账本调用指令之后的第一条指令的地址、设置调用状态量和子程序返回。
在将智能合约编译成机器码的另一种实现方式中,首先还是获取智能合约的字节码,然后检测字节码中存在的用于操作账本的目标指令。接下来,不是针对字节码进行目标指令的替换,而是在将字节码编译成智能合约机器码的过程中,直接将目标指令编译成具有特殊处理逻辑的多条机器指令,也即成为智能合约机器码中的账本调用指令。这里的特殊处理逻辑同样包括:保存指令之后的第一条指令的地址、设置调用状态量和子程序返回。
进一步的,所述检测所述字节码中存在的用于操作账本的目标指令,可以包括:
针对所述字节码中的任意指令,若检测到所述任意指令中包含与操作账本相关的关键名称,则将所述任意指令确定为所述目标指令。
在智能合约的字节码中,用于操作账本的指令通常包含与操作账本相关的某些关键名称,因此可以利用这个特点从字节码中检测出目标指令。具体的,针对字节码中的任意指令,只要检测到其包含与操作账本相关的关键名称,则可以将其确定为目标指令。例如,在账本中写入一个状态值的方法包含关键名称“SetState”,因此可以将字节码中包含关键名称“SetState”的指令确定为目标指令。
在本申请实施例的一种实现方式中,所述调用并执行已完成编译的智能合约机器码,可以包括:
当执行到所述区块链平台机器码中的智能合约调用指令时,调用并执行所述智能合约机器码。
区块链节点在工作时执行的一般是区块链平台机器码,当执行到该区块链平台机器码中的智能合约调用指令时,会找到对应的智能合约,开始调用并执行对应的智能合约机器码。另外,区块链平台还会封装一些账本操作方法以供智能合约调用,这些账本操作方法最终以账本操作指令的形式成为区块链平台机器码中的一部分。
102、当执行到所述智能合约机器码中的账本调用指令时,保存所述智能合约机器码中处于所述账本调用指令之后的第一条指令的地址,并返回执行区块链平台机器码;
在执行智能合约机器码的过程中,如果执行到账本调用指令,则开始执行该账本调用指令对应的特殊处理逻辑(可参照前文),此时会保存智能合约机器码中处于该账本调用指令之后的第一条指令(也即下一条指令)的地址,然后切换回执行区块链平台机器码。
在本申请实施例的一种实现方式中,所述保存所述智能合约机器码中处于所述账本调用指令之后的第一条指令的地址,可以包括:
将所述地址存储至内存空间。
在保存智能合约机器码中处于账本调用指令之后的第一条指令的地址时,为了提高数据存取效率,可以将该地址保存到区块链节点的内存空间,例如Golang内存空间。
在本申请实施例的一种实现方式中,所述当执行到所述智能合约机器码中的账本调用指令时,还可以包括:
设置调用状态量为指定数值。
在前文所述的特殊处理逻辑中,还包括设置调用状态量,因此在执行智能合约机器码中的账本调用指令时,还可以设置一个调用状态量为指定数值。该调用状态量主要用于区块链节点判断智能合约机器码的调用返回状态,如果调用返回状态是账本调用,则可以进行账本操作;反之,如果调用返回状态不是账本调用,例如是智能合约执行完毕或者智能合约执行出错等状态,则可以进行其它相应的操作。例如,可以预设该调用状态量的取值与调用返回状态之间的对应关系,比如0对应账本调用、1对应操作区块链的其它对象、2对应智能合约执行完毕…,则在执行智能合约机器码中的账本调用指令时,会将该调用状态量设置为0。
103、调用并执行所述区块链平台机器码中预设的账本操作指令;
在返回执行区块链平台机器码后,可以调用并执行区块链平台机器码中预设的账本操作指令,也即调用区块链平台预先封装好的账本操作方法,对区块链账本进行操作,从而实现智能合约与区块链账本之间的交互。在返回执行区块链平台机器码时,可以直接开始调用账本操作指令,然而从智能合约机器码切换回区块链平台机器码也不代表一定需要进行账本操作(例如当智能合约机器码全部执行完毕时也会返回执行区块链平台机器码),为了提高逻辑处理的准确性,这里可以增加一个判断调用返回状态的步骤,此时需要利用前文所述的调用状态量。
在本申请实施例的一种实现方式中,所述调用并执行所述区块链平台机器码中预设的账本操作指令,可以包括:
(1)若检测到所述调用状态量为所述指定数值,则确定所述智能合约机器码的调用返回状态为账本调用;
(2)若所述智能合约机器码的调用返回状态为账本调用,则调用并执行所述区块链平台机器码中预设的账本操作指令。
区块链节点会检测调用状态量是否为指定数值,该指定数值与账本调用对应;如果调用状态量为该指定数值,则可以确定智能合约机器码的调用返回状态为账本调用,也即需要进行账本操作,此时调用并执行区块链平台机器码中预设的账本操作指令。反之,如果调用状态量不是该指定数值,则可以确定智能合约机器码的调用返回状态不是账本调用,此时不会调用账本操作指令,而是根据实际的调用返回状态执行相应的处理,例如如果确定的调用返回状态是智能合约执行出错,则可以执行相应的报错处理。
104、当执行完所述账本操作指令之后,根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令。
当执行完账本操作指令,也即调用账本操作方法完成对区块链账本的操作之后,需要返回智能合约机器码继续执行后面的指令,此时可以根据之前保存的地址,跳转至执行智能合约机器码中处于账本调用指令之后的第一条指令,也即账本调用指令的下一条指令。
在本申请实施例的一种实现方式中,在根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令之前,还可以包括:
从所述内存空间中读取所述地址。
如果在前面的步骤中将智能合约机器码中处于账本调用指令之后的第一条指令的地址保存在内存空间,则在跳转前需要从该内存空间中读取出该地址,然后再跳转至智能合约机器码中该地址指向的位置执行。
在本申请实施例的一种实现方式中,在根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令之后,还可以包括:
当执行完所述智能合约机器码的最后一条指令之后,返回执行所述区块链平台机器码中处于所述智能合约调用指令之后的第一条指令。
在跳转回智能合约机器码之后,会从账本调用指令之后的第一条指令开始依次往下执行,直至执行完智能合约机器码的最后一条指令。此时,表示智能合约的调用完成,区块链节点会返回执行区块链平台机器码,具体是从智能合约调用指令之后的第一条指令开始,依次往下执行。需要说明的是,在一个智能合约机器码中,可能存在多处账本调用指令,针对每处账本调用指令都可以采用上述相同的方式完成对区块链账本的操作。
在本申请实施例中,首先调用并执行已完成编译的智能合约机器码,当执行到该智能合约机器码中的账本调用指令时,保存该账本调用指令之后的第一条指令的地址,并返回执行区块链平台机器码;然后,调用并执行区块链平台机器码中预设的账本操作指令,也即调用账本操作方法实现智能合约与区块链账本之间的交互;最后,当执行完该账本操作指令之后,可以根据之前保存的地址,跳转至执行该智能合约机器码中处于该账本调用指令之后的第一条指令,从而继续完成对智能合约的调用。上述过程没有使用CALL机器指令,而是通过保存的指令地址,达到从智能合约机器码切换到区块链平台机器码,并从区块链平台机器码重新进入智能合约机器码的目的,也即通过调用切换机器码的方式实现了智能合约对账本操作方法的调用,这种方式适用于使用包含内存管理机制的语言编写的区块链平台。
为便于理解本申请实施例提供的智能合约调用账本的方法,以下列举一个实际的应用场景。
如图2所示,为本申请实施例提供的智能合约调用账本的方法在一个实际应用场景下的操作示意图。
图2的左下方为区块链平台机器码列表,其包含预设的账本操作指令列表和Native Call指令列表;其中,账本操作指令列表中记录用于对区块链账本进行操作的账本操作指令,Native Call指令列表中记录用于实现调用切换处理逻辑的指令。
示例性的,Native Call指令列表的处理逻辑对应的部分伪代码以及相应的注释如下:
entry:
{
nativecall(entryPoint,uintptr(unsafe.Pointer(enginContext)),modAddr)
//进入智能合约机器码执行,机器码可以操作enginContext代表的内存空间;
switch status:=enginContext.statusCode;status{
case callLedgerFunctionStatus:
//检查智能合约机器码执行的调用返回状态,对状态进行判断;如果是账本调用状态,则在此处进行账本调用操作;
…
…
//此处为省略的调用账本操作的方法代码;
goto entry
//调用账本操作的方法完成后,返回entry,即继续执行智能合约机器码;
case callNormalReturn:
//正常返回,表示智能合约执行完毕;
default:
//异常情况下的处理逻辑,理论上不会出现异常情况;如果出现智能合约执行出错等异常情况,则可以执行报错等处理逻辑;
}
}
通过上面的伪代码的处理逻辑,结合内存状态量的读取,可以实现对于智能合约机器码的进入与返回的控制,这里的进入指从区块链平台机器码切换至智能合约机器码,这里的返回指从智能合约机器码切换至区块链平台机器码。
图2的右下方为智能合约机器码列表,其中包含调用智能合约时执行的操作指令,这些操作指令中具有至少一处账本调用指令。图2的上方为区块链节点的Golang内存空间,可用于存取内存状态量。
图2中具有6个调用链,分别用数字1-6表示,以下分别进行说明:
1.区块链平台调用编译好的智能合约机器码;
2.智能合约机器码执行到操作账本的逻辑(即账本调用指令)时,保存调用状态量以及账本调用指令之后的第一条指令的地址到Golang内存空间,并返回区块链平台机器码;
3.Native Call指令列表的控制逻辑根据保存的调用状态量发现调用返回状态是账本调用,开始账本操作方法的调用;
4.账本操作方法执行完成后,返回控制逻辑;
5.控制逻辑重新进入智能合约机器码,此时根据从Golang内存空间中读取的指令地址,找到智能合约机器码的账本调用指令之后的执行位置;
6.智能合约机器码执行完毕,返回控制逻辑,至此智能合约的调用过程结束。
综上所述,本申请实施例通过调用切换机器码而不是使用CALL机器指令的方式,实现了智能合约对账本操作方法的调用,这种方式可适用于使用包含内存管理机制的语言编写的区块链平台。
应理解,上述各个实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
上面主要描述了一种智能合约调用账本的方法,下面将对一种智能合约调用账本的装置进行描述。
请参阅图3,本申请实施例中一种智能合约调用账本的装置的一个实施例包括:
合约机器码调用模块301,用于调用并执行已完成编译的智能合约机器码;
地址保存模块302,用于当执行到所述智能合约机器码中的账本调用指令时,保存所述智能合约机器码中处于所述账本调用指令之后的第一条指令的地址,并返回执行区块链平台机器码;
账本操作指令调用模块303,用于调用并执行所述区块链平台机器码中预设的账本操作指令;
指令跳转模块304,用于当执行完所述账本操作指令之后,根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令。
在本申请实施例的一种实现方式中,所述智能合约调用账本的装置还可以包括:
状态量设置模块,用于设置调用状态量为指定数值;
所述账本操作指令调用模块可以包括:
调用返回状态确定单元,用于若检测到所述调用状态量为所述指定数值,则确定所述智能合约机器码的调用返回状态为账本调用;
账本操作指令调用单元,用于若所述智能合约机器码的调用返回状态为账本调用,则调用并执行所述区块链平台机器码中预设的账本操作指令。
在本申请实施例的一种实现方式中,所述合约机器码调用模块可以包括:
合约机器码执行单元,用于当执行到所述区块链平台机器码中的智能合约调用指令时,调用并执行所述智能合约机器码。
进一步的,所述智能合约调用账本的装置还可以包括:
指令返回模块,用于当执行完所述智能合约机器码的最后一条指令之后,返回执行所述区块链平台机器码中处于所述智能合约调用指令之后的第一条指令。
在本申请实施例的一种实现方式中,所述智能合约调用账本的装置还可以包括:
第一字节码获取模块,用于获取智能合约的字节码;
第一目标指令检测模块,用于检测所述字节码中存在的用于操作账本的目标指令;
目标指令替换模块,用于将所述目标指令替换为指定指令,得到更新后的字节码;其中,所述指定指令的处理逻辑包括保存所述指定指令之后的第一条指令的地址、设置调用状态量和子程序返回;
第一字节码编译模块,用于对所述更新后的字节码进行编译,得到所述智能合约机器码;其中,所述智能合约机器码中的所述账本调用指令由所述指定指令编译后得到。
在本申请实施例的另一种实现方式中,所述智能合约调用账本的装置还可以包括:
第二字节码获取模块,用于获取智能合约的字节码;
第二目标指令检测模块,用于检测所述字节码中存在的用于操作账本的目标指令;
第二字节码编译模块,用于在将所述字节码编译成所述智能合约机器码的过程中,将所述目标指令编译成所述智能合约机器码中的所述账本调用指令;其中,所述账本调用指令的处理逻辑包括保存所述账本调用指令之后的第一条指令的地址、设置调用状态量和子程序返回。
进一步的,所述目标指令检测模块可以包括:
目标指令确定单元,用于针对所述字节码中的任意指令,若检测到所述任意指令中包含与操作账本相关的关键名称,则将所述任意指令确定为所述目标指令。
在本申请实施例的一种实现方式中,所述地址保存模块可以包括:
地址存储单元,用于将所述地址存储至内存空间;
所述智能合约调用账本的装置还可以包括:
地址读取模块,用于从所述内存空间中读取所述地址。
本申请实施例还提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述任一实施例所描述的智能合约调用账本的方法。
本申请实施例还提供一种计算机程序产品,当该计算机程序产品在电子设备上运行时,使得电子设备执行如上述任一实施例所描述的智能合约调用账本的方法。
图4是本申请一实施例提供的电子设备的示意图。如图4所示,该实施例的电子设备4包括:处理器40、存储器41以及存储在所述存储器41中并可在所述处理器40上运行的计算机程序42。所述处理器40执行所述计算机程序42时实现上述各个智能合约调用账本的方法的实施例中的步骤,例如图1所示的步骤101至104。或者,所述处理器40执行所述计算机程序42时实现上述各装置实施例中各模块/单元的功能,例如图3所示模块301至304的功能。
所述计算机程序42可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器41中,并由所述处理器40执行,以完成本申请。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述所述计算机程序42在所述电子设备4中的执行过程。
所称处理器40可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
所述存储器41可以是所述电子设备4的内部存储单元,例如电子设备4的硬盘或内存。所述存储器41也可以是所述电子设备4的外部存储设备,例如所述电子设备4上配备的插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)等。进一步地,所述存储器41还可以既包括所述电子设备4的内部存储单元也包括外部存储设备。所述存储器41用于存储所述计算机程序以及所述电子设备所需的其他程序和数据。所述存储器41还可以用于暂时地存储已经输出或者将要输出的数据。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的系统实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本申请实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括是电载波信号和电信信号。
以上所述实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围,均应包含在本申请的保护范围之内。
Claims (10)
1.一种智能合约调用账本的方法,其特征在于,包括:
调用并执行已完成编译的智能合约机器码;
当执行到所述智能合约机器码中的账本调用指令时,保存所述智能合约机器码中处于所述账本调用指令之后的第一条指令的地址,并返回执行区块链平台机器码;
调用并执行所述区块链平台机器码中预设的账本操作指令;
当执行完所述账本操作指令之后,根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令。
2.如权利要求1所述的方法,其特征在于,所述当执行到所述智能合约机器码中的账本调用指令时,还包括:
设置调用状态量为指定数值;
所述调用并执行所述区块链平台机器码中预设的账本操作指令,包括:
若检测到所述调用状态量为所述指定数值,则确定所述智能合约机器码的调用返回状态为账本调用;
若所述智能合约机器码的调用返回状态为账本调用,则调用并执行所述区块链平台机器码中预设的账本操作指令。
3.如权利要求1所述的方法,其特征在于,所述调用并执行已完成编译的智能合约机器码,包括:
当执行到所述区块链平台机器码中的智能合约调用指令时,调用并执行所述智能合约机器码。
4.如权利要求3所述的方法,其特征在于,在根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令之后,还包括:
当执行完所述智能合约机器码的最后一条指令之后,返回执行所述区块链平台机器码中处于所述智能合约调用指令之后的第一条指令。
5.如权利要求1所述的方法,其特征在于,在调用并执行已完成编译的智能合约机器码之前,还包括:
获取智能合约的字节码;
检测所述字节码中存在的用于操作账本的目标指令;
将所述目标指令替换为指定指令,得到更新后的字节码;其中,所述指定指令的处理逻辑包括保存所述指定指令之后的第一条指令的地址、设置调用状态量和子程序返回;
对所述更新后的字节码进行编译,得到所述智能合约机器码;其中,所述智能合约机器码中的所述账本调用指令由所述指定指令编译后得到。
6.如权利要求1所述的方法,其特征在于,在调用并执行已完成编译的智能合约机器码之前,还包括:
获取智能合约的字节码;
检测所述字节码中存在的用于操作账本的目标指令;
在将所述字节码编译成所述智能合约机器码的过程中,将所述目标指令编译成所述智能合约机器码中的所述账本调用指令;其中,所述账本调用指令的处理逻辑包括保存所述账本调用指令之后的第一条指令的地址、设置调用状态量和子程序返回。
7.如权利要求1至6任一项所述的方法,其特征在于,所述保存所述智能合约机器码中处于所述账本调用指令之后的第一条指令的地址,包括:
将所述地址存储至内存空间;
在根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令之前,还包括:
从所述内存空间中读取所述地址。
8.一种智能合约调用账本的装置,其特征在于,包括:
合约机器码调用模块,用于调用并执行已完成编译的智能合约机器码;
地址保存模块,用于当执行到所述智能合约机器码中的账本调用指令时,保存所述智能合约机器码中处于所述账本调用指令之后的第一条指令的地址,并返回执行区块链平台机器码;
账本操作指令调用模块,用于调用并执行所述区块链平台机器码中预设的账本操作指令;
指令跳转模块,用于当执行完所述账本操作指令之后,根据所述地址跳转至执行所述智能合约机器码中处于所述账本调用指令之后的第一条指令。
9.一种电子设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至7任一项所述的智能合约调用账本的方法。
10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述的智能合约调用账本的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211551574.9A CN116155934A (zh) | 2022-12-05 | 2022-12-05 | 智能合约调用账本的方法、装置、电子设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211551574.9A CN116155934A (zh) | 2022-12-05 | 2022-12-05 | 智能合约调用账本的方法、装置、电子设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116155934A true CN116155934A (zh) | 2023-05-23 |
Family
ID=86357352
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211551574.9A Pending CN116155934A (zh) | 2022-12-05 | 2022-12-05 | 智能合约调用账本的方法、装置、电子设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116155934A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116664129A (zh) * | 2023-07-28 | 2023-08-29 | 杭州趣链科技有限公司 | 区块链账本数据迭代方法、电子设备及可读存储介质 |
-
2022
- 2022-12-05 CN CN202211551574.9A patent/CN116155934A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116664129A (zh) * | 2023-07-28 | 2023-08-29 | 杭州趣链科技有限公司 | 区块链账本数据迭代方法、电子设备及可读存储介质 |
CN116664129B (zh) * | 2023-07-28 | 2023-11-10 | 武汉趣链数字科技有限公司 | 区块链账本数据迭代方法、电子设备及可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101699981B1 (ko) | 외래 정보를 분할함에 의한 가상 머신 코드의 메모리 최적화 | |
CN108563445B (zh) | 应用程序代码检测方法及服务器 | |
CN111967017B (zh) | 生成依赖关系的方法、装置、终端设备及存储介质 | |
CN108170465B (zh) | 一种版本信息管理方法、电子设备及可读存储介质 | |
US10579513B2 (en) | Test run control method and apparatus | |
CN111679852B (zh) | 一种冲突依赖库的检测方法及装置 | |
CN111767056B (zh) | 一种源码编译方法、可执行文件运行方法及终端设备 | |
CN103019787A (zh) | 函数调用关系确定方法、热补丁升级方法及装置 | |
CN115686631B (zh) | 一种基于知识基的随机指令生成方法、装置及存储介质 | |
US20220214882A1 (en) | Stack traces using shadow stack | |
CN116155934A (zh) | 智能合约调用账本的方法、装置、电子设备和存储介质 | |
CN113282487A (zh) | 编程语言调试方法、装置及终端设备 | |
US10747514B2 (en) | Reduced save and restore instructions for call-clobbered registers | |
CN114895935A (zh) | 刷写车辆ecu的方法、装置、电子设备及存储介质 | |
CN113238760B (zh) | 一种软件迁移方法、装置、计算设备及可读存储介质 | |
CN110990051A (zh) | 软件包依赖关系的维护方法、装置、介质和设备 | |
CN111352610A (zh) | 接口返回值修改方法、装置、电子设备及存储介质 | |
CN111880803A (zh) | 一种应用于多平台的软件构建方法及装置 | |
CN109324838B (zh) | 单片机程序的执行方法、执行装置及终端 | |
CN115033873A (zh) | 一种动态注入方法及装置 | |
CN115756484A (zh) | 预编译目标代码仓库确定方法及装置、存储介质 | |
US20060265687A1 (en) | Method for Finding a Function Call Stack in Run Time for a Computer System | |
CN110597536B (zh) | 一种软件升级方法、系统及终端设备 | |
CN114063982A (zh) | 一种基于多场景应用的自动构建功能组件的方法 | |
CN103235745A (zh) | 一种地址冲突检测方法及装置 |
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 |