在区块链网络中执行事务的方法和装置与流程

文档序号:18081168发布日期:2019-07-06 10:05阅读:319来源:国知局
在区块链网络中执行事务的方法和装置与流程

概括地说,本公开的实施例涉及信息技术领域,更具体地说,涉及在区块链网络中执行事务的方法、装置及计算机可读存储介质。



背景技术:

区块链是用分布式数据库识别、传播和记载信息的智能化对等网络,也称为价值互联网。区块链具有去中心化、反篡改、数据一致性存储、过程透明可追踪等技术优势,其被认为在金融、征信、物联网、经济贸易结算、资产管理等众多领域都拥有广泛的应用前景。

智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议,其能够表现为在区块链上准确运行的计算机程序。用户通过使用智能合约进行事务、共享数据、建立信任,并由区块链技术的特性而保障数据的存储、读取以及执行整个过程透明可跟踪、不可篡改。

在区块链中,一种方式是通过调用智能合约来完成区块链事务。在一些情况下,智能合约的执行会依赖于区块链外部的数据源。在这种情况下,现有的方案是智能合约直接调用预言机(oracle)服务,预言机服务从真实世界中获取数据,然后返回结果给智能合约。然而,在例如事务需要多个参与方背书来执行的场景中,当多个背书节点同时访问同一个外部数据源时,无法确保各自返回一致的结果,导致该事务因无法通过一致性验证而失败。

因此,需要一种改进的在区块链网络中执行事务的方法。



技术实现要素:

总体上,本公开的实施例提供了在区块链网络中执行事务的方法、装置及计算机可读存储介质以至少部分地解决现有技术的上述及其它潜在问题。

在本公开的实施例的第一方面,提供了一种用于在区块链网络中执行事务的方法,所述方法包括:

从客户端接收事务请求,所述事务请求是由所述客户端向所述区块链网络的多个背书节点发送的,所述事务请求与应用智能合约相关联并且所述事务请求涉及对位于所述区块链网络外部的数据源的访问;

模拟执行所述应用智能合约;

将所述第一模拟执行结果返回至所述客户端;

其中,所述在模拟执行所述应用智能合约的过程中执行系统智能合约,以生成所述事务的第一模拟执行结果包括以下子步骤:

向位于所述区块链网络外部的代理节点发送访问请求;

从所述代理节点接收对应于所述访问请求的请求结果以及所述代理节点对所述请求结果的签名,所述请求结果是经所述代理节点证明来自所述数据源的;以及

根据所述请求结果以及所述代理节点对所述请求结果的签名来更新所述第一模拟执行结果的读集合。

在本公开的实施例的第二方面,提供了一种用于在区块链网络中执行事务的装置,所述装置包括:

处理器;以及

存储器,其用于存储指令,当所述指令被执行时使得所述处理器执行以下步骤:

从客户端接收事务请求,所述事务请求是由所述客户端向区块链网络的多个背书节点发送的,所述事务请求与应用智能合约相关联并且所述事务请求涉及对位于所述区块链网络外部的数据源的访问;

模拟执行所述应用智能合约;

在模拟执行所述应用智能合约的过程中执行系统智能合约,以生成所述事务的第一模拟执行结果;

将所述第一模拟执行结果返回至所述客户端;

其中,所述在模拟执行所述应用智能合约的过程中执行系统智能合约,以生成所述事务的第一模拟执行结果包括以下子步骤:

向位于所述区块链网络外部的代理节点发送访问请求;

从所述代理节点接收对应于所述访问请求的请求结果以及所述代理节点对所述请求结果的签名,所述请求结果是经所述代理节点证明来自所述数据源的;以及

根据所述请求结果以及所述代理节点对所述请求结果的签名来更新所述第一模拟执行结果的读集合。

在本公开的实施例的第三方面,提供了一种用于在区块链网络中执行事务的方法,所述方法包括:

在位于区块链网络外部的代理节点处,分别从所述区块链网络的多个背书节点接收对访问位于所述区块链网络外部的数据源的多个访问请求,所述多个访问请求对应于在所述多个背书节点处接收的相同事务请求;

所述代理节点通过位于所述区块链网络外部的预言机服务获得对应于所述多个访问请求的请求结果和由所述预言机服务生成的证明信息;

使用所述证明信息来验证所述请求结果是否可信地来自所述数据源;

在验证为可信的情况下,使用所述代理节点的私钥来生成对所述请求结果的签名;

将所述请求结果以及所述代理节点对所述请求结果的签名返回至所述多个背书节点以用于更新分别与所述相同事务请求相对应的多个模拟执行结果的读集合。

在本公开的实施例的第四方面,提供了一种用于在区块链网络中执行事务的装置,所述装置包括:

处理器;以及

存储器,其用于存储指令,当所述指令被执行时使得所述处理器执行以下步骤:

在位于区块链网络外部的代理节点处,分别从所述区块链网络的多个背书节点接收对访问位于所述区块链网络外部的数据源的多个访问请求,所述多个访问请求对应于在所述多个背书节点处接收的相同事务请求;

所述代理节点通过位于所述区块链网络外部的预言机服务获得对应于所述多个访问请求的请求结果和由所述预言机服务生成的证明信息;

使用所述证明信息来验证所述请求结果是否可信地来自所述数据源;

在验证为可信的情况下,使用所述代理节点的私钥来生成对所述请求结果的签名;

将所述请求结果以及所述代理节点对所述请求结果的签名返回至所述多个背书节点以用于更新分别与所述相同事务请求相对应的多个模拟执行结果的读集合。

在本公开的实施例的第五方面,提供了一种计算机可读存储介质。该计算机可读存储介质包括计算机可执行指令,所述计算机可执行指令在装置中运行时使得所述装置执行根据本公开的实施例的第一和第三方面描述的方法。

本公开的实施例提供了在区块链中支持多个背书节点访问同一链外数据源的方案,使得能够通过在多个背书节点处产生的与外部数据源相关的读集合的一致性来确保事务的执行。

附图说明

结合附图并参考以下详细描述,本公开各实施例的上述和其它特征、优点及方面将变得更加明显。在附图中,相同或相似的附图标记表示相同或相似的元素,其中:

图1示出了包括区块链网络和客户端的示例性环境100的示意图,可以在该示例性环境100中实现根据本公开的实施例的方法;

图2示出了根据本公开的实施例的示例性区块链节点200的示意图;

图3示出了根据本公开实施例的在区块链网络中执行事务的示例性方法300的流程图;

图4示出了根据本公开实施例的在区块链网络中执行事务的示例性方法400的流程图;

图5示出了根据本公开实施例的在区块链网络中执行事务的示例性装置500的示意图;

图6示出了根据本公开的实施例的在区块链网络中执行事务的方法的一个具体示例600;以及

图7示出了根据图6的具体示例600的示例性执行过程700。

具体实施方式

现将结合附图对本公开的实施例进行具体的描述。应当注意的是,附图中对相似的部件或者功能组件可能使用同样的数字标示。所附附图仅仅旨在说明本公开的实施例。本领域的技术人员可以在不偏离本公开精神和保护范围的基础上从下述描述得到替代的实施方式。

如本文中所述,术语“包括”及其各种变体可以被理解为开放式术语,其意味着“包括但不限于”。术语“基于”可以被理解为“至少部分地基于”。术语“一个实施例”可以被理解为“至少一个实施例”。术语“另一实施例”可以被理解为“至少一个其它实施例”。本文使用词语“示例性”表示“充当示例、实例或举例说明”。本文中被描述为“示例性”的任何实施例都并非必然解释为对于其它实施例而言是优选的或有优势的。

为了便于描述,下面对本公开中出现的一些术语进行说明,应当理解,本申请所使用的术语应解释为具有与其在本申请说明书的上下文及有关领域中的意义一致的意义。

本公开中的术语“peer节点”是指区块链网络中的一种记账节点,负责区块数据的校验和保存。同时在peer节点上,也可以安装和执行智能合约,对账本进行读写操作。

本公开中的术语“orderer节点”是指区块链网络中的一种排序节点,也可以被称为共识节点,其为区块链网络中的所有通道提供公共服务,将事务排序后组装为区块。orderer节点独立于peer节点运行,其被设计为支持共识算法。

本公开中的术语“committer节点”是指区块链网络中的一种提交节点,committer节点是peer节点的子类,负责对orderer节点排序后的事务进行检查,选择合法的事务执行并写入存储。

本公开中的术语“endorser节点”是指区块链网络中的一种背书节点,endorser节点是peer节点的子类,负责检验某个事务是否合法,是否愿意为之签名背书。

本公开中的术语“通道”是指构建在区块链网络上的两个或多个特定网络成员之间的通信的私有“子网”,每个通道拥有自己独立的账本,实现了数据的隔离和保密。通道私有的账本在通道中是与所有参与该通道的节点共享的,并且事务方必须通过该通道的相关验证后才能与该账本进行交互。

本公开中的术语“读集合(readset)”和“写集合(writeset)”是在endorser节点上的事务模拟期间产生的。读集合包含在模拟期间事务读取到的至少一个唯一key(唯一键)及对应版本。写集合包括事务改写的至少一个唯一key及对应的新的值。committer节点可利用读集合部分校验事务的有效性,利用写集合部分更新key的版本和值。

本公开中的术语“世界状态”是指包含事务执行结果的变量集合。

本公开中的术语“事务请求(transactionproposal)”是指在区块链上执行某种功能的请求,又称为“事务请求”或“事务提案”。

本公开中的术语“可信计算环境”(或称可信执行环境)”是指计算设备(例如,智能手机、平板电脑、机顶盒、智能电视等)上提供的一个安全区域,其可以保证加载到该环境内部的代码和数据的安全性、机密性以及完整性。可信计算环境提供一个隔离的执行环境,保护其不受恶意软件的攻击,使特权或者非特权的软件无法访问该环境,提供的安全特征包含:隔离执行、可信应用的完整性、可信数据的机密性、安全存储等。例如,由处理器级的软件防护扩展(softwareguardextensions,sgx)或安全加密虚拟化(secureencryptedvirtualization,sev)创建的安全环境可以理解为可信计算环境。应当理解,可信计算环境还可以包括通过类似技术形成的安全环境。

智能合约是运行在区块链节点(例如,peer节点)上的业务逻辑代码,是用来构建去中心化应用的基石。智能合约的运行需要一定的资源,通常其在沙盒中运行,沙盒是指智能合约的运行环境。该运行环境可以是完全隔离或部分隔离的。例如,沙盒可以是智能合约容器或虚拟机。

在本公开内容中,“应用智能合约”是指可用于区块链上的若干个用户或用户之间的事务行为的一种智能合约,“系统智能合约”是指区块链中可用于访问预言机服务以获取外部数据源的数据的一种智能合约。

在诸如fabric之类的区块链中,一种方式是通过调用智能合约来完成区块链事务。示例性的,其过程如下:事务发起方(例如,客户端)通过endorser节点收集好已经签名的事务仿真结果,并签名将其发给orderer节点。orderer节点收集一定数量的事务之后生成区块,然而将区块发送给committer节点。committer节点对区块中的事务进行逐个验证。在验证通过之后,则根据事务更新世界状态。如前所述,在一些情况下,智能合约的执行会依赖于区块链外部的数据源。在这种情况下,现有的方案是智能合约直接调用预言机服务,预言机服务从真实世界中获取数据,然后返回结果给智能合约。例如,对于涉及不同币种之间的商品交易的智能合约,需要将以人民币计价的商品价格换算成以其它币种计价的交易价格,然后将价格信息作为交易数据的一部分写入账本,因此该智能合约需要从区块链外部的数据源获取人民币对其它币种的当前汇率。然而,通过智能合约直接调用预言机服务的返回数据不会作为事务仿真结果的一部分(即读集合的一部分)被发向orderer节点进行排序出块。因此,在例如事务需要多个参与方背书来执行的场景中,当多个endorser节点同时访问同一个外部数据源时,无法确保各自返回一致的结果。如果智能合约依赖于预言机服务的返回结果进行计算,然后将计算结果写入账本,则多个endorser节点产生的事务仿真中的写集合必然会不一致,从而导致该事务因无法通过一致性验证而失败。

一种解决上述问题的方法是让其中一个参与方的endorser节点去访问预言机服务,然后其它参与方的节点被动地接受该结果并提交账本。但是该方法存在以下缺陷:1)在现有的区块链机制中,其它节点无法验证该计算结果的确是基于可信的外部数据得到的结果,原因是通过智能合约直接调用预言机服务的返回数据不会作为事务仿真结果的一部分(即读集合的一部分)被发向orderer节点进行排序出块;2)不能满足众多这样的业务场景,例如,一个事务的达成的确需要多个参与方背书;3)如果该endorser节点被恶意攻击,将会发生整个账本的数据被篡改或损害。

有鉴于此,本公开的实施例提供一种在区块链支持多个背书节点访问同一外部数据源的解决方案,实现了事务在需要多个参与方背书的情况下的执行。本公开的实施例可以应用于不同类型的区块链网络中。根据区块链参与方的不同,区块链通常被分为公有链、联盟链和私有链三种类型。公有链对外开放,用户无需任何授权就可以访问区块链网络和区块数据,发起各种事务。联盟链限制了只有联盟中的成员才能参与,区块链上的操作权限根据联盟定制的相关规则来确定。私有链一般在私有组织内部使用,区块链上的操作权限根据私有组织的自行规定执行。本公开的实施例以联盟链为示例来描述本公开的技术,但是应当理解,本公开的实施例也可以适用于其它类型的区块链。

图1示出了包括区块链网络120和客户端110的示例性环境100的示意图,可以在该示例性环境100上实现根据本公开的实施例的方法。区块链网络120包括多个orderer节点131、132和多个peer节点141、142、143、151、152、153。由于区块链技术具有去中心化、分布式的特性,各区块链节点可通过各种通信介质互相交换信息。示例性的,orderer节点负责收集事务进行排序并打包生成新的区块,从而保证各peer节点上的数据一致性。peer节点是参与事务的主体,代表每个参与到链上的成员,负责储存完整的账本数据,负责共识环节中的执行智能合约。客户端110可以连接到peer节点,用户通过客户端110访问peer节点以在区块链网络120上发起事务。

示例性的,peer节点中的一些节点可以是连接到orderer节点的endorser节点,或可以是连接到orderer节点的committer节点,或既是endorser节点又是committer节点,其中,endorser节点负责检验某个事务是否合法,是否愿意为之签名背书,committer节点负责对orderer节点排序后的事务进行检查,选择合法的事务执行并写入存储。例如,peer节点141、151、152可以充当endorser节点并与orderer节点131和132通信地耦合,且部署有智能合约,peer节点141、151、152可以充当committer节点并与orderer节点131和132通信地耦合,或者所有的peer节点141-143和151-153可以是committer节点。

此外,peer节点141-143可以形成组织140,peer节点151-153可以形成组织150,其中,组织代表一组拥有共同信任的证书的成员节点。组织140和150可以形成联盟,联盟表示由若干组织构成的集合,是联盟链场景下的结构形式。例如,组织140和150为了进行数据沟通可以加入到同一个通道,并且在某些peer节点安装或部署智能合约,并且将该智能合约实例化到该通道中,则这些peer节点成为该通道上的该智能合约的endorser节点。例如,可以在组织140的peer节点141和组织150的peer节点151处部署智能合约。

如图1所示,示例性环境100还包括位于区块链网络120外部的代理节点160、预言机服务170和数据源180。代理节点160可以与一个或多个peer节点通信地耦合,以响应来自peer节点对数据源180的访问请求,通过预言机服务170从数据源180获取数据,并将数据返回至peer节点。不同于现有的访问链外数据的方式,peer节点不是直接访问预言机服务170,而是通过代理节点160来访问预言机服务170,以使得当多个peer节点访问同一数据源时,能够确保返回一致的结果,如下文所描述的。例如,预言机服务170可以通过tlsnotary(诸如oraclize)或sgx(softwareguardextensions,软件防护扩展)(诸如towncrier)技术或其它适当的技术来实现,使得代理节点160能够根据从预言机服务170接收的由预言机服务170生成的证明信息来验证请求结果的确是来自外部数据源180。例如,数据源180可以包括根据地址信息而获取的数据,例如通过url(统一资源定位符)而从数据库获取的数据、通过搜索引擎而获取的数据、来自其它区块链(例如,与应用智能合约201所在的区块链不同的区块链)的数据、或以任何其它方式而获取的数据。

应当理解,图1中的区块链网络、客户端以及区块链网络节点仅是示意而非限制,其可以是任意数量。另外,在peer节点处可以部署任意数量的智能合约。可以理解,为了便于描述本公开的实施例,未具体示出和描述所熟知的区块链网络120的其它类型的节点以免不必要地模糊本公开实施例的方面。

图2示出了根据本公开的实施例的示例性区块链节点200的示意图。区块链节点200可以是图1的区块链网络120的peer节点中的endorser节点的一个示例。如图2所示,在区块链节点200处可以通过例如智能合约运行引擎来运行应用智能合约201以及系统智能合约202。可以理解,为了便于描述本公开的实施例,未具体示出和描述所熟知的区块链节点200的其它部件和过程以免不必要地模糊本公开实施例的方面。

应用智能合约201可以提供各种功能以应用于金融、征信、物联网、经济贸易结算、资产管理等,系统智能合约202用于通过预言机服务(例如,图1的预言机服务170)来访问外部数据源(例如,图1的数据源180)。另外,图2中的智能合约的数量仅是示意而非限制,其可以是任意数量。应用智能合约201可以被放置在例如沙盒(例如,容器或虚拟机)中运行,系统智能合约202可以被嵌入在系统内,例如部署在区块链节点200处。例如,运行在沙盒中的应用智能合约201可以通过接口来调用系统智能合约202以访问外部数据源。例如,对系统智能合约202的调用可以被嵌入在应用智能合约201中。

图3示出了根据本公开实施例的在区块链网络中执行事务的示例性方法300的流程图。可以在图1的示例性环境100中实现方法300。方法300可以由图1的peer节点中的endorser节点(诸如peer节点141)或图2的区块链节点200执行。下面将参照图1-图3来描述方法300。如流程图所示,方法300可以包括以下步骤:

步骤301:从客户端接收事务请求,事务请求是由客户端向区块链网络的多个背书节点发送的,事务请求与应用智能合约相关联并且事务请求涉及对位于区块链外部的数据源的访问。例如,用户通过客户端110向区块链网络120的多个peer节点141、151、152(作为endorser节点)发送事务请求,该事务请求与应用智能合约(例如,图2的应用智能合约201)相关联,并且要求从位于区块链网络120外部的数据源180获取数据。在多个peer节点141、151、152中的每个节点(例如,peer节点151)处,从客户端接收该事务请求。

步骤302:模拟执行应用智能合约。例如,在peer节点151处可以基于事务请求来模拟执行相关联的应用智能合约。

步骤303:在模拟执行应用智能合约的过程中执行系统智能合约,以生成事务的第一模拟执行结果。例如,在peer节点151处可以基于事务请求来模拟执行相关联的应用智能合约,由于要求从外部数据源180获取数据,在模拟执行应用智能合约的过程中,可以通过调用并执行系统智能合约(例如,图2的系统智能合约202)来从数据源180获取数据,从而生成事务的第一模拟执行结果。例如,运行在沙盒中的应用智能合约可以通过接口来调用并执行系统智能合约以访问数据源180。

步骤303进一步包括以下子步骤:在子步骤303-1,向位于区块链网络外部的代理节点发送访问请求;在子步骤303-2,从代理节点接收对应于访问请求的请求结果以及代理节点对请求结果的签名,请求结果是经代理节点证明来自数据源的;以及在子步骤303-3,根据请求结果以及代理节点对请求结果的签名来更新第一模拟执行结果的读集合。例如,在执行系统智能合约的过程中,通过系统智能合约与位于区块链网络120外部的代理节点160之间的交互,来从数据源180获取数据,交互过程可以包括:系统智能合约向代理节点160发送访问请求,并且从代理节点160接收对应于该访问请求的请求结果以及代理节点160对请求结果的签名,该请求结果是经代理节点160证明来自数据源的。例如,代理节点160可以在接收到访问请求后向预言机服务170发送服务请求(例如,根据数据源的访问地址来发送服务请求,或服务请求包括数据源的访问地址,等等),转而预言机服务170可以基于接收到的服务请求向数据源180发送数据请求以从数据源180获取数据结果,并从数据源180将数据结果返回至预言机服务170。随后,预言机服务170可以生成证明信息以证明数据结果是可信地来自数据源180并将该证明信息和请求结果(例如,数据结果等)返回至代理节点160,代理节点170可以使用该证明信息来验证请求结果是否可信地来自于数据源180,并且在验证为可信的情况下,代理节点170可以使用其私钥对请求结果进行签名,并将请求结果和签名返回至系统智能合约,从而可以在peer节点151处使用代理节点170的公钥来检查请求结果(例如,代理节点170的公钥可以由peer节点151获取)是否由代理节点170生成以及验证请求结果的完整性。随后,在peer节点151处,根据请求结果以及代理节点170对请求结果的签名来更新第一模拟执行结果的读集合。不同于现有的区块链技术中通过智能合约直接调用预言机服务的返回数据不会作为模拟执行结果的一部分(即读集合的一部分)被发向orderer节点进行排序出块,在该步骤303的上述子步骤中,从外部数据源返回的请求结果将用于更新模拟执行结果的一部分(即读集合的一部分)以被发向orderer节点进行排序出块,从而使得多个节点可以验证计算结果的确是基于可信的外部数据得到的结果,并且可以验证读集合的一致性以确保事务的执行。

步骤304:将第一模拟执行结果返回至客户端。例如,在peer节点151处,将第一模拟执行结果返回至客户端110。

在一些实施例中,访问请求可以包括请求标识信息、数据源的访问地址以及背书策略,其中,请求标识信息用于标识访问请求并被记录在通道账本中。访问请求可以包括请求标识信息,该请求标识信息被记录在通道账本中以唯一地标识访问请求(例如,确保全局唯一,使得与相同事务请求相关的多个访问请求是一致的)。访问请求还可以包括数据源的访问地址,以使得可以代理节点160(以及预言机服务170)根据访问地址从数据源获取数据,例如通过url(统一资源定位符)从数据库获取数据、通过搜索引擎的链接地址来获取数据、从区块链网络120外部的其它区块链(例如,与应用智能合约201所在的区块链不同的区块链)获取数据等等。访问请求还可以包括背书策略,以使得代理节点160可以聚合多个访问请求,例如根据背书策略来判断是否还有其它参与方(例如,组织)的背书节点发送同样的对数据源的访问请求,以便在接收到所有的背书节点的访问请求或至少满足背书策略所规定的背书节点要求(例如,特定的背书节点、数量、其组合等)的访问请求之后,根据访问请求(例如,其所包括的数据源的访问地址等)来调用预言机服务170,以确保返回的请求结果的一致性。

在一些实施例中,根据请求结果以及代理节点对请求结果的签名来更新第一模拟执行结果的读集合可以包括:生成记录,该记录的类型为链外类型,其中,该记录可以包括但不限于:请求标识信息、数据源的访问地址、请求结果、代理节点对请求结果的签名;以及将该记录写入第一模拟执行结果的读集合。例如,代理节点170可以针对请求结果生成记录并将记录写入第一模拟执行结果的读集合中。例如,可以以键(key)-值(value)对的形式存储该记录,记录的key为请求标识信息,value为数据源的访问地址、请求结果、代理节点160对请求结果的签名等,键-值类型(即记录类型)为链外类型,以区别于其它类型的记录(例如,链上类型的记录,其记录链上数据)。通过将基于请求结果的记录写入模拟执行结果的读集合中,可以通过验证读集合中的记录的一致性来确保事务的执行。

在一些实施例中,方法300还可以包括:接收包括事务的区块,事务包括分别来自多个背书节点的、对应于事务请求的多个模拟执行结果;验证事务中的多个读集合,该多个读集合分别与多个模拟执行结果相对应;在验证通过的情况下,根据事务中的多个写集合来更新世界状态,该多个写集合分别与多个模拟执行结果相对应。例如,客户端110将从多个peer节点141、151和152接收到的多个模拟执行结果(其包括相应的多个读集合)封装在一个事务中,并向orderer节点131发送该事务,orderer节点131在接收若干个事务后对事务进行排序并打包生成区块,之后发送给区块链网络120中的peer节点151(作为committer节点),peer节点151在接收到包括与事务请求相对应的事务后,经由验证事务的多个读集合来确定事务的有效性,当事务有效时执行事务,即根据事务的多个写集合来更新世界状态。

在一些实施例中,验证事务中的多个读集合可以包括:读取多个读集合中的一个读集合的记录;如果该记录的类型是链外类型,则验证该一个读集合中的该记录与该多个读集合中的其它读集合的相应记录中包括的代理节点的签名,并验证该一个读集合中的该记录与该多个读集合中的其它读集合的相应记录中包括的其余部分是否完全一致,或者如果该记录的类型不是链外类型,则基于世界状态验证该多个读集合中的相应记录。在该步骤中,根据事务的读集合中的记录的类型来不同地验证事务的有效性:对于链外类型的记录,需要验证每个背书节点的该记录中代理节点的签名(例如,使用代理节点的公钥来验证)是否有效以检查请求结果是否由代理节点生成并验证请求结果的完整性,并且验证每一个背书节点的该记录中的其它部分是否完全一致(例如,记录中包括的请求标识信息、数据源的访问地址、请求结果等);对于非链外类型的记录,则可以类似于现有区块链技术中的处理,基于世界状态验证多个读集合中的相应记录,例如将记录中的唯一键的版本与世界状态中的相应键的版本进行比较来验证该记录。

在一些实施例中,方法300还可以包括:验证事务的发送者的签名;验证事务的背书签名及背书签名数量是否满足背书策略的要求。例如,peer节点151验证事务的发送者的签名是否合法,验证事务的背书签名以及背书签名数量是否满足签名策略的要求(例如,是否得到一定数量的背书签名,背书签名是否来自指定的endorser节点等)。

在一些实施例中,方法300还可以包括:在调用系统智能合约之前,部署系统智能合约。例如,系统智能合约在调用之前被部署在多个peer节点141、151、152处。

通过图3所描述的本公开的实施例,提供了在区块链中支持多个背书节点访问同一链外数据源的方案,使得能够通过在多个背书节点处产生的与外部数据源相关的读集合的一致性来确保事务的执行。

图4示出了根据本公开实施例的在区块链网络中执行事务的示例性方法400的流程图。可以在图1的示例性环境100中实现方法400。方法400可以由图1的代理节点160执行。下面将参照图1、图2和图4来描述方法400。如流程图所示,方法400可以包括以下步骤:

步骤401:在位于区块链网络外部的代理节点处,分别从区块链网络的多个背书节点接收对访问位于区块链网络外部的数据源的多个访问请求,多个访问请求对应于在多个背书节点处接收的相同事务请求。例如,用户通过客户端110向区块链网络120的多个peer节点141、151、152(作为endorser节点)发送事务请求,该事务请求与应用智能合约(例如,图2的应用智能合约201)相关联并且要求从位于区块链网络120外部的数据源180获取数据。多个peer节点141、151、152在接收到该事务请求后,在模拟执行应用智能合约的过程中,调用并执行系统智能合约(例如,图2的系统智能合约202)。多个peer节点141、151、152在执行系统智能合约的过程中,向位于区块链网络120外部的代理节点160发送与该相同事务请求相对应的多个访问请求以访问数据源180。在代理节点160处,从多个peer节点141、151、152接收该多个访问请求。

步骤402:代理节点通过位于区块链网络外部的预言机服务获得对应于多个访问请求的请求结果和由预言机服务生成的证明信息。例如,代理节点160在接收到多个访问请求(或者其中的一个或多个)后向预言机服务170发送服务请求(例如,根据数据源的访问地址来发送服务请求,或服务请求包括数据源的访问地址,等等),转而预言机服务170可以基于接收到的服务请求向数据源180发送数据请求以从数据源180获取数据结果,并从数据源180将数据结果返回至预言机服务170。随后,预言机服务170可以生成证明信息以证明数据结果是可信地来自数据源180并将该证明信息和请求结果(例如,数据结果等)返回至代理节点160。

步骤403:使用证明信息来验证请求结果是否可信地来自该数据源。例如,代理节点170可以使用该证明信息来验证请求结果是否可信地来自于数据源180。

步骤404:在验证为可信的情况下,使用代理节点的私钥来生成对请求结果的签名。例如,在验证为可信的情况下,代理节点170可以使用其私钥对请求结果进行签名。

步骤405:将请求结果以及代理节点对请求结果的签名返回给多个背书节点以用于更新分别与相同事务请求相对应的多个模拟执行结果的读集合。例如,在验证为可信的情况下,代理节点160将请求结果和签名返回至该多个peer节点141、151、152(例如,运行在这些peer节点处的系统智能合约),从而可以在该多个peer节点141、151、152处使用代理节点170的公钥来验证请求结果(例如,代理节点170的公钥可以由该多个peer节点141、151、152获取)。

在一些实施例中,多个访问请求中的每一个可以包括请求标识信息、数据源的访问地址以及背书策略,其中,请求标识信息用于标识访问请求并被记录在通道账本中。访问请求可以包括请求标识信息,该请求标识信息被记录在通道账本中以唯一地标识访问请求(例如,确保全局唯一,使得与相同事务请求相关的多个访问请求是一致的)。访问请求还可以包括数据源的访问地址,以使得可以代理节点160(以及预言机服务170)根据访问地址从数据源获取数据,例如通过url(统一资源定位符)从数据库获取数据、通过搜索引擎的链接地址来获取数据、从区块链网络120外部的其它区块链(例如,与应用智能合约201所在的区块链不同的区块链)获取数据等等。访问请求还可以包括背书策略,以使得代理节点160可以聚合多个访问请求,例如根据背书策略来判断是否还有其它参与方(例如,组织)的背书节点发送同样的对数据源的访问请求,以便在接收到所有的背书节点或至少满足背书策略所规定的背书节点要求(特定的背书节点、数量、其组合等)的一个或多个背书节点的访问请求之后,根据访问请求(例如,其所包括的数据源的访问地址等)来调用预言机服务170,以确保返回的请求结果的一致性。

在一些实施例中,代理节点可以由对区块链网络进行管理的baas(blockchainasaservice,区块链即服务)平台实现。例如,代理节点160可以由对区块链网络120进行管理的baas平台(图中未示出)来实现。

在一些实施例中,代理节点可以运行在可信计算环境中。例如,通过在可信计算环境中运行代理节点160,可以提供隔离的执行环境,保护其不受恶意软件的攻击,使特权或者非特权的软件无法访问该环境。例如,这种可信计算环境的安全性服务可以容易地通过硬件级(例如,诸如中央处理器(cpu)之类的处理器等)安全技术来实现或升级。

通过图4所描述的本公开的实施例,提供了在区块链中支持多个背书节点访问同一链外数据源的方案,使得能够通过代理节点来确保针对多个背书节点对外部数据源的请求而向多个背书节点返回的数据一致性,以便通过在多个背书节点处产生的与外部数据源相关的读集合的一致性来确保事务的执行。

图5示出了根据本公开实施例的在区块链网络中执行事务的示例性装置500的示意图。装置500可以包括:存储器501和耦合到存储器501的处理器502。存储器501用于存储指令,处理器502被配置为基于存储器501存储的指令来实现本文所描述的各种方法(如图3的方法300、图4的方法400和图6的具体示例600)中的一个或多个动作或步骤。

存储器501可以包括易失性存储器和非易失性存储器,诸如rom(readonlymemory)、ram(randomaccessmemory)、移动盘、磁盘、光盘和u盘等。处理器502可以是中央处理器(cpu)、微控制器、专用集成电路(asic)、数字信号处理器(dsp)、现场可编程门阵列(fpga)或其它可编程逻辑器件、或是被配置为实现本公开的实施例的一个或多个集成电路。

为了更好地表达本公开的构思,下面结合一个具体的示例来进行说明。

图6示出了根据本公开的实施例的在区块链网络中执行事务的方法的一个具体示例600。示例600示出了客户端601、区块链网络的peer节点602和603、位于区块链网络外部的代理节点604、外部预言机服务605和外部数据源606。在该示例600中,用户为了发起事务通过客户端601向peer节点602和603(作为endorser节点)发送事务请求,该事务请求与应用智能合约611相关联,并涉及对外部数据源606的访问。在每个peer节点602、603处,在模拟执行应用智能合约611的过程中,调用并执行系统智能合约612以访问外部数据源606以获取数据。每个系统智能合约612向外部的代理节点604发送访问请求以经由外部预言机服务605从外部数据源606获取数据。每个peer节点602和603处的系统智能合约612在接收到对应于访问请求的请求结果后,利用该请求结果来更新模拟执行结果的读集合,随后每个peer节点602和603向客户端601返回相应的模拟执行结果。下面将结合图7描述图6的具体示例600。

图7示出了根据图6的具体示例600的示例性执行过程700。除了图6中示出的那些之外,图7中还包括区块链网络的orderer节点607和committer节点608。如图7的过程700所示,用户为了发起事务通过客户端601向endorser节点602和603发送事务请求610,事务请求610与应用智能合约611相关联,并且涉及对外部数据源606的访问,随后在模拟执行应用智能合约611的过程中调用并执行系统智能合约612以访问外部数据源606。

在endorser节点602处,系统智能合约612向代理节点604发送第一访问请求615,并且在endorser节点603处,系统智能合约612向代理节点604发送第二访问请求620。第一和第二访问请求615、620中的每一个可以包括但不限于:请求标识信息、外部数据源606的访问地址以及背书策略。请求标识信息可以用于标识访问请求并被记录在通道账本中,并且与相同事务请求的相对应的访问请求可以具有相同的请求标识信息。

代理节点604可以聚合多个访问请求,例如根据背书策略来判断是否还有其它参与方(例如,组织)的endorser节点发送同样的对数据源的访问请求,以便在接收到所有的endorser节点或至少满足背书策略所规定的endorser节点要求(特定的endorser节点、数量、其组合等)的一个或多个endorser节点的访问请求之后,根据访问请求(例如,其所包括的外部数据源的访问地址等)来调用预言机服务605。例如,代理节点604在聚合第一和第二访问请求615、620后,向外部预言机服务605发送服务请求625(例如,根据外部数据源606的访问地址来发送服务请求625,或服务请求625包括外部数据源606的访问地址,等等)。

转而,预言机服务170可以基于接收到的服务请求625向外部数据源606发送数据请求630,并从外部数据源180向外部预言机服务605返回对应于数据请求630的数据结果635。外部预言机服务605生成请求结果(其包括数据结果等)和证明信息(其可用于证明请求结果的确是来自外部数据源606)640,并将请求结果和证明信息640返回给代理节点604。

代理节点604可以使用证明信息来验证请求结果是否可信地来自外部数据源606,如果通过验证(即,验证为可信的情况下),代理节点604使用其私钥对请求结果进行处理以生成签名信息,并将请求结果和签名信息645分别返回给endorser节点602和603处的系统智能合约612,该签名信息可以用于检查请求结果是否由代理节点604生成以验证请求结果的完整性。

随后,在各个endorser节点602、603处,系统智能合约612可以利用请求结果和签名信息645来分别更新第一模拟执行结果650和第二模拟执行结果655的读集合。例如,系统智能合约612针对请求结果和签名信息645生成一条记录写入模拟执行结果的读集合中,例如,可以以键(key)-值(value)对的形式存储该记录,键-值类型(即记录类型)为链外类型,记录的key为请求标识信息,value为外部数据源606的访问地址、请求结果、代理节点604对请求结果生成的签名信息等。接着,各个endorser节点602、603分别将(经背书签名的)第一、第二模拟执行结果650、655返回给客户端601。

客户端601在接收到来自endorser节点602和603的第一和第二模拟执行结果650、655之后,客户端601将这些模拟执行结果封装在一个事务660中,并向orderer节点607发送该事务660。orderer节点607在收集一定数目的事务(或者超时)之后生成区块665,然后将区块665发送给committer节点608以进行事务验证。

例如,committer节点608可以是endorser节点602和/或603。以committer节点608是endorser节点602为例,endorser节点602读取区块665中包括的事务660,并验证事务660中的与第一、第二模拟执行结果650、660相对应的多个读集合。验证事务660中的该多个读集合可以包括验证每个读集合中的记录,如果发现记录的类型为链外类型,则可以使用例如代理节点604的公钥来验证代理节点604对于该记录中的签名信息,并验证每个读集合的该记录的其余部分是否完全一致,或者如果发现该记录的类型不是链外类型,则可以如现有逻辑一样,基于世界状态验证每个读集合中的该记录(即,验证读集合中的唯一键列表中的各个唯一键的版本与世界状态中的相应键的版本是否相同)。如果读集合中的每个记录都被验证通过,则事务660被标记为有效,并使用事务的多个写集合来更新世界状态,否则事务660无效,不更新世界状态。

在一些示例中,图6和图7中的代理节点604可以由对区块链网络进行管理的baas平台(未示出)实现。在一些示例中,代理节点604可以运行在可信计算环境中,从而提供隔离的执行环境,保护其不受恶意软件的攻击,使特权或者非特权的软件无法访问该环境。

此外,应当理解,图6和图7中的endorser节点的数量仅用于举例说明而非限制本公开,本公开的实施例同样适合于多于两个endorser节点的场景。

与现有技术相比,根据图6的示例600和图7的示例性执行过程,提供了在区块链中支持多个背书节点访问同一链外数据源的方案,使得能够通过在多个背书节点处产生的与外部数据源相关的读集合的一致性来确保事务的执行。

一般而言,本公开的各种示例实施例可以在硬件或专用电路、软件、固件、逻辑,或其任何组合中实施。某些方面可以在硬件中实施,而其它方面可以在可以由控制器、微处理器或其它计算设备执行的固件或软件中实施。当本公开的实施例的各方面被图示或描述为框图、流程图或使用某些其它图形表示时,将理解此处描述的方框、装置、系统、技术或方法可以作为非限制性的示例在硬件、软件、固件、专用电路或逻辑、通用硬件或控制器或其它计算设备,或其某些组合中实施。

作为示例,可以用通用处理器、dsp、asic、fpga或其它可编程逻辑器件、分立门或者晶体管逻辑、分立硬件组件或用于执行本文所述的功能的任意组合来实现或执行结合本公开所描述的各种示例性的逻辑块、模块和电路。通用处理器可以是微处理器,或者,处理器也可以是任何普通的处理器、控制器、微控制器或者状态机。处理器也可以实现为计算设备的组合,例如,dsp和微处理器的组合、多个微处理器、一个或多个微处理器与dsp内核的结合,或者任何其它此种结构。

作为示例,本公开的实施例可以在机器可执行指令的上下文中被描述,机器可执行指令诸如包括在目标的真实或者虚拟处理器上的器件中执行的程序模块中。一般而言,程序模块包括例程、程序、库、对象、类、组件、数据结构等,其执行特定的任务或者实现特定的抽象数据结构。在各实施例中,程序模块的功能可以在所描述的程序模块之间合并或者分割。用于程序模块的机器可执行指令可以在本地或者分布式设备内执行。在分布式设备中,程序模块可以位于本地和远程存储介质二者中。

用于实现本公开的方法的计算机程序代码可以用一种或多种编程语言编写。这些计算机程序代码可以提供给通用计算机、专用计算机或其它可编程的数据处理装置的处理器,使得程序代码在被计算机或其它可编程的数据处理装置执行的时候,引起在流程图和/或框图中规定的功能/操作被实施。程序代码可以完全在计算机上、部分在计算机上、作为独立的软件包、部分在计算机上且部分在远程计算机上或完全在远程计算机或服务器上执行。

在本公开的上下文中,机器可读介质可以是包含或存储用于或有关于指令执行系统、装置或设备的程序的任何有形介质。机器可读介质可以是机器可读信号介质或机器可读存储介质。机器可读介质可以包括但不限于电子的、磁的、光学的、电磁的、红外的或半导体系统、装置或设备,或其任意合适的组合。机器可读存储介质的更详细示例包括带有一根或多根导线的电气连接、便携式计算机磁盘、硬盘、ram、rom、可擦除可编程只读存储器(eprom或闪存)、光存储设备、磁存储设备,或其任意合适的组合。

另外,尽管操作以特定顺序被描绘,但这并不应该理解为要求此类操作以示出的特定顺序或以相继顺序完成,或者执行所有图示的操作以获取期望结果。在某些情况下,多任务或并行处理会是有益的。同样地,尽管上述讨论包含了某些特定的实施细节,但这并不应解释为限制任何发明或权利要求的范围,而应解释为对可以针对特定发明的特定实施例的描述。本说明书中在分开的实施例的上下文中描述的某些特征也可以整合实施在单个实施例中。反之,在单个实施例的上下文中描述的各种特征也可以分离地在多个实施例或在任意合适的子组合中实施。

虽然已经参考若干具体实施例描述了本公开的实施例,但是应该理解,本公开的实施例不限于所公开的具体实施例。本公开的实施例旨在涵盖在所附权利要求的精神和范围内所包括的各种修改和等同布置。所附权利要求的范围符合最宽泛的解释,从而包含所有这样的修改及等同结构和功能。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1