本发明实施例涉及金融科技(fintech)领域,尤其涉及一种基于区块链的智能合约调用方法及装置。
背景技术:
随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技转变,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。
现阶段,外部智能合约调用主要是采用同步调用的方式执行外部智能合约的调用。即,调用者合约在需要调用外部智能合约时,会向宿主环境发起外部智能合约调用请求,以使宿主环境基于该外部智能合约请求创建一个新的虚拟机,并基于虚拟机执行被调用合约。此时,调用者合约需等待被调用合约执行完毕并获得被调用合约的返回值后才能执行后续步骤。然而,由于外部智能合约调用本身涉及宿主环境通信、虚拟机创建及外部智能合约自身的执行开销,因此采用同步调用的方式执行外部智能合约会导致外部智能合约的执行成本较大,并导致外部智能合约的执行效率低。
综上,目前亟需一种基于区块链的智能合约调用方法,用以提高外部智能合约调用的执行效率。
技术实现要素:
本发明实施例提供了一种基于区块链的智能合约调用方法及装置,用以提高外部智能合约调用的执行效率。
第一方面,本发明实施例提供了一种基于区块链的智能合约调用方法,包括:
宿主机接收第一虚拟机发送的异步智能合约调用请求,并向所述第一虚拟机发送调用响应;所述异步智能合约调用请求是所述第一虚拟机在执行第一智能合约中具有异步调用标识的第一调用语句产生的;所述第一调用语句用于调用第二智能合约;所述调用响应用于指示所述第一虚拟机继续执行所述第一智能合约;
所述宿主机创建用于执行所述异步智能合约调用请求的第二虚拟机;
所述宿主机将所述第二虚拟机执行所述异步智能合约调用请求得到的第一执行结果存储至所述第一虚拟机中。
上述技术方案中,通过接收第一虚拟机发送的异步智能合约调用请求,并向第一虚拟机发送调用响应;异步智能合约调用请求是第一虚拟机在执行第一智能合约中具有异步调用标识的第一调用语句产生的;第一调用语句用于调用第二智能合约;调用响应用于指示第一虚拟机继续执行所述第一智能合约。再创建用于执行异步智能合约调用请求的第二虚拟机,并将第二虚拟机执行异步智能合约调用请求得到的第一执行结果存储至第一虚拟机中。由于宿主机在接收到第一虚拟机发送的异步智能合约调用请求时,会立即向第一虚拟机发送调用响应,如此可以便于第一虚拟机无需等待异步智能合约调用请求的执行结果,而继续执行第一智能合约的后续步骤,从而可以提高外部智能合约调用的执行效率,并可以节省外部智能合约调用的执行成本,进而可以解决现有技术中采用同步调用的方式执行外部智能合约会导致智能合约的执行成本较大,并导致外部智能合约调用的执行效率低的问题。
可选地,所述方法还包括:
所述宿主机接收所述第一虚拟机发送的同步智能合约调用请求;所述同步智能合约调用请求是所述第一虚拟机在执行第一智能合约中具有同步调用标识的第二调用语句产生的,所述第二调用语句用于调用第三智能合约;
所述宿主机创建用于执行所述同步智能合约调用请求的第三虚拟机;
所述宿主机将所述第三虚拟机执行所述同步智能合约调用请求得到的第二执行结果作为所述调用响应发送给所述第一虚拟机。
上述技术方案中,在执行第一智能合约中具有同步调用标识的第二调用语句产生的同步智能合约调用请求时,第一智能合约中位于第二调用语句之后的一些步骤可能需要依赖同步智能合约调用请求的执行结果,但针对第一智能合约中位于第二调用语句之后的一些无需依赖同步智能合约调用请求的执行结果的步骤,则可以提前执行与同步智能合约调用请求的执行结果无关联的一些后续步骤,如此可以提高外部智能合约调用的执行效率。
可选地,所述异步智能合约调用请求包括插桩标识;
所述宿主机创建用于执行所述异步智能合约调用请求的第二虚拟机之前,还包括:
所述宿主机记录所述插桩标识的状态为未完成;
所述宿主机将所述第二虚拟机执行所述异步智能合约调用请求得到的第一执行结果存储至所述第一虚拟机中之后,还包括:
所述宿主机记录所述插桩标识的状态为已完成。
上述技术方案中,通过在创建第二虚拟机之前,设置并记录异步智能合约调用请求中插桩标识的状态为未完成,并在将执行异步智能合约调用请求得到的第一执行结果存储至第一虚拟机中之后,设置并记录异步智能合约调用请求中插桩标识的状态为已完成,如此可以便于宿主机及时准确地了解异步智能合约调用请求的执行状态,并可以为后续宿主机快速准确地检查第一虚拟机是否处于休眠状态提供支持。
可选地,所述向所述第一虚拟机发送调用响应之后,还包括:
所述第一虚拟机在执行所述第一智能合约中具有等待调用结果标识的程序语句时,生成等待调用指令;所述等待调用指令用于查找所述宿主机中具有所述程序语句对应的插桩标识的状态;
所述第一虚拟机在确定所述插桩标识的状态为未完成时,进入休眠状态。
上述技术方案中,通过基于等待调用指令查找宿主机中具有程序语句对应的插桩标识的状态,并根据插桩标识的状态可以快速准确地确定是否需要使第一虚拟机进入休眠状态。
可选地,所述宿主机将所述第二虚拟机执行所述异步智能合约调用请求得到的第一执行结果存储至所述第一虚拟机中之后,还包括:
所述宿主机确定所述第一虚拟机处于休眠状态,则唤醒所述第一虚拟机。
上述技术方案中,宿主机在确定第一虚拟机处于休眠状态时,可以基于异步智能合约调用请求的执行结果,及时地唤醒第一虚拟机。
可选地,异步调用标识是通过如下方式得到的:
针对所述第一智能合约中任一合约方法,若确定所述合约方法中第j条程序语句中包含智能合约的调用语句且存在用于存储所述调用语句的执行结果的暂存变量,则为所述第j条程序语句标注上所述异步调用标识和插桩标识j;并记录所述暂存变量;所述j为大于等于1的整数;
若确定第m条程序语句中使用所述暂存变量,则为所述第m条程序语句标注上等待调用结果标识和插桩标识j;所述第m条程序语句为所述合约方法中位于所述第j条程序语句之后的程序语句。
上述技术方案中,针对第一智能合约中任一合约方法,若确定合约方法中第j条程序语句中包含智能合约的调用语句且存在用于存储调用语句的执行结果的暂存变量,则可以及时准确地为第j条程序语句标注上异步调用标识和插桩标识,如此可以便于后续基于异步调用标识准确地执行对应的调用语句。
可选地,同步调用标识是通过如下方式得到的:
针对所述第一智能合约中任一合约方法,若确定所述合约方法中第k条程序语句中包含智能合约的调用语句且不存在用于存储所述调用语句的执行结果的暂存变量,则为所述第k条程序语句标注上所述同步调用标识。
上述技术方案中,针对第一智能合约中任一合约方法,若确定合约方法中第k条程序语句中包含智能合约的调用语句且不存在用于存储调用语句的执行结果的暂存变量,则可以及时准确地为第k条程序语句标注上同步调用标识,如此可以便于后续基于同步调用标识准确地执行对应的调用语句。
第二方面,本发明实施例还提供了一种基于区块链的智能合约调用装置,包括:
接收单元,用于接收第一虚拟机发送的异步智能合约调用请求,并向所述第一虚拟机发送调用响应;所述异步智能合约调用请求是所述第一虚拟机在执行第一智能合约中具有异步调用标识的第一调用语句产生的;所述第一调用语句用于调用第二智能合约;所述调用响应用于指示所述第一虚拟机继续执行所述第一智能合约;
处理单元,用于创建用于执行所述异步智能合约调用请求的第二虚拟机;将所述第二虚拟机执行所述异步智能合约调用请求得到的第一执行结果存储至所述第一虚拟机中。
可选地,所述处理单元还用于:
接收所述第一虚拟机发送的同步智能合约调用请求;所述同步智能合约调用请求是所述第一虚拟机在执行第一智能合约中具有同步调用标识的第二调用语句产生的,所述第二调用语句用于调用第三智能合约;
创建用于执行所述同步智能合约调用请求的第三虚拟机;
将所述第三虚拟机执行所述同步智能合约调用请求得到的第二执行结果作为所述调用响应发送给所述第一虚拟机。
可选地,所述异步智能合约调用请求包括插桩标识;
所述处理单元还用于:
所述宿主机记录所述插桩标识的状态为未完成;
所述处理单元还用于:
所述宿主机记录所述插桩标识的状态为已完成。
可选地,所述接收单元还用于:
在执行所述第一智能合约中具有等待调用结果标识的程序语句时,生成等待调用指令;所述等待调用指令用于查找所述宿主机中具有所述程序语句对应的插桩标识的状态;
在确定所述插桩标识的状态为未完成时,进入休眠状态。
可选地,所述处理单元还用于:
确定所述第一虚拟机处于休眠状态,则唤醒所述第一虚拟机。
可选地,所述处理单元具体用于:
针对所述第一智能合约中任一合约方法,若确定所述合约方法中第j条程序语句中包含智能合约的调用语句且存在用于存储所述调用语句的执行结果的暂存变量,则为所述第j条程序语句标注上所述异步调用标识和插桩标识j;并记录所述暂存变量;所述j为大于等于1的整数;
若确定第m条程序语句中使用所述暂存变量,则为所述第m条程序语句标注上等待调用结果标识和插桩标识j;所述第m条程序语句为所述合约方法中位于所述第j条程序语句之后的程序语句。
可选地,所述处理单元具体用于:
针对所述第一智能合约中任一合约方法,若确定所述合约方法中第k条程序语句中包含智能合约的调用语句且不存在用于存储所述调用语句的执行结果的暂存变量,则为所述第k条程序语句标注上所述同步调用标识。
第三方面,本发明实施例提供一种计算设备,包括:
存储器,用于存储计算机程序;
处理器,用于调用所述存储器中存储的计算机程序,按照获得的程序执行基于区块链的智能合约调用方法。
第四方面,本发明实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行程序,所述计算机可执行程序用于使计算机执行基于区块链的智能合约调用方法。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种系统架构的示意图;
图2为本发明实施例提供的一种基于区块链的智能合约调用方法的流程示意图;
图3为本发明实施例提供的一种桩插入的流程示意图;
图4为本发明实施例提供的一种桩编译的流程示意图;
图5为本发明实施例提供的一种执行异步外部合约调用指令的流程示意图;
图6为本发明实施例提供的一种执行等待结果调用指令的流程示意图;
图7为本发明实施例提供的一种基于区块链的智能合约调用装置的结构示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
下面首先对本发明实施例中涉及的部分用语进行解释说明,以便于本领域技术人员进行理解。
(1)智能合约:智能合约是运行在区块链系统之上的一份代码和数据的集合,其中代码负责实现智能合约的功能,数据负责存储智能合约状态,智能合约可以接收和发送信息。
(2)交易:在区块链中,任何操作(部署合约、调用合约接口等)都是通过发送交易的方式进行。交易由用户发起,并通过客户端发送至区块链节点。区块链节点在收到交易后,会将交易打包为区块并执行。
(3)虚拟机:在计算机科学中的体系结构里,是指一种特殊的软件,可以通过软件模拟具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,能提供物理计算机的功能,被设计用来在与平台无关的环境中执行计算机程序。在区块链领域,虚拟机用于建立智能合约的执行环境。
(4)宿主环境:虚拟机作为软件,必须要在真实的硬件上运行。在真实硬件上运行虚拟机地软件便称为宿主环境。宿主环境主要负责虚拟机的创建、调度,并为虚拟机提供访问外界环境的接口。
(5)合约地址:在区块链中,每个智能合约部署到链上后,会生成对应的地址用于标示该智能合约。通过交易调用智能合约的接口时,需要提供合约地址。
(6)外部合约调用:在区块链上,有些功能通常无法通过一个智能合约完成,这时便会将所需要使用到的功能分拆为多个智能合约并分别部署至区块链上,当需要调用某一功能时,直接调用该功能对应的智能合约,此时称这种调用为外部合约调用。
(7)字节码:通常指的是已经经过编译,但与特定机器代码无关,需要解释器转译后才能成为机器代码的中间代码。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。字节码主要为了实现特定软件运行和软件环境、与硬件环境无关。字节码的实现方式是通过编译器和虚拟机。编译器将源码编译成字节码,特定平台上的虚拟机将字节码转译为可以直接运行的指令。
(8)代码插桩:是在保证程序原有逻辑完整性的基础上,对程序源代码进行词法分析及语法分析,并在某些特殊位置将一些代码注入到源代码中,从而自动为程序实现特定的功能。通俗来说,插桩就是将一段代码通过某种策略插入到另一段代码,或替换另一段代码。这里的代码可以分为源码和字节码,而我们所说的插桩一般指字节码插桩。
如上介绍了本发明实施例中涉及的部分用语,下面对本发明实施例涉及的技术特征进行介绍。
为了便于理解本发明实施例,首先以图1中示出的系统架构为例说明适用于本发明实施例的智能合约调用系统架构。该智能合约调用系统架构可以应用于区块链各智能合约间的调用等,在实际应用场景中,本发明对此并不作限定。如图1所示,该系统架构可以为服务器100,包括处理器110、通信接口120和存储器130。
其中,通信接口120用于与终端设备进行通信,收发该终端设备传输的信息,实现通信。
处理器110是服务器100的控制中心,利用各种接口和线路连接整个服务器100的各个部分,通过运行或执行存储在存储器130内的软件程序/或模块,以及调用存储在存储器130内的数据,执行服务器100的各种功能和处理数据。可选地,处理器110可以包括一个或多个处理单元。
存储器130可用于存储软件程序以及模块,处理器110通过运行存储在存储器130的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器130可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等;存储数据区可存储根据业务处理所创建的数据等。此外,存储器130可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
需要说明的是,上述图1所示的结构仅是一种示例,本发明实施例对此不做限定。
基于上述描述,图2示例性的示出了本发明实施例提供的一种基于区块链的智能合约调用方法的流程,该流程可以由基于区块链的智能合约调用装置执行。
如图2所示,该流程具体包括:
步骤201,宿主机接收第一虚拟机发送的异步智能合约调用请求,并向所述第一虚拟机发送调用响应。
步骤202,所述宿主机创建用于执行所述异步智能合约调用请求的第二虚拟机。
步骤203,所述宿主机将所述第二虚拟机执行所述异步智能合约调用请求得到的第一执行结果存储至所述第一虚拟机中。
上述步骤201中,第一虚拟机在执行第一智能合约中具有异步调用标识的第一调用语句时产生异步智能合约调用请求,其中,第一调用语句用于调用第二智能合约。再将该异步智能合约调用请求发送给宿主机,同时宿主机在接收到第一虚拟机发送的异步智能合约调用请求时,会立即向第一虚拟机发送调用响应,以便第一虚拟机继续执行第一智能合约。如此可以便于第一虚拟机无需等待异步智能合约调用请求的执行结果,而继续执行第一智能合约的后续步骤,从而可以提高外部智能合约调用的执行效率,并可以节省外部智能合约调用的执行成本。其中,对于异步调用标识,可以通过下述方式生成得到:针对第一智能合约中任一合约方法,若确定合约方法中第j条程序语句中包含智能合约的调用语句且存在用于存储调用语句的执行结果的暂存变量,则为第j条程序语句标注上异步调用标识和插桩标识j,并记录暂存变量,如此可以便于后续基于异步调用标识准确地执行对应的调用语句。若确定第m条程序语句中使用暂存变量,则为第m条程序语句标注上等待调用结果标识和插桩标识j,如此可以便于后续基于等待调用结果标识准确地执行对应的调用语句。其中,j为大于等于1的整数;第m条程序语句为合约方法中位于第j条程序语句之后的程序语句。
上述步骤202中,在宿主机创建用于执行异步智能合约调用请求的第二虚拟机之前,宿主机会设置并记录异步智能合约调用请求中插桩标识的状态为未完成,并在将第二虚拟机执行异步智能合约调用请求得到的第一执行结果存储至第一虚拟机中之后,会设置并记录异步智能合约调用请求中插桩标识的状态为已完成。如此可以便于宿主机及时准确地了解异步智能合约调用请求的执行状态,并可以为后续宿主机快速准确地检查第一虚拟机是否处于休眠状态提供支持。
上述步骤203中,宿主机根据异步外部智能合约调用请求中的外部合约地址从对应的外部智能合约中获取外部合约字节码,并基于第二虚拟机执行该外部合约字节码,在执行完毕后,将异步外部智能合约调用请求的第一执行结果存储至第一虚拟机中。
需要说明的是,第一虚拟机在执行第一智能合约中具有同步调用标识的第二调用语句时产生同步智能合约调用请求,其中,第二调用语句用于调用第三智能合约。再将该同步智能合约调用请求发送给宿主机,以便宿主机基于该同步智能合约调用请求创建用于执行同步智能合约调用请求的第三虚拟机。宿主机根据同步智能合约调用请求中的外部合约地址从对应的外部智能合约中获取外部合约字节码,并基于第二虚拟机执行该外部合约字节码,在执行完毕后,将同步智能合约调用请求的第二执行结果存储至第一虚拟机中。由于在执行第一智能合约中具有同步调用标识的第二调用语句产生的同步智能合约调用请求时,第一智能合约中位于第二调用语句之后的一些步骤可能需要依赖同步智能合约调用请求的执行结果,但针对第一智能合约中位于第二调用语句之后的一些无需依赖同步智能合约调用请求的执行结果的步骤,则可以提前执行与同步智能合约调用请求的执行结果无关联的一些后续步骤,如此可以提高外部智能合约调用的执行效率。
其中,对于同步调用标识,可以通过下述方式生成得到:针对第一智能合约中任一合约方法,若确定合约方法中第k条程序语句中包含智能合约的调用语句且不存在用于存储调用语句的执行结果的暂存变量,则为第k条程序语句标注上同步调用标识,如此可以便于后续基于同步调用标识准确地执行对应的调用语句。其中,k为大于等于1的整数。
现有技术中,在执行外部合约调用时采用了同步的方式,即调用者合约在调用外部合约时,必须要等待被调用合约执行完毕并获得被调用合约的返回值后才能继续向下执行。如此,针对调用者合约在等待被调用合约的执行结果时,有些不依赖该执行结果的计算无法提前执行。例如,调用者合约中存在如下逻辑:a、调用外部合约x,获取一个特定的哈希值,并将结果存入变量x。b、计算变量y的哈希值。c、比较x与y的大小。由此可以看出,第b步的计算并不依赖第a步中的结果,因而其本应该能够在等待第a步的结果时提前执行,然而同步的外部合约调用方式使得第b步的执行不得不先等待第a步执行完成,如此会导致外部合约调用执行的效率下降。此外,需要说明的是,当调用者合约中存在连续多个彼此间无依赖的外部合约调用时,所有外部合约调用将会以完全串行的方式进行,由于外部合约调用本身涉及宿主环境通信、虚拟机创建及外部合约自身的执行开销,因此使得同步的外部合约调用方式的执行成本较大,并导致同步的外部合约调用方式的执行效率低。
基于此,本发明实施例提供一种基于区块链的智能合约调用方法。当智能合约执行过程需要调用外部合约调用时,调用者合约无需等待被调用合约执行完毕后才能继续向下执行,而是能够在等待被调用合约执行结束的同时,提前执行和外部合约执行结果无关的逻辑,从而可以提升合约的整体执行效率。
具体地,本发明实施例为执行智能合约的虚拟机设计了额外两条指令,即,异步外部合约调用指令call_async<id>和等待结果调用指令await<id>。其中,id为一个整数标识符,用于表示某次外部合约调用;call_async<id>表示异步执行代号为id的外部合约调用;await<id>则表示等待调用代号为id的外部合约调用的结果。需要说明的是,call_async<id>指令的执行方式与call指令类似。两者不同的是,当宿主环境在接收到调用者合约的虚拟机在执行智能合约中call_async<id>指令产生的异步外部合约调用请求时,会将执行权立即返回至执行调用者合约的虚拟机,同时启动额外的线程创建新的虚拟机以执行外部合约。由于call_async<id>指令会立即返回,调用者合约可以继续向下执行,直到必须要依赖外部合约调用结果时,执行await<id>指令将自身挂起,等待宿主环境将外部合约执行结果返回。在外部合约执行完毕并将执行结果返回至宿主环境时,宿主环境将执行结果写入指定的存储区域中,并唤醒执行调用者合约的虚拟机,从而使得调用者合约能够继续向下执行。
此外,本发明实施例还设计一种智能合约编译器的自动插桩方法。在将智能合约编译为字节码的过程中,以合约中的方法为单位,遍历方法中的程序语句。若程序语句中包含外部合约调用语句,则根据是否将外部合约调用结果暂存在某个暂存变量中,来判断是否需要立即使用外部合约调用结果。若需要立即使用外部合约调用结果,则在该程序语句前插入一个表示“同步调用”的桩,否则在该程序语句前插入一个表示“异步调用”的桩。当能够异步调用外部合约时,记录下暂存变量的名称,遍历后续程序语句,若第一次遇到某条程序语句中使用了同名的暂存变量,则该程序语句前插入一个表示“等待调用结果”的桩。智能合约编译器在编译合约时,若遇到“同步调用”桩,则编译生成call指令;若遇到“异步调用”桩,则编译生成call_async<id>指令;若遇到“等待调用结果”桩,则编译生成await<id>指令。这种自动插桩方法能够使得异步的外部合约调用方式对用户是完全透明的,用户完全无需改动原有代码。
有鉴于此,下面对本发明实施例中智能合约调用的实施过程进行具体描述。
step1:桩插入。
参考图3,图3为本发明实施例提供的一种桩插入的流程示意图。通过对用户编写的智能合约进行自动分析,并在程序语句中插入相应的桩,以便指导智能合约编译器将智能合约中的外部合约调用编译为异步形式。其中,桩插入的具体过程为:
(1)读取用户编写的智能合约。
(2)依次读取智能合约中合约方法。
(3)初始化变量i为1。
(4)检查i是否大于合约方法的总数。若是,则跳转至(20);否则跳转至(5)。
(5)依次读取第i个合约方法中的程序语句。
(6)初始化变量j为1。
(7)检查j是否大于当前方法中的程序语句总数。若是,则跳转至(19);否则跳转至(8)。
(8)检查第j条程序语句中是否包含外部合约调用语句。若是,则跳转至(9);否则跳转至(18)。
(9)检查是否将外部合约调用的结果暂存在某个暂存变量中。若是,则跳转至(11);否则跳转至(10)。
(10)在第j条程序语句前插入“同步调用”桩,跳转至(18)。
(11)在第j条程序语句前插入“异步调用”桩,桩中包含一个id字段,令其值为j。
(12)记录用于暂存外部合约调用结果的暂存变量名。
(13)初始化变量k为j 1。
(14)检查k是否大于当前方法中的程序语句总数。若是,则跳转至(18);否则跳转至(15)。
(15)检查第k条程序语句中是否使用了同名暂存变量。若是,则跳转至(16);否则跳转至(17)。
(16)在第k条程序语句前插入“等待调用结果”桩,桩中包含一个id字段,令其值为j。
(17)k=k 1,跳转至(14)。
(18)j=j 1,跳转至(7)。
(19)i=i 1,跳转至(4)。
(20)结束。
step2:桩编译。
参考图4,图4为本发明实施例提供的一种桩编译的流程示意图。智能合约编译器通过基于程序语句中插入的桩,将智能合约中的外部合约调用编译为异步形式。其中,桩编译的具体过程为:
(1)读取经过插桩后的智能合约代码。
(2)依次读入智能合约代码中的所有程序语句。
(3)初始化变量i等于1。
(4)检查i是否大于智能合约代码中程序语句的数量。若是,则跳转至(14);否则跳转至(5)。
(5)检查第i条程序语句是否为“同步调用”桩。若是,则跳转至(6);否则跳转至(7)。
(6)生成call指令,跳转至(13)。
(7)检查第i条程序语句是否为“异步调用”桩。若是,则跳转至(8);否则跳转至(10)。
(8)取出桩中的id字段。
(9)生成call_async<id>指令,跳转至(13)。
(10)检查第i条程序语句是否为“等待调用结果”桩。若是,则跳转至(1);否则跳转至(13)。
(11)取出桩中的id字段。
(12)生成await<id>指令。
(13)i=i 1,跳转至(4)。
(14)结束。
step3:执行异步外部合约调用指令call_async<id>。
参考图5,图5为本发明实施例提供的一种执行异步外部合约调用指令的流程示意图。调用者合约的虚拟机在执行智能合约中异步外部合约调用指令时产生异步外部合约调用请求,并向宿主环境发送异步外部合约调用请求,以便宿主环境对异步外部合约调用请求进行处理。其中,执行异步外部合约调用指令的具体过程为:
(1)调用者合约的虚拟机将调用参数进行编码并存放于虚拟机的内存中某个位置。
(2)调用者合约的虚拟机分配一片内存区域,用于存放外部合约的返回值。
(3)调用者合约的虚拟机向宿主环境发起异步外部合约调用请求,异步外部合约调用请求包括id、外部合约地址、编码后的调用参数所在内存起始地址、编码后的调用参数的长度以及用于存放返回值的内存起始地址。
(4)宿主环境接收异步外部合约调用请求。
(5)宿主环境从异步外部合约调用请求解析出id、外部合约地址、编码后的调用参数所在内存起始地址、编码后的调用参数的长度以及用于存放返回值的内存起始地址。
(6)宿主环境创建标识符为id的承诺,并将其状态设置为“未完成”。
(7)宿主环境将执行权返回至发起异步外部合约调用请求的虚拟机。
(8)宿主环境根据外部合约地址调取外部合约字节码。
(9)宿主环境启动新线程,创建虚拟机并执行外部合约字节码。
(10)被调用合约执行完毕后,将执行结果返回至宿主环境。
(11)宿主环境关闭执行外部合约的虚拟机。
(12)宿主环境将执行结果写入执行调用者合约的虚拟机中。
(13)宿主环境将标识符为id的承诺的状态设置为“已完成”。
(14)宿主环境检查执行调用者合约的虚拟机是否处于休眠状态。若是,则跳转至(15);否则跳转至(16)。
(15)宿主环境唤醒执行调用者合约的虚拟机。
(16)结束。
step4:执行等待结果调用指令await<id>。
参考图6,图6为本发明实施例提供的一种执行等待结果调用指令的流程示意图。调用者合约的虚拟机在执行到必须要依赖外部合约调用结果的程序语句时,会执行await<id>指令将自身挂起,等待宿主环境将外部合约执行结果返回。并在外部合约执行完毕将执行结果返回至宿主环境时,唤醒执行调用者合约的虚拟机,从而使得调用者合约能够继续向下执行。其中,执行等待结果调用指令的具体过程为:
(1)调用者合约的虚拟机检查宿主环境中标识符为id的承诺的状态是否为“已完成”。若是,则跳转至(4);否则跳转至(2)。
(2)调用者合约的虚拟机让自身进入休眠状态,等待被宿主环境唤醒。
(3)调用者合约的虚拟机被宿主环境唤醒,跳转至(1)。
(4)结束。
需要说明的是,当调用者合约的虚拟机在执行到同步外部合约调用指令call指令时,会生成同步智能合约调用请求,并将同步智能合约调用请求发送给宿主环境,以便宿主环境对同步智能合约调用请求进行处理。其中,执行同步外部合约调用指令的具体过程为:
a、调用者合约会首先将调用参数进行编码并将编码后的调用参数存放于内存中某个位置,再指定一片内存区域,用于之后存放外部合约的返回值。然后,调用者合约通过虚拟机执行call指令,向宿主环境发起同步外部合约调用请求,同步外部合约调用请求中包括外部合约地址、编码后的调用参数所在内存起始地址、编码后的调用参数的长度以及用于存放返回值的内存起始地址。
b、宿主环境接收到同步外部合约调用请求后,会创建一个新的虚拟机。再根据同步外部合约调用请求中的外部合约地址查找被调用合约的字节码并载入。然后宿主环境向新虚拟机中传入调用者合约传递的编码后的调用参数,新虚拟机开始执行被调用合约的字节码。
c、当被调用合约执行完毕后,被调用合约将返回值的内存地址及长度返回至宿主环境,宿主环境根据返回值的内存地址及长度获取被调用合约传出的返回值,并将返回值写入同步外部合约调用请求中所指定的、用于存放返回值的内存区域。然后宿主环境关闭执行被调用合约的虚拟机,并将执行权返回至调用者合约所在的虚拟机,此时外部合约调用流程结束。
上述实施例表明,通过接收第一虚拟机发送的异步智能合约调用请求,并向第一虚拟机发送调用响应;异步智能合约调用请求是第一虚拟机在执行第一智能合约中具有异步调用标识的第一调用语句产生的;第一调用语句用于调用第二智能合约;调用响应用于指示第一虚拟机继续执行所述第一智能合约。再创建用于执行异步智能合约调用请求的第二虚拟机,并将第二虚拟机执行异步智能合约调用请求得到的第一执行结果存储至第一虚拟机中。由于宿主机在接收到第一虚拟机发送的异步智能合约调用请求时,会立即向第一虚拟机发送调用响应,如此可以便于第一虚拟机无需等待异步智能合约调用请求的执行结果,而继续执行第一智能合约的后续步骤,从而可以提高外部智能合约调用的执行效率,并可以节省外部智能合约调用的执行成本,进而可以解决现有技术中采用同步调用的方式执行外部智能合约会导致智能合约的执行成本较大,并导致外部智能合约调用的执行效率低的问题。
基于相同的技术构思,图7示例性的示出了本发明实施例提供的一种基于区块链的智能合约调用装置,该装置可以执行基于区块链的智能合约调用方法的流程。
如图7所示,该装置包括:
接收单元701,用于接收第一虚拟机发送的异步智能合约调用请求,并向所述第一虚拟机发送调用响应;所述异步智能合约调用请求是所述第一虚拟机在执行第一智能合约中具有异步调用标识的第一调用语句产生的;所述第一调用语句用于调用第二智能合约;所述调用响应用于指示所述第一虚拟机继续执行所述第一智能合约;
处理单元702,用于创建用于执行所述异步智能合约调用请求的第二虚拟机;将所述第二虚拟机执行所述异步智能合约调用请求得到的第一执行结果存储至所述第一虚拟机中。
可选地,所述处理单元702还用于:
接收所述第一虚拟机发送的同步智能合约调用请求;所述同步智能合约调用请求是所述第一虚拟机在执行第一智能合约中具有同步调用标识的第二调用语句产生的,所述第二调用语句用于调用第三智能合约;
创建用于执行所述同步智能合约调用请求的第三虚拟机;
将所述第三虚拟机执行所述同步智能合约调用请求得到的第二执行结果作为所述调用响应发送给所述第一虚拟机。
可选地,所述异步智能合约调用请求包括插桩标识;
所述处理单元702还用于:
所述宿主机记录所述插桩标识的状态为未完成;
所述处理单元702还用于:
所述宿主机记录所述插桩标识的状态为已完成。
可选地,所述接收单元701还用于:
在执行所述第一智能合约中具有等待调用结果标识的程序语句时,生成等待调用指令;所述等待调用指令用于查找所述宿主机中具有所述程序语句对应的插桩标识的状态;
在确定所述插桩标识的状态为未完成时,进入休眠状态。
可选地,所述处理单元702还用于:
确定所述第一虚拟机处于休眠状态,则唤醒所述第一虚拟机。
可选地,所述处理单元702具体用于:
针对所述第一智能合约中任一合约方法,若确定所述合约方法中第j条程序语句中包含智能合约的调用语句且存在用于存储所述调用语句的执行结果的暂存变量,则为所述第j条程序语句标注上所述异步调用标识和插桩标识j;并记录所述暂存变量;所述j为大于等于1的整数;
若确定第m条程序语句中使用所述暂存变量,则为所述第m条程序语句标注上等待调用结果标识和插桩标识j;所述第m条程序语句为所述合约方法中位于所述第j条程序语句之后的程序语句。
可选地,所述处理单元702具体用于:
针对所述第一智能合约中任一合约方法,若确定所述合约方法中第k条程序语句中包含智能合约的调用语句且不存在用于存储所述调用语句的执行结果的暂存变量,则为所述第k条程序语句标注上所述同步调用标识。
基于相同的技术构思,本发明实施例提供一种计算设备,包括:
存储器,用于存储计算机程序;
处理器,用于调用所述存储器中存储的计算机程序,按照获得的程序执行基于区块链的智能合约调用方法。
基于相同的技术构思,本发明实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机可执行程序,所述计算机可执行程序用于使计算机执行基于区块链的智能合约调用方法。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rok、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
1.一种基于区块链的智能合约调用方法,其特征在于,包括:
宿主机接收第一虚拟机发送的异步智能合约调用请求,并向所述第一虚拟机发送调用响应;所述异步智能合约调用请求是所述第一虚拟机在执行第一智能合约中具有异步调用标识的第一调用语句产生的;所述第一调用语句用于调用第二智能合约;所述调用响应用于指示所述第一虚拟机继续执行所述第一智能合约;
所述宿主机创建用于执行所述异步智能合约调用请求的第二虚拟机;
所述宿主机将所述第二虚拟机执行所述异步智能合约调用请求得到的第一执行结果存储至所述第一虚拟机中。
2.如权利要求1所述的方法,其特征在于,所述方法还包括:
所述宿主机接收所述第一虚拟机发送的同步智能合约调用请求;所述同步智能合约调用请求是所述第一虚拟机在执行第一智能合约中具有同步调用标识的第二调用语句产生的,所述第二调用语句用于调用第三智能合约;
所述宿主机创建用于执行所述同步智能合约调用请求的第三虚拟机;
所述宿主机将所述第三虚拟机执行所述同步智能合约调用请求得到的第二执行结果作为所述调用响应发送给所述第一虚拟机。
3.如权利要求1所述的方法,其特征在于,所述异步智能合约调用请求包括插桩标识;
所述宿主机创建用于执行所述异步智能合约调用请求的第二虚拟机之前,还包括:
所述宿主机记录所述插桩标识的状态为未完成;
所述宿主机将所述第二虚拟机执行所述异步智能合约调用请求得到的第一执行结果存储至所述第一虚拟机中之后,还包括:
所述宿主机记录所述插桩标识的状态为已完成。
4.如权利要求1所述的方法,其特征在于,所述向所述第一虚拟机发送调用响应之后,还包括:
所述第一虚拟机在执行所述第一智能合约中具有等待调用结果标识的程序语句时,生成等待调用指令;所述等待调用指令用于查找所述宿主机中具有所述程序语句对应的插桩标识的状态;
所述第一虚拟机在确定所述插桩标识的状态为未完成时,进入休眠状态。
5.如权利要求1所述的方法,其特征在于,所述宿主机将所述第二虚拟机执行所述异步智能合约调用请求得到的第一执行结果存储至所述第一虚拟机中之后,还包括:
所述宿主机确定所述第一虚拟机处于休眠状态,则唤醒所述第一虚拟机。
6.如权利要求1至5任一项所述的方法,其特征在于,异步调用标识是通过如下方式得到的:
针对所述第一智能合约中任一合约方法,若确定所述合约方法中第j条程序语句中包含智能合约的调用语句且存在用于存储所述调用语句的执行结果的暂存变量,则为所述第j条程序语句标注上所述异步调用标识和插桩标识j;并记录所述暂存变量;所述j为大于等于1的整数;
若确定第m条程序语句中使用所述暂存变量,则为所述第m条程序语句标注上等待调用结果标识和插桩标识j;所述第m条程序语句为所述合约方法中位于所述第j条程序语句之后的程序语句。
7.如权利要求6所述的方法,其特征在于,同步调用标识是通过如下方式得到的:
针对所述第一智能合约中任一合约方法,若确定所述合约方法中第k条程序语句中包含智能合约的调用语句且不存在用于存储所述调用语句的执行结果的暂存变量,则为所述第k条程序语句标注上所述同步调用标识。
8.一种基于区块链的智能合约调用装置,其特征在于,包括:
接收单元,用于接收第一虚拟机发送的异步智能合约调用请求,并向所述第一虚拟机发送调用响应;所述异步智能合约调用请求是所述第一虚拟机在执行第一智能合约中具有异步调用标识的第一调用语句产生的;所述第一调用语句用于调用第二智能合约;所述调用响应用于指示所述第一虚拟机继续执行所述第一智能合约;
处理单元,用于创建用于执行所述异步智能合约调用请求的第二虚拟机;将所述第二虚拟机执行所述异步智能合约调用请求得到的第一执行结果存储至所述第一虚拟机中。
9.一种计算设备,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于调用所述存储器中存储的计算机程序,按照获得的程序执行权利要求1至7任一项所述的方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机可执行程序,所述计算机可执行程序用于使计算机执行权利要求1至7任一项所述的方法。
技术总结