智能合约部署、调用方法和装置转让专利

申请号 : CN201910014887.2

文献号 : CN109840429B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 路京磊卢小明陈姝

申请人 : 北京众享比特科技有限公司

摘要 :

本申请公开了智能合约部署、调用方法和装置。智能合约部署方法,由区块链节点执行,其包括:接收包含智能合约的字节码的第一交易,智能合约是按照业务逻辑预先编写、编译得到的,业务逻辑包括至少一个对数据库的表的基础操作;将第一交易发送到区块链网络共识,得到与智能合约对应的调用地址;将调用地址发送给提交第一交易的客户端。根据本申请实施例的技术方案,将智能合约部署到区块链网络,使得业务逻辑通过智能合约上链,很好地解决了业务逻辑不透明的问题。

权利要求 :

1.一种智能合约调用方法,其特征在于,该方法由区块链节点执行,其包括:接收客户端发送的调用请求,所述调用请求包括智能合约的调用地址,所述智能合约是按照业务逻辑预先编写、编译、部署得到的,所述业务逻辑包括至少一个对数据库的表的基础操作;所述调用地址是在接收到包含智能合约的字节码的第一交易之后,将所述第一交易发送到区块链网络共识得到的;

根据所述调用请求的接口类型,确定不同的处理策略来处理所述调用请求,得到与所述业务逻辑的所述基础操作对应的操作结果;所述接口类型包括第一接口类型或第二接口类型,所述第一接口类型是与改变合约状态的调用请求相对应的接口,所述第二接口类型是与不改变合约状态的调用请求相对应的接口;

向已订阅所述调用请求的客户端发送所述操作结果。

2.根据权利要求1所述的方法,其特征在于,则根据所述调用请求的接口类型确定不同的处理策略以处理所述调用请求,包括:如果是所述第一接口类型,则将所述调用请求提交到区块链网络进行共识,得到第一结果;或者,如果是所述第二接口类型,则调用本地的以太坊虚拟机以执行所述调用请求对应所述智能合约,得到第二结果。

3.根据权利要求2所述的方法,其特征在于,该方法还包括:

确定所述第一结果是共识成功还是共识失败;

如果是所述共识成功,则将所述第一结果中涉及所述表的变更的所述基础操作同步到数据库中与之对应的表;

如果是所述共识失败,则直接地向已订阅所述调用请求的客户端发送所述第一结果。

4.根据权利要求3所述的方法,其特征在于,将所述第一结果中涉及所述表的变更的所述基础操作同步到数据库中与之对应的表之后,该方法还包括:将涉及所述表的变更的所述基础操作存储至所述调用请求的附加信息部分。

5.根据权利要求3所述的方法,其特征在于,将所述第一结果中涉及所述表的变更的所述基础操作同步到数据库中与之对应的表包括:对所述业务逻辑进行拆分得到至少一个所述基础操作;

在与所述业务逻辑对应的表中查找与所述基础操作对应的状态指示;

确定所述状态指示是否存在变化;

如果是存在变化,则将所述基础操作同步到所述数据库。

6.一种智能合约调用方法,其特征在于,该方法由客户端执行,其包括:根据智能合约的应用程序二进制接口ABI信息确定发送调用请求的接口类型,所述智能合约是按照业务逻辑预先编写、编译、部署得到的,所述业务逻辑包括至少一个对数据库的表的基础操作,所述接口类型包括第一接口类型和第二接口类型,所述第一接口类型是与改变合约状态的调用请求相对应的接口,所述第二接口类型是与不改变合约状态的调用请求相对应的接口;

通过所述接口类型对应的接口发送所述调用请求,以使得区块链节点根据所述接口类型确定不同的处理策略来处理所述调用请求,得到与所述业务逻辑对应的操作结果。

7.一种智能合约调用装置,其特征在于,该装置设置在区块链节点,其包括:第二接收单元,用于接收客户端发送的调用请求,所述调用请求包括智能合约的调用地址,所述智能合约是按照业务逻辑预先编写、编译、部署得到的,所述业务逻辑包括至少一个对数据库的表的基础操作;所述调用地址是在接收到包含智能合约的字节码的第一交易之后,将所述第一交易发送到区块链网络共识得到的;

处理单元,用于根据所述调用请求的接口类型,确定不同的处理策略来处理所述调用请求,得到与所述业务逻辑的所述基础操作对应的操作结果;所述接口类型包括第一接口类型或第二接口类型,所述第一接口类型是与改变合约状态的调用请求相对应的接口,所述第二接口类型是与不改变合约状态的调用请求相对应的接口;

第三发送单元,用于向已订阅所述调用请求的客户端发送所述操作结果。

8.根据权利要求7所述的装置,其特征在于,所述处理单元包括:

第一处理子单元,用于如果是所述第一接口类型,则将所述调用请求提交到区块链网络进行共识,得到第一结果;或者,第二处理子单元,用于如果是所述第二接口类型,则调用本地的以太坊虚拟机以执行所述调用请求对应所述智能合约,得到第二结果。

9.一种智能合约调用装置,其特征在于,该装置设置在客户端,其包括:接口类型确定单元,用于根据智能合约的应用程序二进制接口ABI信息确定发送调用请求的接口类型,所述智能合约是按照业务逻辑预先编写、编译、部署得到的,所述业务逻辑包括至少一个对数据库的表的基础操作,所述接口类型包括第一接口类型和第二接口类型,所述第一接口类型是与改变合约状态的调用请求相对应的接口,所述第二接口类型是与不改变合约状态的调用请求相对应的接口;

第四发送单元,用于通过所述接口类型对应的接口发送所述调用请求,以使得区块链节点根据所述接口类型确定不同的处理策略来处理所述调用请求,得到与所述业务逻辑对应的操作结果。

说明书 :

智能合约部署、调用方法和装置

技术领域

[0001] 本申请一般涉及数据存储技术领域,尤其涉及智能合约部署、调用方法和装置。

背景技术

[0002] 现有技术中,将区块链与数据库进行结合的系统,用户可以像操作普通数据库一样向区块链发送相应的交易,交易会被记录在区块链网络中,同时会在底层数据库中反应出来。该系统实现了数据库操作记录与实现的分离,极大地提高了传统数据库的安全性及灵活性。
[0003] 但是,目前存在的系统只支持将数据库表的创建、授权、增加、删除、修改、查询等基础操作上链,用户想要使用这个系统完成复杂的业务逻辑,就需要额外开发一套中心化的系统来调用这些表的基本操作。上述支持数据库操作的区块链系统中存在两个问题:一是对数据库操作的业务逻辑是不透明的,是在区块链之外的;二是对数据库的调用不够灵活。

发明内容

[0004] 鉴于现有技术中的上述缺陷或不足,期望提供一种基于智能合约部署、调用方法、装置、设备及存储介质,来解决对对数据库操作的业务逻辑不透明的问题。
[0005] 第一方面,本申请实施例提供了一种智能合约部署方法,该方法由区块链节点执行,其包括:
[0006] 接收包含智能合约的字节码的第一交易,该智能合约是按照业务逻辑预先编写、编译得到的,该业务逻辑包括至少一个对数据库的表的基础操作;
[0007] 将第一交易发送到区块链网络共识,得到与智能合约对应的调用地址;
[0008] 将调用地址发送给提交第一交易的客户端。
[0009] 第二方面,本申请实施例提供了一种智能合约调用方法,该方法由区块链节点执行,其包括:
[0010] 接收客户端发送的调用请求,该调用请求包括智能合约的调用地址,智能合约是按照业务逻辑预先编写、编译、部署得到的,该业务逻辑包括至少一个对数据库的表的基础操作;
[0011] 根据调用请求的接口类型,确定不同的处理策略来处理调用请求,以得到与业务逻辑的基础操作对应的操作结果;
[0012] 向已订阅调用请求的客户端发送操作结果。
[0013] 第三方面,本申请实施例提供了一种智能合约调用方法,该方法由客户端执行,其包括:
[0014] 根据智能合约的应用程序二进制接口ABI信息确定发送调用请求的接口类型,该智能合约是按照业务逻辑预先编写、编译、部署得到的,该业务逻辑包括至少一个对数据库的表的基础操作,该接口类型包括第一接口类型和第二接口类型;
[0015] 通过接口类型对应的接口发送调用请求,以使得区块链节点根据接口类型确定不同的处理策略来处理调用请求,以得到与业务逻辑对应的操作结果。
[0016] 第四方面,本申请实施例提供了一种智能合约部署装置,该装置设置在区块链节点,其包括:
[0017] 第一接收单元,用于接收包含智能合约的字节码的第一交易,该智能合约是按照业务逻辑预先编写、编译得到的,该业务逻辑包括至少一个对数据库的表的基础操作;
[0018] 第一发送单元,用于将第一交易提交到区块链网络共识,得到与智能合约对应的调用地址;
[0019] 第二发送单元,用于将调用地址发送给提交第一交易的客户端。
[0020] 第五方面,一种智能合约调用装置,该装置设置在区块链节点,其包括:
[0021] 第二接收单元,用于接收客户端发送的调用请求,该调用请求包括智能合约的调用地址,该智能合约是按照业务逻辑预先编写、编译、部署得到的,该业务逻辑包括至少一个对数据库的表的基础操作;
[0022] 处理单元,用于根据调用请求的接口类型,确定不同的处理策略来处理调用请求,以得到与业务逻辑的基础操作对应的操作结果;
[0023] 第三发送单元,用于向已订阅调用请求的客户端发送操作结果。
[0024] 第六方面,一种智能合约调用装置,该装置设置在客户端,其包括:
[0025] 接口类型确定单元,用于根据智能合约的应用程序二进制接口ABI信息确定发送调用请求的接口类型,该智能合约是按照业务逻辑预先编写、编译、部署得到的,该业务逻辑包括至少一个对数据库的表的基础操作,该接口类型包括第一接口类型和第二接口类型;
[0026] 第四发送单元,用于通过接口类型对应的接口发送调用请求,以使得区块链节点根据接口类型确定不同的处理策略来处理调用请求,以得到与业务逻辑对应的操作结果。
[0027] 本申请实施例提供了智能合约的部署、调用方法,通过预先编写、编译得到实现业务逻辑的智能合约,将智能合约部署到区块链网络,使得业务逻辑通过智能合约上链,很好地解决了业务逻辑不透明的问题。
[0028] 进一步地,通过智能合约调用,来实现灵活地调用数据库的表进行操作。

附图说明

[0029] 通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:
[0030] 图1示出了本申请实施例提供的智能合约部署方法的流程示意图;
[0031] 图2示出了本申请实施例提供的智能合约调用方法的流程示意图;
[0032] 图3示出了本申请又一实施例提供的智能合约调用方法的流程示意图;
[0033] 图4示出了本申请实施例提供的基于智能合约操作数据库的方法的流程示意图;
[0034] 图5示出了本申请实施例提供的通过智能合约建表的流程示意图;
[0035] 图6示出了本申请实施例提供的智能合约部署装置600的示例性结构框图;
[0036] 图7示出了本申请实施例提供的智能合约调用装置700的示例性结构框图;
[0037] 图8示出了本申请又一实施例提供的智能合约调用装置800的示例性结构框图;
[0038] 图9示出了本申请实施例提供的基于智能合约操作数据库的系统的示例性结构框图
[0039] 图10示出了适于用来实现本申请实施例的计算机系统的结构示意图。

具体实施方式

[0040] 下面结合附图和实施例对本申请作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与发明相关的部分。
[0041] 需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
[0042] 区块链数据库系统,包括区块链网络和数据库。区块链网络包括至少一个区块链节点,每个区块链节点可以配置相应的数据库。数据库的类型不限于DB2数据库,火鸟(Firebird)数据库,MySQL数据库,ODBC数据库,PostgreSOL数据库,SQLite3数据库;也可以配置为本领域技术人员通过预设接口(API)进行配置的其他类型的数据库。对数据库操作的每一条指令都记录到一条交易中,区块链网络以交易的形式记录下所有对数据库的操作。但是,每个操作对应数据库的基础操作,例如,对数据库表的创建、授权、增加、删除、修改、查询等。
[0043] 基于业务逻辑的数据库操作,对于现有的区块链数据库系统而言,是不透明的。例如,对于开发票业务而言,先查询开票对象对应的数据库的表,然后,修改与开票对象对应的数据库的表的业务参数等。但是,现有的区块链数据库系统并不能知晓完整的开票业务的逻辑。
[0044] 本申请实施例通过预先编写业务逻辑的智能合约来解决上述问题。
[0045] 请参考图1,图1示出了本申请实施例提供的智能合约部署方法的流程示意图。该方法可以在区块链节点上执行。
[0046] 如图1所示,该方法包括:
[0047] 步骤101,接收包含智能合约的字节码的第一交易,其中,智能合约是按照业务逻辑预先编写、编译得到的,业务逻辑包括至少一个对数据库的表的基础操作。
[0048] 步骤102,将第一交易发送到区块链网络共识,得到与智能合约对应的调用地址。
[0049] 步骤103,将调用地址发送给提交第一交易的客户端。
[0050] 本申请实施例中,区块链节点可以是与数据库的提供商对应的节点。客户端可以是使用数据库的用户。
[0051] 本申请实施例中,目前的智能合约指令中并没有指令可以用来操作数据库的表,需要根据业务逻辑来扩展智能合约的指令。以太坊的智能合约可以采用一种图灵完备的开发语言进行开发,扩展智能合约指令以支持数据库的表的操作,需要做的工作如下:
[0052] 1)新增指令要求智能合约脚本语言可以支持新建表、删除表、授权表、插入、更新、查询等命令;
[0053] 2)以太坊虚拟机也需要添加对新增的指令的支持;
[0054] 3)智能合约脚本编译工具也需要相应的增加对新增的指令的支持;
[0055] 在完成智能合约指令的扩展之后,在区块链网络中也需要增加对扩展后的智能合约指令的支持。假设,区块链网络之前已经支持数据库的表的操作上链,并且支持表操作交易同步到数据库。区块链网络需增加对以太坊虚拟机对扩展后的智能合约指令的回调的支持。例如,当以太坊虚拟机解析到建表指令时,会回调到区块链层,区块链层需要将建表操作保存下来,并存储到交易的附加信息中。另外,需要在表状态信息中,将改变表状态的区块号置为当前的区块号。在区块链层表的同步模块中,需要增加对智能合约的表的交易的支持。
[0056] 本申请实施例,通过将对数据库的表的业务逻辑通过智能合约部署到区块链节点,实现了业务逻辑上链,从而解决了业务逻辑不透明的问题。
[0057] 在完成智能合约的部署之后,本申请实施例还提供了一种智能合约调用方法,请参考图2,图2示出了本申请实施例提供的智能合约调用方法的流程示意图。该方法可以在区块链节点上执行。
[0058] 如图2所示,该方法包括:
[0059] 步骤201,接收客户端发送的调用请求,该调用请求包括智能合约的调用地址,智能合约是按照业务逻辑预先编写、编译、部署得到的,业务逻辑包括至少一个对数据库的表的基础操作。
[0060] 本申请实施例中,调用请求用于请求调用与之对应的智能合约。调用请求包括智能合约的调用地址,智能合约是用于实现业务逻辑预先编写、编译的程序代码,业务逻辑包括至少一个对数据库的表的基础操作。在编写或创建完成该程序代码后,将该程序代码通过编译工具编译成字节码,字节码是由一连串的字节组成,每一字节表示一个操作。在编译完成字节码之后,创建一个交易将智能合约部署到区块链系统上。该交易的数据字段保存的是该字节码,“to”的地址为一个空的账户。将该交易部署到区块链系统上,由各个区块链节点共识后,分配一个与该智能合约对应的调用地址。
[0061] 在完成智能合约的部署之后,任何一个知晓智能合约的应用程序二进制接口ABI信息和调用地址信息的客户端,需要向区块链节点发送一个包含调用地址的调用请求,并将ABI信息作为数据字段保存在调用请求中。即调用请求包括智能合约的ABI信息和调用地址。
[0062] 其中,ABI信息,是一个固定格式的字符串,包含智能合约中各函数的函数名、参数数目和类型、返回值数据和类型等信息。
[0063] 其中,业务逻辑包括至少一个对数据库的表的基础操作。例如,通过智能合约实现开发票业务逻辑,该业务逻辑包括至少一个数据库的表的基础操作,例如读取数据库表的操作和修改数据库表的操作。
[0064] 步骤202,根据调用请求的接口类型,确定不同的处理策略来处理调用请求,以得到与业务逻辑的基础操作对应的操作结果。
[0065] 区块链节点接收到调用请求之后,解析调用请求包含的信息,可以知晓是客户端通过哪个接口发送的调用请求。例如,接口类型可以包括第一接口类型或第二接口类型,如果客户端采用第一接口类型对应的接口来发送调用请求,区块链节点可以通过接口标识解析得到是第一接口类型的调用请求,其可以是改变合约状态的调用,该调用可以是交易调用。如果客户端采用第二接口类型对应的接口来发送调用请求,区块链节点可以通过接口标识解析得到是第二接口交易类型的调用请求,其可以是不改变合约状态的调用,该调用可以是普通合约调用。如果是第一接口类型,则将调用请求提交到区块链网络进行共识,得到第一结果;或者,如果是第二接口类型,则调用本地的以太坊虚拟机以执行调用请求对应的智能合约,得到第二结果。
[0066] 当区块链节点接收到第一接口类型的调用请求时,则将调用请求提交到区块链网络进行共识。共识的方式包括多种。例如,可以区块链节点收到第一请求类型对应的调用请求后,通过交易的方式进行共识,即先在本地共识,在本地共识时,区块链节点调用与之关联的以太坊虚拟机执行第一请求类型对应的调用请求,并在本地共识通过后,将交易广播给其他节点,其他节点同样地先在本地共识,然后将本地共识的结果进行广播。在各个节点根据交易投票情况将交易打包到区块,然后将区块的哈希进行广播,通过各个节点对哈希值的投票来决定区块共识的结果,如果投票到达阈值,则认为区块共识通过。
[0067] 当区块链节点接收到第二接口类型的调用请求时,则调用本地的以太坊虚拟机以执行调用请求对应的智能合约。即通过以太坊虚拟机执行调用请求对应的智能合约的字节码,得到运行结果。
[0068] 其中,以太坊虚拟机,包括大多数常用的算术运算、位运算、逻辑运算和比较运算等。本申请实施例,以太坊虚拟机能够支持数据库表操作,通过预先扩展以太坊虚拟机的指令集合,例如,增加某些指令来支持数据库表的操作。这些指令,例如可以是数据库表的创建、删除、授权、增加、修改、查询等操作指令。例如,A账户创建了一张数据表,B账户想要该数据表进行插入、删除、更新等操作,则需要获得授权,然后才能对该数据表进行相应的操作。
[0069] 将这些操作指令经过智能合约编译工具编译成字节码,由以太坊虚拟机执行,从而实现对数据库表的操作的支持。
[0070] 步骤203,向已订阅调用请求的客户端发送操作结果。
[0071] 本申请实施例,在完成智能合约的调用之后,可以向已经订阅交易的客户端反馈操作结果。例如,可以是区块链节点在本地共识完成之后,由区块链节点向客户端发送本地共识的结果。在区块链网络多个区块链节点完成区块共识之后,可以向客户端发送区块共识的结果。还可以在区块共识通过后,将数据库表的部分基础操作同步到数据库,并在同步完成之后,向客户端反馈同步的结果。
[0072] 本申请实施例,通过预先定义的基于业务逻辑的智能合约来解决现有的区块链数据库中对于业务逻辑的操作不透明的问题。
[0073] 进一步,该方法还包括:
[0074] 确定第一结果是共识成功还是共识失败;
[0075] 如果是共识成功,则将第一结果中涉及表的变更的基础操作同步到数据库中与之对应的表;
[0076] 如果是共识失败,则直接地向已订阅调用请求的客户端发送第一结果。
[0077] 其中,将第一结果中涉及表的变更的基础操作同步到数据库中与之对应的表包括:
[0078] 对业务逻辑进行拆分得到至少一个基础操作;
[0079] 在与业务逻辑对应的表中查找与基础操作对应的状态指示;
[0080] 确定状态指示是否存在变化;
[0081] 如果是存在变化,则将基础操作同步到数据库;
[0082] 如果是不存在变化,则结束,无需进行同步处理。
[0083] 其中,将第一结果中涉及表的变更的基础操作同步到数据库中与之对应的表之后,该方法还包括:
[0084] 将涉及表的变更的基础操作存储至调用请求的附加信息部分。
[0085] 进一步地,请参考图3,图3示出了本申请又一实施例提供的智能合约调用方法的流程示意图。该方法可以在客户端上执行。
[0086] 如图3所示,该方法包括:
[0087] 步骤301,根据智能合约的应用程序二进制接口ABI信息确定发送调用请求的接口类型。
[0088] 本申请实施例中,调用请求是用于调用智能合约的请求。该调用请求包括智能合约的调用地址和ABI信息。智能合约是按照业务逻辑预先编写、编译、部署得到的。业务逻辑包括至少一个对数据库的表的基础操作。其中,接口类型包括第一接口类型和第二接口类型。
[0089] 步骤302,通过接口类型对应的接口发送调用请求,以使得区块链节点根据接口类型确定不同的处理策略来处理调用请求,以得到与业务逻辑对应的操作结果。
[0090] 本申请实施例,客户端可以基于调用请求的应用程序二进制接口ABI信息来确定发送调用请求对应的接口类型。其中,如果ABI信息包括constant/pure/view标识,则表示在该调用请求不需要矿工验证,则采用第二接口类型对应的接口来发送调用请求,该调用请求也可以称为普通合约调用。如果不包括constant/pure/view标识,则将该调用请求作为交易通过第一接口类型对应的接口来发送,该调用请求也可以称为交易调用。
[0091] 本申请实施例中,客户端通过ABI信息确定发送调用请求的接口,区块链节点可以识别出不同接口的调用请求,采用不同的处理策略得到与业务逻辑对应的操作结果。
[0092] 为了更清楚地说明,请参考图4,图4示出了本申请实施例提供的基于智能合约操作数据库的方法的流程示意图。该方法在区块链节点侧和客户端之间交互执行。
[0093] 步骤401,客户端向区块链节点提交第一交易。
[0094] 该第一交易包含智能合约的字节码,其中,智能合约是按照业务逻辑预先编写、编译得到的、业务逻辑包括至少一个对数据库的表的基础操作。
[0095] 步骤402,区块链节点将第一交易发送到区块链网络共识,得到与智能合约对应的调用地址;
[0096] 步骤403,区块链节点将调用地址发送给提交第一交易的客户端
[0097] 步骤404,第二客户端根据智能合约的应用程序二进制接口ABI信息确定发送调用请求的接口类型,通过接口类型对应的接口发送调用请求。
[0098] 本申请实施例中,第二客户端可以是任何客户端,例如可以是提交第一交易的客户端,也可以是其他知晓智能合约的ABI信息和调用地址的客户端。其中,接口类型包括第一接口类型和第二接口类型。
[0099] 步骤405,区块链节点确定如果是第一接口类型,则将调用请求提交到区块链网络进行共识,得到第一结果;或者,
[0100] 步骤406,区块链节点确定如果是第二接口类型,则调用本地的以太坊虚拟机以执行调用请求对应的智能合约,得到第二结果。
[0101] 步骤407,区块链节点确定第一结果是共识成功还是共识失败;
[0102] 步骤408a,区块链节点确定如果是共识成功,则将第一结果中涉及表的变更的基础操作同步到数据库中与之对应的表。
[0103] 步骤408b,区块链节点确定如果是共识失败,则直接地向已订阅调用请求的客户端发送第一结果。
[0104] 可选地,该方法还包括:
[0105] 将涉及表的变更的基础操作存储至调用请求的附加信息部分。
[0106] 本申请实施例中,将第一结果中涉及表的变更的基础操作同步到数据库中与之对应的表包括:
[0107] 对业务逻辑进行拆分得到至少一个所述基础操作;
[0108] 在与业务逻辑对应的表中查找与基础操作对应的状态指示;
[0109] 确定状态指示是否存在变化;
[0110] 如果是存在变化,则将基础操作同步到所述数据库;
[0111] 如果是不存在变化,则无需执行同步。
[0112] 本申请实施例中,选取一个基于数据库操作的区块链网络。在区块链网络中集成以太坊虚拟机,可以通过集成以太坊虚拟机代码到区块链代码工程;并设计实现区块链与虚拟机交互的模块。注意,以太坊虚拟机中要求账户的表示方法是长度为20的字节数组,区块链网络需要与之兼容,相应的区块链网络代码增加对智能合约交易的支持,主要包括部署合约与合约调用,合约调用又分为改变合约状态的调用与不改变合约状态的调用两种。
[0113] 在区块链节点接收到客户端发送的调用请求时,可以识别出是改变合约状态的调用(第一请求类型)还是不改变合约状态的调用。
[0114] 本申请实施例中,部署合约可以包括:
[0115] 预先编写智能合约;并使用智能合约编译工具编译,得到字节码;然后发送部署智能合约的交易到区块链网络。区块链网络交易共识,以太坊虚拟机中执行合约代码,并返回合约执行字节码。交易共识,将返回的字节码存储到新生成的合约账户下。
[0116] 区块链节点判断调用是否改变合约状态,如果是改变合约状态的调用,则是从客户端的第一接口发送的第一请求类型,第一请求类型即为交易,将交易提交到区块链网络,由区块链网络对该交易进行共识。例如可以现在本地共识,然后将本地共识结果进行广播,然后将交易提供给区块链节网络的其他节点进行共识。
[0117] 如果是不改变合约状态的调用,则发送普通合约调用到区块链网络,区块链网络收到客户端发送的合约普通调用,则区块链节点模拟交易调用以太坊虚拟机,执行普通调用的智能合约的字节码。
[0118] 以太坊虚拟机返回调用结果,如果是交易调用,返回交易共识结果,如果是普通调用,则返回调用结果,并由客户端根据Abi解码得到真正结果。
[0119] 为进一步地说明书智能合约的调用,请参见图5,图5示出了本申请实施例提供的通过智能合约建表的流程示意图。具体步骤如下:
[0120] 步骤501,客户端通过第一接口类型对应的接口发送智能合约的调用请求,该调用请求包含建表操作。
[0121] 步骤502,区块链网络中与客户端对应的区块链节点接收到调用请求;
[0122] 步骤503,区块链节点调用以太坊虚拟机执行智能合约的调用。
[0123] 步骤504,以太坊虚拟机执行建表指令;
[0124] 步骤505,回调给区块链节点;
[0125] 步骤506,区块链节点保存建表操作到交易附加信息;
[0126] 步骤507,区块链节点广播交易到区块链网络进行共识。
[0127] 步骤508,区块共识通过,则将交易同步到数据库。
[0128] 步骤509,区块共识失败,直接返回共识失败给客户端。
[0129] 应当注意,尽管在附图中以特定顺序描述了本发明方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。相反,流程图中描绘的步骤可以改变执行顺序。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
[0130] 请参考图6,图6示出了本申请实施例提供的智能合约部署装置600的示例性结构框图。该装置可以在区块链节点上执行。
[0131] 如图6所示,该装置600包括:
[0132] 第一接收单元601,用于接收包含智能合约的字节码的第一交易。
[0133] 第一发送单元602,用于将第一交易提交到区块链网络共识,得到与智能合约对应的调用地址。
[0134] 第二发送单元603,用于将调用地址发送给提交第一交易的客户端。
[0135] 本申请实施例中,区块链节点可以是与数据库的提供商对应的节点。客户端可以是使用数据库的用户。
[0136] 本申请实施例中,智能合约是按照业务逻辑预先编写、编译得到的。业务逻辑包括至少一个对数据库的表的基础操作。
[0137] 本申请实施例中,目前的智能合约指令中并没有指令可以用来操作数据库的表,需要根据业务逻辑来扩展智能合约的指令。以太坊的智能合约可以采用一种图灵完备的开发语言进行开发,扩展智能合约指令以支持数据库的表的操作,需要做的工作如下:
[0138] 1)新增指令要求智能合约脚本语言可以支持新建表、删除表、授权表、插入、更新、查询等命令;
[0139] 2)以太坊虚拟机也需要添加对新增的指令的支持;
[0140] 3)智能合约脚本编译工具也需要相应的增加对新增的指令的支持;
[0141] 在完成智能合约指令的扩展之后,在区块链网络中也需要增加对扩展后的智能合约指令的支持。假设,区块链网络之前已经支持数据库的表的操作上链,并且支持表操作交易同步到数据库。区块链网络需增加对以太坊虚拟机对扩展后的智能合约指令的回调的支持。例如,当以太坊虚拟机解析到建表指令时,会回调到区块链层,区块链层需要将建表操作保存下来,并存储到交易的附加信息中。另外,需要在表状态信息中,将改变表状态的区块号置为当前的区块号。在区块链层表的同步模块中,需要增加对智能合约的表的交易的支持。
[0142] 本申请实施例,通过将对数据库的表的业务逻辑通过智能合约部署到区块链节点,实现了业务逻辑上链,从而解决了业务逻辑不透明的问题。
[0143] 在完成智能合约的部署之后,本申请实施例还提供了一种智能合约调用方法,请参考图7,图7示出了本申请实施例提供的智能合约调用装置700的示例性结构框图。该装置可以在区块链节点上执行。
[0144] 如图7所示,该装置700包括:
[0145] 第二接收单元701,用于接收客户端发送的调用请求。
[0146] 本申请实施例中,调用请求用于请求调用与之对应的智能合约。智能合约是用于实现业务逻辑预先编写、编译的程序代码,业务逻辑包括至少一个对数据库的表的基础操作。在编写或创建完成该程序代码后,将该程序代码通过编译工具编译成字节码,字节码是由一连串的字节组成,每一字节表示一个操作。在编译完成字节码之后,创建一个交易将智能合约部署到区块链系统上。该交易的数据字段保存的是该字节码,“to”的地址为一个空的账户。将该交易部署到区块链系统上,由各个区块链节点共识后,分配一个与该智能合约对应的调用地址。
[0147] 在完成智能合约的部署之后,任何一个知晓智能合约的应用程序二进制接口ABI信息和调用地址信息的客户端,需要向区块链节点发送一个包含调用地址的调用请求,并将ABI信息作为数据字段保存在调用请求中。即调用请求包括智能合约的ABI信息和调用地址。
[0148] 其中,ABI信息,是一个固定格式的字符串,包含智能合约中各函数的函数名、参数数目和类型、返回值数据和类型等信息。
[0149] 其中,业务逻辑包括至少一个对数据库的表的基础操作。例如,通过智能合约实现开发票业务逻辑,该业务逻辑包括至少一个数据库的表的基础操作,例如读取数据库表的操作和修改数据库表的操作。
[0150] 处理单元702,用于根据调用请求的接口类型,确定不同的处理策略来处理调用请求,以得到与业务逻辑的基础操作对应的操作结果。
[0151] 区块链节点接收到调用请求之后,解析调用请求包含的信息,可以知晓是客户端通过哪个接口发送的调用请求。例如,接口类型可以包括第一接口类型或第二接口类型,如果客户端采用第一接口类型对应的接口来发送调用请求,区块链节点可以通过接口标识解析得到是第一接口类型的调用请求,其可以是改变合约状态的调用,该调用可以是交易调用。如果客户端采用第二接口类型对应的接口来发送调用请求,区块链节点可以通过接口标识解析得到是第二接口交易类型的调用请求,其可以是不改变合约状态的调用,该调用可以是普通合约调用。如果是第一接口类型,则将调用请求提交到区块链网络进行共识,得到第一结果;或者,如果是第二接口类型,则调用本地的以太坊虚拟机以执行调用请求对应的智能合约,得到第二结果。
[0152] 当区块链节点接收到第一接口类型的调用请求时,则将调用请求提交到区块链网络进行共识。共识的方式包括多种。例如,可以区块链节点收到第一请求类型对应的调用请求后,通过交易的方式进行共识,即先在本地共识,在本地共识时,区块链节点调用与之关联的以太坊虚拟机执行第一请求类型对应的调用请求,并在本地共识通过后,将交易广播给其他节点,其他节点同样地先在本地共识,然后将本地共识的结果进行广播。在各个节点根据交易投票情况将交易打包到区块,然后将区块的哈希进行广播,通过各个节点对哈希值的投票来决定区块共识的结果,如果投票到达阈值,则认为区块共识通过。
[0153] 当区块链节点接收到第二接口类型的调用请求时,则调用本地的以太坊虚拟机以执行调用请求对应的智能合约。即通过以太坊虚拟机执行调用请求对应的智能合约的字节码,得到运行结果。
[0154] 其中,以太坊虚拟机,包括大多数常用的算术运算、位运算、逻辑运算和比较运算等。本申请实施例,以太坊虚拟机能够支持数据库表操作,通过预先扩展以太坊虚拟机的指令集合,例如,增加某些指令来支持数据库表的操作。这些指令,例如可以是数据库表的创建、删除、授权、增加、修改、查询等操作指令。例如,A账户创建了一张数据表,B账户想要该数据表进行插入、删除、更新等操作,则需要获得授权,然后才能对该数据表进行相应的操作。
[0155] 将这些操作指令经过智能合约编译工具编译成字节码,由以太坊虚拟机执行,从而实现对数据库表的操作的支持。
[0156] 接口类型包括第一接口类型或第二接口类型,则处理单元702可以包括:
[0157] 第一处理子单元,用于如果是第一接口类型,则将调用请求提交到区块链网络进行共识,得到第一结果;或者,
[0158] 第二处理子单元,用于如果是第二接口类型,则调用本地的以太坊虚拟机以执行调用请求对应智能合约,得到第二结果。
[0159] 第三发送单元703,用于向已订阅调用请求的客户端发送操作结果。
[0160] 本申请实施例,在完成智能合约的调用之后,可以向已经订阅交易的客户端反馈操作结果。例如,可以是区块链节点在本地共识完成之后,由区块链节点向客户端发送本地共识的结果。在区块链网络多个区块链节点完成区块共识之后,可以向客户端发送区块共识的结果。还可以在区块共识通过后,将数据库表的部分基础操作同步到数据库,并在同步完成之后,向客户端反馈同步的结果。
[0161] 本申请实施例,通过预先定义的基于业务逻辑的智能合约来解决现有的区块链数据库中对于业务逻辑的操作不透明的问题。
[0162] 进一步,该装置还包括:
[0163] 确定单元,用于确定第一结果是共识成功还是共识失败;
[0164] 同步单元,用于如果是共识成功,则将第一结果中涉及表的变更的基础操作同步到数据库中与之对应的表;
[0165] 结果反馈单元,用于如果是共识失败,则直接地向已订阅调用请求的客户端发送第一结果。
[0166] 其中,同步单元还可以包括:
[0167] 拆分子单元,用于对业务逻辑进行拆分得到至少一个基础操作;
[0168] 查找子单元,用于在与业务逻辑对应的表中查找与基础操作对应的状态指示;
[0169] 状态确定子单元,用于确定状态指示是否存在变化;
[0170] 同步子单元,用于如果是存在变化,则将基础操作同步到数据库;
[0171] 如果是不存在变化,则结束,无需进行同步处理。
[0172] 其中,该装置还包括:
[0173] 存储单元,用于将涉及表的变更的基础操作存储至调用请求的附加信息部分。
[0174] 进一步地,请参考图8,图8示出了本申请又一实施例提供的智能合约调用装置800的示例性结构框图。该方法可以在客户端上执行。
[0175] 如图8所示,该装置800包括:
[0176] 接口类型确定单元801,用于根据智能合约的应用程序二进制接口ABI信息确定发送调用请求的接口类型。
[0177] 本申请实施例中,调用请求是用于调用智能合约的请求。该调用请求包括智能合约的调用地址和ABI信息。智能合约是按照业务逻辑预先编写、编译、部署得到的。业务逻辑包括至少一个对数据库的表的基础操作。其中,接口类型包括第一接口类型和第二接口类型。
[0178] 第四发送单元802,用于通过接口类型对应的接口发送调用请求,以使得区块链节点根据接口类型确定不同的处理策略来处理调用请求,以得到与业务逻辑对应的操作结果。
[0179] 本申请实施例,客户端可以基于调用请求的应用程序二进制接口ABI信息来确定发送调用请求对应的接口类型。其中,如果ABI信息包括constant/pure/view标识,则表示在该调用请求不需要矿工验证,则采用第二接口类型对应的接口来发送调用请求,该调用请求也可以称为普通合约调用。如果不包括constant/pure/view标识,则将该调用请求作为交易通过第一接口类型对应的接口来发送,该调用请求也可以称为交易调用。
[0180] 本申请实施例中,客户端通过ABI信息确定发送调用请求的接口,区块链节点可以识别出不同接口的调用请求,采用不同的处理策略得到与业务逻辑对应的操作结果。
[0181] 应当理解,装置600-800中记载的诸单元或模块与参考图1-3描述的方法中的各个步骤相对应。由此,上文针对方法描述的操作和特征同样适用于装置600-800及其中包含的单元,在此不再赘述。装置600-800可以预先实现在电子设备的浏览器或其他安全应用中,也可以通过下载等方式而加载到电子设备的浏览器或其安全应用中。装置600-800中的相应单元可以与电子设备中的单元相互配合以实现本申请实施例的方案。
[0182] 为了更清楚地说明,请参考图9,图9示出了本申请实施例提供的基于智能合约操作数据库的系统的示例性结构框图。该系统包括至少一个客户端901,至少一个区块链节点902,在每个区块链节点配置以太坊虚拟机903以及在每个区块链节点布设的数据库904。
[0183] 第一客户端901,用于向区块链节点提交第一交易。
[0184] 该第一交易包含智能合约的字节码,其中,智能合约是按照业务逻辑预先编写、编译得到的、业务逻辑包括至少一个对数据库的表的基础操作。
[0185] 区块链节点902,用于将第一交易发送到区块链网络共识,得到与智能合约对应的调用地址;并将调用地址发送给提交第一交易的客户端。
[0186] 第二客户端901,用于根据智能合约的应用程序二进制接口ABI信息确定发送调用请求的接口类型,并通过与接口类型对应的接口发送调用请求。
[0187] 本申请实施例中,第二客户端可以是任何客户端,例如可以是提交第一交易的客户端,也可以是其他知晓智能合约的ABI信息和调用地址的客户端。其中,接口类型包括第一接口类型和第二接口类型。
[0188] 区块链节点902,用于确定如果是第一接口类型,则将调用请求提交到区块链网络进行共识,得到第一结果;或者,用于确定如果是第二接口类型,则调用本地的以太坊虚拟机903以执行调用请求对应的智能合约,得到第二结果。以及用于确定第一结果是共识成功还是共识失败;确定如果是共识成功,则将第一结果中涉及表的变更的基础操作同步到数据库904中与之对应的表;确定如果是共识失败,则直接地向已订阅调用请求的客户端发送第一结果。
[0189] 以太坊虚拟机903,用于执行调用请求对应的智能合约,得到执行结果。
[0190] 数据库904,用于记录涉及表的变更的基础操作。
[0191] 可选地,该装置还包括:
[0192] 区块链节点902,用于将涉及表的变更的基础操作存储至调用请求的附加信息部分。
[0193] 本申请实施例中,将第一结果中涉及表的变更的基础操作同步到数据库中与之对应的表包括:
[0194] 对业务逻辑进行拆分得到至少一个所述基础操作;
[0195] 在与业务逻辑对应的表中查找与基础操作对应的状态指示;
[0196] 确定状态指示是否存在变化;
[0197] 如果是存在变化,则将基础操作同步到所述数据库;
[0198] 如果是不存在变化,则无需执行同步。
[0199] 本申请实施例中,选取一个基于数据库操作的区块链网络。在区块链网络中集成以太坊虚拟机,可以通过集成以太坊虚拟机代码到区块链代码工程;并设计实现区块链与虚拟机交互的模块。注意,以太坊虚拟机中要求账户的表示方法是长度为20的字节数组,区块链网络需要与之兼容,相应的区块链网络代码增加对智能合约交易的支持,主要包括部署合约与合约调用,合约调用又分为改变合约状态的调用与不改变合约状态的调用两种。
[0200] 在区块链节点接收到客户端发送的调用请求时,可以识别出是改变合约状态的调用(第一请求类型)还是不改变合约状态的调用。
[0201] 本申请实施例中,部署合约可以包括:
[0202] 预先编写智能合约;并使用智能合约编译工具编译,得到字节码;然后发送部署智能合约的交易到区块链网络。区块链网络交易共识,以太坊虚拟机中执行合约代码,并返回合约执行字节码。交易共识,将返回的字节码存储到新生成的合约账户下。
[0203] 区块链节点判断调用是否改变合约状态,如果是改变合约状态的调用,则是从客户端的第一接口发送的第一请求类型,第一请求类型即为交易,将交易提交到区块链网络,由区块链网络对该交易进行共识。例如可以现在本地共识,然后将本地共识结果进行广播,然后将交易提供给区块链节网络的其他节点进行共识。
[0204] 如果是不改变合约状态的调用,则发送普通合约调用到区块链网络,区块链网络收到客户端发送的合约普通调用,则区块链节点模拟交易调用以太坊虚拟机,执行普通调用的智能合约的字节码。
[0205] 以太坊虚拟机返回调用结果,如果是交易调用,返回交易共识结果,如果是普通调用,则返回调用结果,并由客户端根据Abi解码得到真正结果。
[0206] 下面参考图10,其示出了适于用来实现本申请实施例的终端设备或服务器的计算机系统1000的结构示意图。
[0207] 如图10所示,计算机系统1000包括中央处理单元(CPU)1001,其可以根据存储在只读存储器(ROM)1002中的程序或者从存储部分1008加载到随机访问存储器(RAM)1003中的程序而执行各种适当的动作和处理。在RAM 1003中,还存储有系统1000操作所需的各种程序和数据。CPU 1001、ROM 1002以及RAM 1003通过总线1004彼此相连。输入/输出(I/O)接口1005也连接至总线1004。
[0208] 以下部件连接至I/O接口505:包括键盘、鼠标等的输入部分1006;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分1007;包括硬盘等的存储部分1008;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分1009。通信部分509经由诸如因特网的网络执行通信处理。驱动器1010也根据需要连接至I/O接口1005。可拆卸介质
1011,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1010上,以便于从其上读出的计算机程序根据需要被安装入存储部分1008。
[0209] 特别地,根据本公开的实施例,上文参考流程图图1-3描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在机器可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1009从网络上被下载和安装,和/或从可拆卸介质1011被安装。在该计算机程序被中央处理单元(CPU)1001执行时,执行本申请的系统中限定的上述功能。
[0210] 需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
[0211] 附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,前述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。附加地或备选地,可以省略某些模块/单元,将多个模块/单元合并为一个模块/单元执行,和/或将一个模块/单元分解为多个模块/单元执行。本申请实施例中,“第一”、“第二”等词语的限定,仅作为区别的理解。
[0212] 描述于本申请实施例中所涉及到的单元或模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,例如,可以描述为:一种处理器包括第一接收单元、第一发送单元以及第二发送单元。其中,这些单元或模块的名称在某种情况下并不构成对该单元或模块本身的限定,例如,第一接收单元还可以被描述为“用于接收包含智能合约的字节码的第一交易的单元”。
[0213] 作为另一方面,本申请还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中描述的电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中的。上述计算机可读存储介质存储有一个或者多个程序,当上述前述程序被一个或者一个以上的处理器用来执行描述于本申请的智能合约部署、调用方法。
[0214] 以上描述仅为本申请的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本申请中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离前述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本申请中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。