在区块链中部署、查询和执行智能合约的方法及装置转让专利

申请号 : CN202110745674.4

文献号 : CN113220704B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 张磊郭学鹏

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

摘要 :

本说明书实施例中提供了一种在区块链中部署、查询和执行智能合约的方法及装置。部署智能合约的方法包括:获取智能合约的合约数据,以及获取智能合约的独立于所述合约数据的描述信息;创建合约文件,合约文件包括合约数据和描述信息;向区块链中的区块链节点发送用于部署智能合约的第一交易,第一交易中包括合约文件。

权利要求 :

1.一种在区块链中部署智能合约的方法,应用于终端,包括:获取智能合约的合约数据,以及获取所述智能合约的独立于所述合约数据的描述信息,所述描述信息包括所述智能合约的编译信息,所述合约数据中包括至少两个可执行程序,所述编译信息包括以下各项信息中的一项或多项:获得所述合约数据中的每个可执行程序时各自使用的编译器的类型、获得所述合约数据中的每个可执行程序时各自使用的编译器的版本;

创建合约文件,所述合约文件包括所述合约数据和所述描述信息;

向所述区块链中的区块链节点发送用于部署所述智能合约的第一交易,所述第一交易中包括所述合约文件。

2.根据权利要求1所述的方法,其中,所述描述信息还包括以下各项信息中的至少一项:所述合约文件的文件类型以及所述智能合约的版本号。

3.根据权利要求1所述的方法,其中,所述合约文件中在不同字段分别包括所述合约数据和所述描述信息。

4.根据权利要求1至3中任一所述的方法,其中,获取智能合约的合约数据,包括:对所述智能合约的源文件进行编译,获得可执行程序作为所述智能合约的合约数据。

5.根据权利要求4所述的方法,其中,所述合约文件包括辅助段和程序段,所述辅助段包括所述描述信息,所述程序段包括所述可执行程序。

6.根据权利要求1至3中任一所述的方法,其中,获取智能合约的合约数据,包括:通过至少两个不同类型和/或版本的编译器分别对所述智能合约的源文件进行编译,获得至少两个可执行程序作为所述智能合约的合约数据。

7.根据权利要求6所述的方法,其中,所述合约文件包括文件头和所述至少两个可执行程序各自对应的分段,所述文件头包括所述描述信息中的用于指示所述至少两个可执行程序的数量的分段指示,每个所述分段包括信息字段和程序字段,所述程序字段中包括对应的可执行程序,所述信息字段中包括所述描述信息中的所述对应的可执行程序的描述信息。

8.根据权利要求7所述的方法,其中,所述对应的可执行程序的描述信息还包括以下各项信息中的至少一项:分段编号、所述对应的可执行程序的长度。

9.一种在区块链中查询智能合约的方法,所述区块链的状态数据库中存储有所述智能合约的合约文件,所述合约文件中包括独立于合约数据的描述信息,所述合约数据中包括至少两个可执行程序,所述描述信息包括所述智能合约的编译信息,所述编译信息包括以下各项信息中的一项或多项:获得所述合约数据中的每个可执行程序时各自使用的编译器的类型、获得所述合约数据中的每个可执行程序时各自使用的编译器的版本,所述方法应用于所述区块链中的区块链节点,包括:响应于终端的查询所述智能合约的第一信息的请求,获取所述描述信息中的第一信息;

向所述终端返回所述第一信息。

10.一种在区块链中执行智能合约的方法,所述区块链的状态数据库中存储有所述智能合约的合约文件,所述合约文件包括合约数据和独立于所述合约数据的描述信息,所述合约数据包括通过至少两个不同类型和/或版本的编译器分别对智能合约源文件进行编译所获得的至少两个可执行程序,所述描述信息包括所述智能合约的编译信息,所述编译信息包括以下各项信息中的一项或多项:获得所述合约数据中的每个可执行程序时各自使用的编译器的类型、获得所述合约数据中的每个可执行程序时各自使用的编译器的版本,所述方法应用于所述区块链中的区块链节点,所述方法包括:响应于调用所述智能合约的第三交易,基于所述描述信息和所述区块链节点中允许执行的可执行程序的类型,从所述至少两个可执行程序中选择第一可执行程序;

获取所述第一可执行程序;

执行所述第一可执行程序。

11.一种在区块链中部署智能合约的方法,应用于终端,包括:获取智能合约的合约数据,所述合约数据包括所述智能合约的描述信息以及至少两个可执行程序,所述描述信息包括所述智能合约的编译信息,所述编译信息包括以下各项信息中的一项或多项:获得所述合约数据中的每个可执行程序时各自使用的编译器的类型、获得所述合约数据中的每个可执行程序时各自使用的编译器的版本;

向所述区块链中的区块链节点发送用于部署所述智能合约的第一交易,所述第一交易包括所述合约数据,所述智能合约用于在执行时返回所述描述信息。

12.一种在区块链中查询智能合约的方法,所述方法应用于所述区块链中的区块链节点,包括:

响应于调用所述智能合约的第三交易,获取所述区块链节点中存储的所述智能合约的合约数据,所述合约数据包括所述智能合约的描述信息以及至少两个可执行程序,所述描述信息包括所述智能合约的编译信息,所述编译信息包括以下各项信息中的一项或多项:获得所述合约数据中的每个可执行程序时各自使用的编译器的类型、获得所述合约数据中的每个可执行程序时各自使用的编译器的版本;

基于所述合约数据执行所述智能合约,以向终端发送所述智能合约的描述信息。

13.一种在区块链中部署智能合约的装置,所述装置部署在终端,包括:信息获取单元,配置为获取智能合约的合约数据,以及获取所述智能合约的独立于所述合约数据的描述信息,所述描述信息包括所述智能合约的编译信息,所述合约数据中包括至少两个可执行程序,所述编译信息包括以下各项信息中的一项或多项:获得所述合约数据中的每个可执行程序时各自使用的编译器的类型、获得所述合约数据中的每个可执行程序时各自使用的编译器的版本;

合约创建单元,配置为创建合约文件,所述合约文件包括所述合约数据和所述描述信息;

交易发送单元,配置为向所述区块链中的区块链节点发送用于部署所述智能合约的第一交易,所述第一交易中包括所述合约文件。

14.一种在区块链中查询智能合约的装置,所述区块链的状态数据库中存储有所述智能合约的合约文件,所述合约文件中包括独立于合约数据的描述信息,所述合约数据中包括至少两个可执行程序,所述描述信息包括所述智能合约的编译信息,所述编译信息包括以下各项信息中的一项或多项:获得所述合约数据中的每个可执行程序时各自使用的编译器的类型、获得所述合约数据中的每个可执行程序时各自使用的编译器的版本,所述装置部署在所述区块链中的区块链节点,包括:信息查询单元,配置为响应于终端的查询所述智能合约的第一信息的请求,获取所述描述信息中的第一信息;

信息返回单元,配置为向所述终端返回所述第一信息。

15.一种在区块链中执行智能合约的装置,所述区块链的状态数据库中存储有所述智能合约的合约文件,所述合约文件包括合约数据和独立于所述合约数据的描述信息,所述合约数据包括通过至少两个不同类型和/或版本的编译器分别对智能合约源文件进行编译所获得的至少两个可执行程序,所述描述信息包括所述智能合约的编译信息,所述编译信息包括以下各项信息中的一项或多项:获得所述合约数据中的每个可执行程序时各自使用的编译器的类型、获得所述合约数据中的每个可执行程序各自使用的编译器的版本,所述装置部署在所述区块链中的区块链节点,所述装置包括:程序选择单元,配置为响应于调用所述智能合约的第三交易,基于所述描述信息和所述区块链节点中允许执行的可执行程序的类型,从所述至少两个可执行程序中选择第一可执行程序;

程序获取单元,配置为获取所述第一可执行程序;

程序执行单元,配置为执行所述第一可执行程序。

16.一种在区块链中部署智能合约的装置,所述装置部署在终端,包括:信息获取单元,配置为获取智能合约的合约数据,所述合约数据包括所述智能合约的描述信息以及至少两个可执行程序,所述描述信息包括所述智能合约的编译信息,所述编译信息包括以下各项信息中的一项或多项:获得所述合约数据中的每个可执行程序时各自使用的编译器的类型、获得所述合约数据中的每个可执行程序各自使用的编译器的版本;

交易发送单元,配置为向所述区块链中的区块链节点发送用于部署所述智能合约的第一交易,所述第一交易包括所述合约数据,所述智能合约用于在执行时返回所述描述信息。

17.一种在区块链中查询智能合约的装置,所述装置部署在所述区块链中的区块链节点,包括:

信息查询单元,配置为响应于调用所述智能合约的第三交易,获取所述区块链节点中存储的所述智能合约的合约数据,所述合约数据包括所述智能合约的描述信息以及至少两个可执行程序,所述描述信息包括所述智能合约的编译信息,所述编译信息包括以下各项信息中的一项或多项:获得所述合约数据中的每个可执行程序时各自使用的编译器的类型、获得所述合约数据中的每个可执行程序时各自使用的编译器的版本;

合约执行单元,配置为基于所述合约数据执行所述智能合约,以向终端发送所述智能合约的描述信息。

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

19.一种计算设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时,实现权利要求1‑12中任一项所述的方法。

说明书 :

在区块链中部署、查询和执行智能合约的方法及装置

技术领域

[0001] 本说明书一个或多个实施例涉及计算机领域,尤其涉及一种在区块链中部署、查询和执行智能合约的方法及装置。

背景技术

[0002] 终端可对部署到区块链上的智能合约进行调用,使区块链中的区块链节点执行该智能合约以实现预定事务,例如接收符合预定条件的输入参数、按照预定的处理逻辑结合
输入参数执行处理逻辑。
[0003] 智能合约被部署到区块链之后,用户可能期望通过获知该智能合约的描述信息,对该智能合约进行某些特定的处理,例如对智能合约进行更新。
[0004] 因此,希望有一种新的技术方案,以期使用户能够更加方便的查询智能合约的描述信息。

发明内容

[0005] 本说明书一个或多个实施例中提供了一种在区块链中部署、查询和执行智能合约的方法及装置。
[0006] 第一方面,提供了一种在区块链中部署智能合约的方法,所述方法应用于终端。所述方法包括:获取智能合约的合约数据,以及获取所述智能合约的独立于所述合约数据的
描述信息;创建合约文件,所述合约文件包括所述合约数据和所述描述信息;向所述区块链
中的区块链节点发送用于部署所述智能合约的第一交易,所述第一交易中包括所述合约文
件。由于已发布至区块链的智能合约的合约文件中同时包含智能合约的描述信息和合约数
据,当用户需要查询智能合约的描述信息时,可以通过相应的终端从智能合约的合约文件
中方便快捷的查询到智能合约的描述信息;而且,有利于实现在区块链节点无需执行智能
合约的情况下,支持终端对智能合约的描述信息进行查询。
[0007] 第二方面,提供了一种在区块链中查询智能合约的方法,所述区块链的状态数据库中存储有所述智能合约的合约文件,所述合约文件中包括独立于合约数据的描述信息,
所述方法应用于所述区块链中的区块链节点。所述方法包括:响应于终端的查询所述智能
合约的第一信息的请求,获取所述描述信息中的第一信息;向所述终端返回所述第一信息。
[0008] 第三方面,提供了一种在区块链中执行智能合约的方法,所述区块链的状态数据库中存储有所述智能合约的合约文件,所述合约文件包括合约数据和独立于所述合约数据
的描述信息,所述合约数据包括通过至少两个不同类型和/或版本的编译器分别对智能合
约源文件进行编译所获得的至少两个可执行程序,所述方法应用于所述区块链中的区块链
节点。所述方法包括:响应于调用所述智能合约的第三交易,基于所述描述信息和所述区块
链节点中允许执行的可执行程序的类型,从所述至少两个可执行程序中选择第一可执行程
序;获取所述第一可执行程序;执行所述第一可执行程序。智能合约的合约文件中包括通过
多个不同类型和/或版本的编译器编译得到的可执行程序,区块链节点可以选择性的执行
某个特定的可执行程序来完成对智能合约的执行,有利于支持同一区块链中的不同区块链
节点的差异化,比如支持同一区块链中的不同区块链节点各自具有执行不同文件类型的可
执行程序的能力。
[0009] 第四方面,提供了一种在区块链中部署智能合约的方法,应用于终端。所述方法包括:获取智能合约的合约数据,所述合约数据包括所述智能合约的描述信息;向所述区块链
中的区块链节点发送用于部署所述智能合约的第一交易,所述第一交易包括所述合约数
据,所述智能合约用于在执行时返回所述描述信息。通过将智能合约的合约文件直接嵌入
到智能合约的合约数据中,当用户需要查询智能合约的描述信息时,即可通过相应的终端
调用智能合约,使执行智能合约的区块链节点通过对智能合约的执行,完成向终端返回智
能合约的合约数据中所包含的智能合约的描述信息。
[0010] 第五方面,提供了一种在区块链中查询智能合约的方法,所述方法应用于所述区块链中的区块链节点。所述方法包括:响应于调用所述智能合约的第三交易,获取所述区块
链节点中存储的所述智能合约的合约数据,所述合约数据包括所述智能合约的描述信息;
基于所述合约数据执行所述智能合约,以向终端发送所述智能合约的描述信息。
[0011] 第六方面,提供了一种在区块链中部署智能合约的装置,所述装置部署在终端。所述装置包括:信息获取单元,配置为获取智能合约的合约数据,以及获取所述智能合约的独
立于所述合约数据的描述信息;合约创建单元,配置为创建合约文件,所述合约文件包括所
述合约数据和所述描述信息;交易发送单元,配置为向所述区块链中的区块链节点发送用
于部署所述智能合约的第一交易,所述第一交易中包括所述合约文件。
[0012] 第七方面,提供了一种在区块链中查询智能合约的装置,所述区块链的状态数据库中存储有所述智能合约的合约文件,所述合约文件中包括独立于合约数据的描述信息,
所述装置部署在所述区块链节点。所述装置包括:信息查询单元,配置为响应于终端的查询
所述智能合约的第一信息的请求,获取所述描述信息中的第一信息;信息返回单元,配置为
向所述终端返回所述第一信息。
[0013] 第八方面,提供了一种在区块链中执行智能合约的装置,所述区块链的状态数据库中存储有所述智能合约的合约文件,所述合约文件包括合约数据和独立于所述合约数据
的描述信息,所述合约数据包括通过至少两个不同类型和/或版本的编译器分别对智能合
约源文件进行编译所获得的至少两个可执行程序,所述装置部署在所述区块链中的区块链
节点。所述装置包括:程序选择单元,配置为响应于调用所述智能合约的第三交易,基于所
述描述信息和所述区块链节点中允许执行的可执行程序的类型,从所述至少两个可执行程
序中选择第一可执行程序;程序获取单元,配置为获取所述第一可执行程序;合约执行单
元,配置为执行所述第一可执行程序。
[0014] 第九方面,提供了一种在区块链中部署智能合约的装置,所述装置部署在终端。所述装置包括:信息获取单元,配置为获取智能合约的合约数据,所述合约数据包括所述智能
合约的描述信息;交易发送单元,配置为向所述区块链中的区块链节点发送用于部署所述
智能合约的第一交易,所述第一交易包括所述合约数据,所述智能合约用于在执行时返回
所述描述信息。
[0015] 第十方面,提供了一种在区块链中查询智能合约的装置,所述装置部署在所述区块链中的区块链节点。所述装置包括:信息查询单元,配置为响应于调用所述智能合约的第
三交易,获取所述区块链节点中存储的所述智能合约的合约数据,所述合约数据包括所述
智能合约的描述信息;合约执行单元,配置为基于所述合约数据执行所述智能合约,以向终
端发送所述智能合约的描述信息。
[0016] 第十一方面,提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算设备中执行时,计算设备执行以上各方面中任一项所述的方法。
[0017] 第十二方面,提供了一种计算设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序,实现以上各方面中任一项所述的方法。

附图说明

[0018] 为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于
本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它
的附图。
[0019] 图1为本说明书实施例中提供的技术方案的系统框架;
[0020] 图2为本说明书实施例中提供的一种在区块链中部署智能合约的方法的流程示意图;
[0021] 图3为智能合约的合约文件的数据结构示意图;
[0022] 图4为本说明书实施例中提供的一种在区块链中查询智能合约的方法的流程示意图;
[0023] 图5为本说明书实施例中提供的一种在区块链中执行智能合约的方法的流程示意图;
[0024] 图6为本说明书实施例中提供的另一种在区块链中部署智能合约的方法的流程示意图;
[0025] 图7为本说明书实施例中提供的另一种在区块链中查询智能合约的方法的流程示意图;
[0026] 图8为本说明书实施例中提供的一种在区块链中部署智能合约的装置的示意图;
[0027] 图9为本说明书实施例中提供的一种在区块链中查询智能合约的装置的示意图;
[0028] 图10为本说明书实施例中提供的一种在区块链中执行智能合约的装置的示意图;
[0029] 图11为本说明书实施例中提供的另一种在区块链中部署智能合约的装置的示意图;
[0030] 图12为本说明书实施例中提供的另一种在区块链中查询智能合约的装置的示意图。

具体实施方式

[0031] 下面结合附图,对本说明书所提供的各个非限制性实施例进行详细描述。
[0032] 图1为本说明书实施例中提供的技术方案的系统框架图。如图1所示,区块链10包括多个区块链节点101。终端102可与区块链节点101建立通信连接,或者终端102可以作为
区块链节点101加入区块链网络10。用户可通过终端102进行与区块链10相关的各项业务,
例如在区块链10中部署智能合约、查询智能合约的描述信息以及调用智能合约等。
[0033] 图2为本说明书实施例中提供的一种在区块链中发布智能合约的方法的流程图。其中,该方法可以由终端102执行,该方法中所述的区块链可以是区块链10,该方法可以包
括如下步骤201至步骤203。
[0034] 首先,在步骤201,获取智能合约的合约数据,以及获取所述智能合约的独立于所述合约数据的描述信息。
[0035] 在一个较为具体的示例中,可以通过单个特定类型和/或版本的编译器对智能合约的源文件进行编译,获得单个可执行程序作为智能合约的合约数据;或者,通过多个不同
类型和/或版本的编译器分别对智能合约的源文件进行编译,获得多个可执行程序作为智
能合约的合约数据。
[0036] 前述示例中的合约数据还可以包括智能合约的源文件,或者该智能合约的源文件还可以独立的作为智能合约的合约数据。也就是说,合约数据可以包括用于执行智能合约
的代码数据,其包括的具体内容可以由用户结合具体的业务场景进行灵活配置。在一个较
为具体的示例中,智能合约的描述信息可以包括智能合约的版本号,以及后续即将创建的
合约文件的文件类型。
[0037] 当合约数据包含一个或多个可执行程序时,智能合约的描述信息还可以包括编译信息;其中,该编译信息可以包括以下各项信息中一项或多项:获得每个可执行程序时各自
使用的编译器的类型和/或版本、每个可执行程序各自对应的编译时间。
[0038] 此外,智能合约的描述信息还可以包括合约数据中的可执行程序的数量、每个可执行程序各自在合约文件中对应的分段编号以及每个可执行程序各自的长度等信息中的
一项或多项。
[0039] 接着,在步骤202,创建合约文件,所述合约文件包括所述合约数据和所述描述信息。
[0040] 合约文件中在不同字段分别包括智能合约的合约数据和描述信息。通过将合约数据和描述信息置于合约文件的不同字段下,有利于在需要从合约文件中查询合约数据或描
述信息时,快速实现对合约数据或描述信息的查询。
[0041] 在一个较为具体的示例中,智能合约的合约数据包括单个可执行程序时,合约文件可以包括程序段和辅助段;其中该程序段中包括该可执行程序,该辅助段中包括智能合
约的描述信息。举例来说,单个可执行程序可以是编码方式为WebAssembly(简称WASM)的可
执行程序,包含该可执行程序的合约文件的文件类型记为WASM;文件类型为WASM的合约文
件包括程序段和作为辅助段的自定义部分(custom section),编码方式为WASM的可执行程
序位于程序段,智能合约的描述信息位于作为辅助段的自定义部分。
[0042] 在一个较为具体的示例中,智能合约的合约数据包括一个或多个可执行程序时,合约文件可以包括文件头和每个可执行程序各自对应的分段,每个分段包括信息字段和程
序字段。
[0043] 该示例中,文件头中可以包括分段指示,分段指示用于指示合约数据所包括的可执行程序的数量,同时还用于指示合约文件中包含的分段的数量。此外,文件头中还可以包
括智能合约的版本号以及合约文件的文件类型。
[0044] 该示例中,对于合约文件中包括的任一分段,该分段的程序字段中包括其对应的可执行程序,该分段的信息字段中包括其对应的可执行程序的描述信息。其中,可执行程序
的描述信息属于智能合约的描述信息,可执行程序的描述信息具体可以包括以下各项信息
中的一项或多项:可执行程序在合约文件中对应的分段编号、可执行程序的长度,以及获得
可执行程序时使用的编译器的类型和/或版本。
[0045] 举例来说,通过两个不同类型和/或版本的编译器分别对智能合约的源文件进行编译,获得包含可执行程序1以及可执行程序2的合约数据,同时假定可执行程序1对应的分
段编号为1、可执行程序2对应的分段编号为2,则步骤202中具体可以创建具有如图3所示数
据结构的合约文件。请参考图3,智能合约的描述信息中,合约文件的文件类型、智能合约的
版本号以及合约数据包含的可执行程序的数量(即分段指示)位于文件头中;智能合约的描
述信息中,可执行程序1的描述信息位于分段1所包括的信息字段1中、可执行程序1位于分
段1所包括的程序字段1中,可执行程序2的描述信息位于分段2所包括的信息字段2中、可执
行程序2位于分段2所包括的程序字段2中。
[0046] 需要说明的是,包含文件头和若干分段的合约文件还可以具有其它数据结构,例如同一个分段中所包含的信息字段和程序字段相连续。
[0047] 接着,在步骤203,向所述区块链中的区块链节点发送用于部署所述智能合约的第一交易,所述第一交易中包括所述合约文件。
[0048] 终端可以向其连接的区块链节点发送用于部署智能合约的第一交易,接收到第一交易的区块链节点可以向其连接的相邻区块链节点发送该第一交易。区块链中的任一区块
链节点,还可以在第一交易被打包到新的区块之后,执行第一交易,并基于执行结果生成和
存储该新的区块,该存储的新的区块中包括所述第一交易。其中,在执行第一交易的过程
中,部署该智能合约,具体包括为该智能合约分配合约地址,并将合约文件保存在用于保存
世界状态的状态数据库中与该合约地址对应的存储,从而完成对该智能合约的部署。其中,
在所述状态数据库中,例如通过键‑值对的形式将合约地址和合约文件关联地存储。
[0049] 通过前述步骤201至步骤203完成在区块链中部署智能合约后,用户可以通过终端查询已部署到区块链中的智能合约的描述信息。
[0050] 图4为本说明书实施例中提供的一种在区块链中查询智能合约的方法的流程图。其中,该方法可以由区块链10中的任一区块链节点101执行,区块链10的状态数据库中存储
有智能合约的合约文件,合约文件中包括独立于合约数据的描述信息,该方法可以包括如
下步骤401至步骤403。
[0051] 在步骤401,获取来自终端的查询智能合约的第一信息的请求。
[0052] 在步骤402,获取描述信息中的第一信息。
[0053] 当用户期望查询智能合约的描述信息时,可以通过终端向其连接的区块链节点发送用于查询智能合约的请求,例如发送请求查询智能合约的第一信息的第二交易,接收到
第二交易的区块链节点可将第二交易转发至其连接的相邻区块链节点。相应的,执行步骤
401和步骤402的区块链节点具体可以从终端或者其连接的相邻区块链节点接收第二交易。
[0054] 例如,通过终端发起的查询智能合约的第二交易格式如下:
[0055] Transaction (Tx)
[0056] From: Bob(0xf5e…)
[0057] To: SC (0x34Bas…)
[0058] Data: {getSCinformation()}
[0059] 上述例子中,Bob发起第二交易,即交易的发起方from字段是Bob的账户地址(由0xf5e…表示)。该交易是调用合约的交易,由交易的to字段指明调用的智能合约的地址(由
0x34Bas…表示)。部署的智能合约中,提供了getSCinformation()接口,即可以提供对该
智能合约的描述信息的查询。
[0060] 具体的,在getSCinformation()接口的调用中,可以指明查询的合约信息的类型,例如查询版本号、文件类型,以及编译信息等,这些可以通过在getSCinformation()接口
通过参数来指明。例如,通过在getSCinformation()接口通过参数指明查询的是编译信
息,则区块链节点响应该调用合约的查询请求时,可以获得诸如可执行程序使用的编译器
的类型和/或版本、可执行程序的编译时间等,这些信息将会作为第一信息返回给发起查询
的终端。在一种实施方式中,区块链节点可从状态数据库中读取智能合约的合约文件,从合
约文件中获取第一信息。在另一种实施方式中,区块链节点的内存中缓存有所述智能合约
的合约文件,区块链节点可从内存中读取所述合约文件。在另一种实施方式中,如参考图3
所示,在该智能合约的合约文件具有预定字段,其中例如包括信息字段或者程序字段,不同
的信息字段对应于不同的描述信息,因此,区块链节点可根据合约文件的格式,从状态数据
库或内存中直接读取需要的信息,而不需要读取整个合约文件。需要说明的是,将返回给终
端的第一信息还可以包括其它信息,例如还可以包括:合约数据包括的可执行程序的数量、
每个可执行程序各自在合约文件中对应的分段编号以及每个可执行程序各自的长度等信
息中的一项或多项。
[0061] 或者,前述示例的第二交易中,Data字段中可以无需包括其它参数。区块链节点在接收到To字段包括智能合约的地址,并且Data字段并未包含其它参数的交易时,即可将该
交易确定为用于查询相应智能合约的交易,然后基于To字段的合约地址将相应智能合约的
描述信息全部作为待返回的第一信息。
[0062] 再或者,终端可以向相连接的区块链节点发起本地交易(也称为localtransaction),这类交易适用于不对区块链的世界状态发生改变的情形,因此一般适
用于查询交易。这类本地交易的特点是不需要经过共识,执行结果也不会被收录进区块中。
[0063] 接着,在步骤403,向所述终端返回所述第一信息。
[0064] 一般的,终端向相连接的区块链节点发起调用合约/查询合约的请求,以查询合约中的相关信息时,可以保持与相连区块链节点的长连接,从而该相连区块链节点可以通过
该保持的长连接返回查询结果至所述终端。
[0065] 此外,区块链节点接收到终端发来的查询请求后,可以将查询结果设置在该交易对应的收据中。进而,终端可以监听区块链收据信息,例如通过对特定主题的topic进行监
听,从而在监听到符合自身预期topic的收据时,获得该收据。进而,终端可以从获得的收据
中解析出其中包含的查询结果。
[0066] 当终端请求查询的第一信息是智能合约的完整的描述信息时,区块链节点可以将智能合约的合约文件发送到终端;例如区块链节点在接收到前述示例的Data字段未包括其
它参数的第二交易时,可以将包含描述信息的合约文件完整的发送到终端。终端可以基于
合约文件的数据结构对合约文件进行解析,实现从合约文件中提取智能合约的描述信息,
并且向用户展示智能合约的描述信息,使用户能够获知智能合约的描述信息。其中,仍然以
合约文件具有如图3所示的数据结构为例,终端从合约文件中提取智能合约的描述信息具
体可以包括:从文件头中提取合约文件的文件类型、智能合约的版本号和分段指示,从分段
1包含的信息字段1中提取可执行程序1的描述信息,从分段2包含的信息字段2中提取可执
行程序2的描述信息。这样,开发者可以基于查询的智能合约的描述进行某些特定的业务,
比如基于描述信息中包含的智能合约的版本号以及编译信息,在更新智能合约的过程中增
加或减少通过某些编译器编译得到的可执行程序、增加智能合约的版本号等。
[0067] 通过前述步骤201至步骤203完成在区块链中部署智能合约后,用户还可以通过终端调用已部署到区块链中的智能合约。
[0068] 图5为本说明书实施例中提供的一种在区块链中执行智能合约的方法的流程图。其中,该方法由区块链10中的任一区块链节点101执行,区块链10的状态数据库中存储有智
能合约的合约文件,合约文件包括所述智能合约的合约数据和独立于所述合约数据的描述
信息,所述合约数据包括通过至少两个不同类型和/或版本的编译器分别对智能合约源文
件进行编译所获得的至少两个可执行程序,该方法可以包括如下步骤501至步骤503。
[0069] 首先,在步骤501,获取用于调用所述智能合约的第三交易。
[0070] 当用户期望调用该智能合约时,可以通过终端向其连接的区块链节点发送用于调用智能合约的第三交易,接收到第三交易的区块链节点可将第三交易转发至其连接的相邻
区块链节点。相应的,执行步骤501的区块链节点具体可以从终端或者其连接的相邻区块链
节点接收第三交易。
[0071] 接着,在步骤502,响应于所述第三交易,基于所述描述信息和所述区块链节点中允许执行的可执行程序的类型,从所述至少两个可执行程序中选择第一可执行程序。
[0072] 接着,在步骤503,获取所述第一可执行程序,并执行所述第一可执行程序。
[0073] 当合约文件存储于区块链节点的非易失性存储器中而未被加载到内存时,通常需要由区块链节点将合约文件完整的加载的内存中,然后从已加载到内存的合约文件中按需
选择可执行程序。当合约文件已经加载到内存时,则可以直接从已加载到内存的合约文件
中按需选择可执行程序。
[0074] 不同的可执行程序及其描述信息可以位于合约文件包含的不同分段中。与之相应的,区块链节点可以根据其自身允许执行的可执行程序的类型,确定出包含区块链节点所
允许执行的可执行程序的描述信息的信息字段,其中可执行程序的类型例如通过编译得到
该可执行程序时所使用的编译器的类型和/或版本进行描述;然后选择与该信息字段属于
相同分段的程序字段中的可执行程序作为待执行的第一可执行程序;最后从与该信息字段
属于相同分段的程序字段中读取第一可执行程序,并执行其读取的第一可执行程序。
[0075] 仍然以合约文件具有如图3所示的数据结构为例,并且假设:可执行程序1的文件类型是“.class”,可执行程序1的描述信息中包括获得可执行程序1时使用的编译器的类型
和/或版本,其能够指示可执行程序1的文件类型是“.class”;可执行程序2的文件类型是
“.wasm”,可执行程序2的描述信息中包括获得可执行程序2时使用的编译器的类型和/或版
本,其能够指示可执行程序2的文件类型是“.wasm”。如果区块链节点能够执行文件类型是
“.wasm”的可执行程序,则其可以将其自身允许执行的可执行程序的类型,与信息字段1和
信息字段2中的信息进行匹配,从而基于匹配结果从与信息字段2属于相同分段的程序字段
2中读取可执行程序2,并执行可执行程序2。
[0076] 图6为本说明书实施例中提供的另一种在区块链中部署智能合约的方法的流程图。其中,该方法可以由终端102执行,该方法中所述的区块链可以包括区块链10,该方法可
以包括如下步骤601和步骤602。
[0077] 首先,在步骤601,获取智能合约的合约数据,所述合约数据包括所述智能合约的描述信息。
[0078] 在创建智能合约的源文件时,可以在智能合约的源文件中嵌入智能合约的描述信息。智能合约的合约数据可以是智能合约的源文件,也可以是通过编译器对智能合约的源
文件进行编译以获得的可执行程序。
[0079] 智能合约的描述信息可以包括智能合约的版本号,还可以包括智能合约的编译信息。其中,智能合约的编译信息可以包括但不限于:获得合约数据时所使用的编译器的类型
和/或版本,以及编译时间。
[0080] 接着,在步骤602,向所述区块链中的区块链节点发送用于部署所述智能合约的第一交易,所述第一交易包括所述合约数据,所述智能合约用于在执行时返回所述描述信息。
[0081] 通过前述步骤601和步骤602完成在区块链中部署智能合约后,用户可通过终端调用已部署的智能合约,使得区块链节点执行所述智能合约并且由执行该智能合约的区块链
节点向终端返回智能合约的描述信息。
[0082] 图7为本说明书实施例中提供的一种在区块链中查询智能合约的方法的流程示意图。其中,该方法由区块链10中的任一区块链节点101执行,区块链节点10中部署有智能合
约,该方法包括如下步骤701和步骤703。
[0083] 首先,在步骤701,获取用于调用所述智能合约的第三交易。
[0084] 接着,在步骤702,响应于所述第三交易,获取所述区块链节点中存储的所述智能合约的合约数据,所述合约数据包括所述智能合约的描述信息。
[0085] 第三交易的接收字段可以包括智能合约的合约地址,区块链节点可以基于该合约地址从其维护的世界状态中获取该合约地址关联的合约数据。
[0086] 接着,在步骤703,基于所述合约数据执行所述智能合约,以向终端发送所述智能合约的描述信息。
[0087] 区块链节点基于合约数据执行智能合约时,至少实现向调用智能合约的终端返回智能合约的描述信息,还可以实现用户期望实现的其它预定事务。
[0088] 在一个较为具体的示例中,合约数据包括用于在智能合约被执行时实现预定事务的第一合约代码,以及包括用于在智能合约被执行时实现向调用智能合约的终端返回描述
信息的第二合约代码;其中描述信息可以嵌入在第二合约代码中。与此相应的,区块链节点
基于合约数据执行智能合约可以包括:通过执行第一合约代码实现预定事务,以及通过执
行第二合约代码实现向终端返回描述信息;或者,第三交易的数据字段包括用于指示需调
用的代码为第二合约代码的指示信息,区块链节点基于该指示信息的指示执行第二合约代
码,以实现向终端返回描述信息。
[0089] 在一种实现方式中,所述智能合约中包括与第一合约代码对应的第一函数和与第二合约代码对应的第二函数,第三交易中通过调用该智能合约的第二函数,从而使得在执
行第三交易的过程中执行所述智能合约的第二合约代码,以向终端返回描述信息。
[0090] 例如,通过终端发起的调用智能合约的第三交易格式如下:
[0091] Transaction (Tx)
[0092] From: Bob(0xf5e…)
[0093] To: SC (0x34Bas…)
[0094] Data: {getSCinformation()}
[0095] 上述例子中,Bob发起第二交易,即交易的发起方from字段是Bob的账户地址(由0xf5e…表示)。该交易是调用合约的交易,由交易的to字段指明被查询的智能合约的地址
(由0x34Bas…表示),部署的智能合约中,通过getSCinformation()接口(即第二函数)提
供对该智能合约的描述信息的查询。
[0096] 具体地,在getSCinformation()接口中,可以通过在相应的参数指明查询的合约信息的类型,例如查询版本号、文件类型,以及编译信息等。例如,在getSCinformation()
接口中通过相应的参数指明查询的是编译信息,则区块链节点想应该调用合约的交易时,
可以获得诸如可执行程序使用的编译器的类型和/或版本、可执行程序的编译时间等,并返
回给发起查询的终端。需要说明的是,向终端返回的信息还可以包括其它信息,例如还可以
包括:合约数据包括的可执行程序的数量、每个可执行程序各自在合约文件中对应的分段
编号以及每个可执行程序各自的长度等信息中的一项或多项。
[0097] 与前述方法实施例基于相同的构思,本说明书实施例中还提供了一种在区块链中部署智能合约的装置,该装置部署在终端中。如图8所示,该装置包括:信息获取单元801,配
置为获取智能合约的合约数据,以及获取所述智能合约的独立于所述合约数据的描述信
息;合约创建单元802,配置为创建合约文件,所述合约文件包括所述合约数据和所述描述
信息;交易发送单元803,配置为向所述区块链中的区块链节点发送用于部署所述智能合约
的第一交易,所述第一交易中包括所述合约文件。
[0098] 与前述方法实施例基于相同的构思,本说明书实施例中还提供了一种在区块链中查询智能合约的装置,所述区块链的状态数据库中存储有所述智能合约的合约文件,所述
合约文件中包括独立于合约数据的描述信息,所述装置部署在所述区块链节点。如图9所
示,所述装置包括:信息查询单元901,配置为响应于终端的查询所述智能合约的第一信息
的请求,获取所述描述信息中的第一信息;信息返回单元903,配置为向所述终端返回所述
第一信息。
[0099] 与前述方法实施例基于相同的构思,本说明书实施例中还提供了一种在区块链中执行智能合约的装置,所述区块链的状态数据库中存储有所述智能合约的合约文件,所述
合约文件包括合约数据和独立于所述合约数据的描述信息,所述合约数据包括通过至少两
个不同类型和/或版本的编译器分别对智能合约源文件进行编译所获得的至少两个可执行
程序,所述装置部署在所述区块链中的区块链节点。如图10所示,所述装置包括:程序选择
单元1001,配置为响应于调用所述智能合约的第三交易,基于所述描述信息和所述区块链
节点中允许执行的可执行程序的类型,从所述至少两个可执行程序中选择第一可执行程
序;程序获取单元1002,配置为获取所述第一可执行程序;程序执行单元1003,配置为执行
所述第一可执行程序。
[0100] 与前述方法实施例基于相同的构思,本说明书实施例中还提供了一种在区块链中部署智能合约的装置,所述装置部署在终端中。如图11所示,所述装置包括:信息获取单元
1101,配置为获取智能合约的合约数据,所述合约数据包括所述智能合约的描述信息;交易
发送单元1102,配置为向所述区块链中的区块链节点发送用于部署所述智能合约的第一交
易,所述第一交易包括所述合约数据,所述智能合约用于在执行时返回所述描述信息。
[0101] 与前述方法实施例基于相同的构思,本说明书实施例中还提供了一种在区块链中查询智能合约的装置,所述区块链中部署有智能合约,所述装置部署在所述区块链中的区
块链节点。如图12所示,所述装置包括:信息查询单元1201,配置为响应于调用所述智能合
约的第三交易,获取所述区块链节点中存储的所述智能合约的合约数据,所述合约数据包
括所述智能合约的描述信息;合约执行单元1203,配置为基于所述合约数据执行所述智能
合约,以向终端发送所述智能合约的描述信息。
[0102] 本领域技术人员应该可以意识到,在上述一个或多个示例中,本说明书所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功
能所对应的计算机程序存储在计算机可读介质中或者作为计算机可读介质上的一个或多
个指令/计算机程序进行传输,以便这些功能所对应的指令/计算机程序被计算机执行时,
通过计算机实现本说明书任意一个实施例中所述的方法。
[0103] 本说明书实施例中还提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算设备中执行时,计算设备执行本说明书任意一个实施例中提供的
方法。
[0104] 本说明书实施例中还提供了一种计算设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时,实现本说明书任意一个实施例中
提供的方法。
[0105] 本说明书中的各个实施例均采用递进的方式描述,各个实施例中相同、相似的部分互相参见即可,每个实施例中重点说明的都是与其他实施例的不同之处。尤其,对于装置
实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施
例的部分说明即可。
[0106] 上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来
执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺
序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可
以的或者可能是有利的。
[0107] 以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明
的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应
包括在本发明的保护范围之内。