发明内容
本说明书实施例旨在提供一种更有效的在Fabric区块链中调用和预执行链码的方案,以解决现有技术中的不足。
为实现上述目的,本说明书一个方面提供一种在Fabric区块链中调用链码的方法,所述Fabric区块链中包括客户端节点和背书节点,所述方法由所述客户端节点执行,包括:
生成第一交易的交易提案,所述交易提案中包括对所述第一链码的调用,所述第一链码中包括对第二链码的调用,所述第二链码中包括对预定系统链码的调用,所述预定系统链码用于在执行时获取正在执行的交易的交易提案;
向所述背书节点发送所述第一交易的交易提案。
在一种实施方式中,所述方法还包括,在生成第一交易的交易提案之后,生成对所述交易提案的签名,其中,向所述背书节点发送所述第一交易的交易提案包括,向所述背书节点发送所述第一交易的交易提案和所述签名。
本说明书另一方面提供一种在Fabric区块链中预执行链码的方法,所述Fabric区块链中包括客户端节点和背书节点,所述方法由所述背书节点执行,包括:
从客户端节点接收第一交易的交易提案,所述交易提案中包括对第一链码的调用,所述第一链码中包括对第二链码的调用,所述第二链码中包括对预定系统链码的调用;
在开始预执行所述第一交易中的第二链码之后,通过预执行所述预定系统链码,获取所述第一交易的交易提案;
从所述交易提案中获取所述第一链码的名称;
基于所述第一链码的名称进行相应的处理。
在一种实施方式中,所述第二链码仅用于被预定链码调用,其中,基于所述第一链码的名称进行相应的处理包括,判断所述第一链码是否为所述预定链码,基于所述判断的结果确定是否结束对所述第二链码的预执行。
在一种实施方式中,基于所述第一链码的名称进行相应的处理包括,将所述第一链码的名称写入所述交易的读集或写集中。
在一种实施方式中,所述第二链码为用于发送跨链消息的链码。
在一种实施方式中,从客户端节点接收第一交易的交易提案包括,从客户端节点接收第一交易的交易提案和所述客户端节点对所述交易提案的签名,所述方法还包括,对所述签名进行验证。
本说明书另一方面提供一种在Fabric区块链中调用链码的装置,所述Fabric区块链中包括客户端节点和背书节点,所述装置部署于所述客户端节点,包括:
生成单元,配置为,生成第一交易的交易提案,所述交易提案中包括对所述第一链码的调用,所述第一链码中包括对第二链码的调用,所述第二链码中包括对预定系统链码的调用,所述预定系统链码用于在执行时获取正在执行的交易的交易提案;
发送单元,配置为,向所述背书节点发送所述第一交易的交易提案。
在一种实施方式中,所述装置还包括,签名单元,配置为,在生成第一交易的交易提案之后,生成对所述交易提案的签名,其中,所述发送单元还配置为,向所述背书节点发送所述第一交易的交易提案和所述签名。
本说明书另一方面提供一种在Fabric区块链中预执行链码的装置,所述Fabric区块链中包括客户端节点和背书节点,所述装置部署于所述背书节点,包括:
接收单元,配置为,从客户端节点接收第一交易的交易提案,所述交易提案中包括对第一链码的调用,所述第一链码中包括对第二链码的调用,所述第二链码中包括对预定系统链码的调用;
第一获取单元,配置为,在开始预执行所述第一交易中的第二链码之后,通过预执行所述预定系统链码,获取所述第一交易的交易提案;
第二获取单元,配置为,从所述交易提案中获取所述第一链码的名称;
处理单元,配置为,基于所述第一链码的名称进行相应的处理。
在一种实施方式中,所述第二链码仅用于被预定链码调用,其中,所述处理单元还配置为,判断所述第一链码是否为所述预定链码,基于所述判断的结果确定是否结束对所述第二链码的预执行。
在一种实施方式中,所述处理单元还配置为,将所述第一链码的名称写入所述交易的读集或写集中。
在一种实施方式中,所述接收单元还配置为,从客户端节点接收第一交易的交易提案和所述客户端节点对所述交易提案的签名,所述装置还包括,验证单元,配置为,对所述签名进行验证。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序或指令,当所述计算机程序或指令在计算机中执行时,令计算机执行上述任一种方法。
本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有计算机程序或指令,所述处理器在执行所述计算机程序或指令时,实现上述任一种方法。
通过根据本说明书实施例的调用和执行链码的方案,通过在被调用链码中写入系统链码接口GetSignedProposal进行系统链码调用,获取原始提案的内容,并从中提取调用的链码的名称,从而识别调用方链码的身份,以便于基于该调用方链码的名称进行后续处理。
具体实施方式
下面将结合附图描述本说明书实施例。
图1示出根据本说明书实施例的Fabric区块链系统的示意图。如图1中所示,所述系统中包括用户设备12和Fabric区块链中的通道11。其中,用户设备12可以为Fabric区块链的客户端节点,其可以为Fabric区块链的使用用户的设备,其它区块链的节点设备、或者用于在多个区块链之间中转消息的中继器的设备等等,在此不作限定。通道11中例如包括作为背书节点的节点设备1、节点设备2和节点设备3。如上文所述,用户设备12可通过向通道11中的至少一个背书节点发送交易提案以向通道11的账本数据中存入数据。所述交易提案例如为交易1的交易提案,该交易提案中包括对链码1的调用。链码1例如为跨链转账链码,其中调用链码2,链码2例如为用于发送跨链消息的链码,链码1通过调用链码2,而将跨链转账的消息发送给链外。如上文所述,在现有技术中,在执行链码2时,并不能获知是哪个链码调用了链码2,从而使得不能链码2无法获取链码1的名称,从而影响跨链转账的实施。在本说明书实施例中,通过在链码2中调用系统链码3(即通过系统链码接口GetSignedProposal进行调用),从而可获取交易1的交易提案,并从该交易提案中获取链码1的名称,从而便于对跨链转账的实施。
在用户设备12向节点设备1-3发送了交易1的交易提案之后,各个节点设备预执行交易1,生成预执行交易1的读写集,对该读写集进行签名,并将读写集及其签名发送回用户设备12。图1中示意示出在背书节点2中预执行交易1的过程示意图,在执行交易1的过程中,执行其中调用的链码1,之后执行链码1中的链码2。在执行链码2的过程中,通过执行其中调用的系统链码3,从而获取交易1的交易提案,从该交易提案中获取链码1的名称,并基于该链码1的名称继续执行链码2,例如,将链码1的名称写入预执行交易1的读集或写集中,从而该链码1的名称可在后续存入通道11的账本数据中。链下设备在从通道11中查询到该账本数据之后,可从其中读取到该链码1的名称,并基于该链码1的名称进行相应的处理。
可以理解,上文参考图1的描述仅仅是示意性的,而不是限制性的。下面将详细描述根据本说明书实施例的调用和执行链码的方法。
图2示出根据本说明书实施例的一种在Fabric区块链中调用链码的方法流程图,所述Fabric区块链中包括作为客户端节点的用户设备12和作为背书节点的节点设备2,所述方法由用户设备12执行,包括:
步骤S202,生成交易1的交易提案,所述交易提案中包括对所述链码1的调用,所述链码1中包括对链码2的调用,所述链码2中包括对系统链码3的调用,所述系统链码3用于在执行时获取正在执行的交易的交易提案;
步骤S204,向节点设备2发送交易1的交易提案。
首先,步骤S202,生成交易1的交易提案,所述交易提案中包括对所述链码1的调用,所述链码1中包括对链码2的调用,所述链码2中包括对系统链码3的调用,所述系统链码3用于在执行时获取正在执行的交易的交易提案。
在一种实施方式中,如上文所述,链码1例如为跨链转账链码,链码2例如为用于发送跨链消息的链码,链码1通过调用链码2,而将跨链转账的消息发送给链外。当用户设备12对应的用户1希望对另一个区块链(或该Fabric区块链的另一个通道)中的用户2进行转账时,用户1通过用户设备12生成交易1的交易提案,在该交易提案中调用链码1,对该链码1传入待转出本通道的金额数、接收转账的区块链和区块链账户(即用户2账户)作为传入参数。链码1中调用链码2,以用于向通道11的账本数据库中存入链码1的名称、所述金额、接收转账的区块链标识和区块链账户,以向链外发送该消息。链码2中预先写入了系统链码3的系统调用接口GetSignedProposal,从而链码2在被预执行时可通过该调用接口预执行系统链码3,从而获取由用户1发出的经用户1签名的交易提案,从中获取链码1的名称,并基于链码1的名称生成上述向链外发送的消息。
可以理解,在该实施方式中,在通道11中不限于仅由链码1调用链码2以向链外发送消息。如上文所述,通道11中可能包括多个客户链码,链码2为第三方服务链码,各个客户链码都可以调用链码2,以使用该链码提供的跨链发送消息的服务。
在一种实施方式中,所述链码2不限于为用于跨链业务的链码,其也可以为用于通道11内的业务的链码。例如,链码1为用于进行人民币-美元兑换的链码,链码1的账户状态中记录了各个用户的人民币账户余额,链码2为用于进行美元-人民币兑换的链码,链码2的账户状态中记录了各个用户的美元账户余额。在该实施方式中,当用户1希望进行将其人民币账户中的预定金额兑换成美元时,其生成交易1的交易提案,其中,在该交易提案中调用链码1,以将要兑换的人民币金额作为该链码1的传入参数。同样地,链码2中通过写入系统接口GetSignedProposal以调用系统链码3,从而链码2在预执行时可通过预执行系统链码3获取调用其的链码的名称,并确定该名称是否为链码1的名称,如果是链码1的名称,则可以继续执行,如果不是,则结束执行。也就是说,在该实施方式中,为了保证资金兑换的安全性,链码2只允许由链码1对其进行调用,链码2在执行时需要获取调用其链码的名称以判断该链码是否为链码1,从而,链码2通过调用系统链码3来获取调用其的链码的名称。
用户设备12在生成交易1的交易提案之后,使用其通道11的区块链账户的私钥对该交易提案进行签名。
在步骤S204,向节点设备2发送交易1的交易提案。
用户设备12在生成交易1的交易提案之后,可将该交易提案发送给至少一个背书节点(即背书节点的节点设备),例如,用户设备12向图1中的节点设备2发送交易1的交易提案。具体是,用户设备12在生成交易1的交易提案及其签名之后,将交易提案及其签名发送给至少一个背书节点。
图3示出根据本说明书实施例的一种在Fabric区块链中预执行链码的方法流程图,所述Fabric区块链中包括作为客户端节点的用户设备12和作为背书节点的节点设备2,所述方法由节点设备2执行,包括:
步骤S302,从用户设备12接收交易1的交易提案,所述交易提案中包括对链码1的调用,所述链码1中包括对链码2的调用,所述链码2中包括对系统链码3的调用;
步骤S304,在开始预执行交易1中的链码2之后,通过预执行系统链码3,获取交易1的交易提案;
步骤S306,从所述交易提案中获取所述链码1的名称;
步骤S308,基于链码1的名称进行相应的处理。
如上文所述,在Fabric区块链中,包括对交易的预执行过程和对交易的提交过程,在预执行过程中,由背书节点对交易进行预执行,获取预执行的读写集,但是并不将该读写集存入账本数据中,在提交过程中,基于交易顺序对各个交易的预执行进行验证,在验证通过的情况中,标记该交易有效,并将交易的交易提案、读写集和交易执行状态(即交易是否有效)存入账本数据中。因此,在Fabric区块链中,对交易的预执行过程也即为对交易的执行过程。
首先,在步骤S302,从用户设备12接收交易1的交易提案,所述交易提案中包括对链码1的调用,所述链码1中包括对链码2的调用,所述链码2中包括对系统链码3的调用。
在该步骤中,对交易1的具体描述可参考上文对步骤S202的描述,在此不再赘述。节点设备2除了从用户设备12接收交易1的交易提案之外,还接收用户设备12对该交易提案的签名。
步骤S304,在开始预执行交易1中的链码2之后,通过预执行系统链码3,获取交易1的交易提案。
在预执行所述交易1之前,节点设备2可使用用户设备12对应的公钥对接收的交易提案的签名进行验证,以验证该交易提案是否由用户设备12发出,该交易提案的内容是否经过篡改。
节点设备2作为背书节点在从用户设备12接收到交易1的交易提案并对其签名验证通过之后,执行相对于背书节点预设的对交易提案的处理过程,即预执行交易1,生成预执行交易1的读写集,对读写集进行签名,并将读写集和签名发送回用户设备12。
其中,如图1所示,在预执行交易1的过程中,包括预执行其中调用的链码1。如上文所述,在一种实施方式中,链码1例如为跨链转账链码,对链码1的传入参数包括待转出本通道的金额数、接收转账的区块链和区块链账户。在预执行链码1的过程中,首先读取用户设备12对应的用户1的账户余额,在预执行交易1的读集记录该读取的账户余额,对用户1的账户余额减少所述金额数,并在预执行交易1的写集中记录对用户1的账户余额的更改,然后,通过链码1中对链码2的调用,执行链码2以向链外发送转账消息。链码2例如为用于发送跨链消息的链码。其不限于被链码1调用,而可以被通道11中的多种链码进行调用。在该情况中,在跨链消息中需要标明,链码2是被通道11中的哪个链码进行调用的,不同的链码对应于链外的不同的处理过程,例如,对于链码1,在链外预设了有对应的转账处理,因此,只有确定了调用链码2的链码名称的情况中,才可以进行对该跨链消息的正确的后续的处理。在本说明书实施例中,通过在链码2中预先写入调用系统链码3的调用接口GetSignedProposal,从而对系统链码3进行调用。系统链码3用于在执行时获取正在执行的交易的交易提案。从而,在开始执行链码2之后,执行其中调用的系统链码3,从而获取经签名的交易1的交易提案。
在一种实施方式中,链码1例如为用于进行人民币-美元兑换的链码,链码2为用于进行美元-人民币兑换的链码,链码2只允许由链码1对其进行调用。因此,在预执行交易1的过程中,首先通过预执行链码1,读取用户1的人民币账户余额,在预执行交易1的读集中记录该读取的账户余额,对该账户余额减少需要兑换的金额,并在预执行交易1的写集中记录对应用户1的人民币账户余额的更改,然后通过链码1对链码2的调用,预执行链码2以更改用户1的美元账户。在开始预执行链码2之后,需要确定调用其的链码是否为链码1,以用于确定是否结束对交易1的预执行。从而,通过预执行链码2中调用的系统链码3,获取经签名的交易1的交易提案。
在步骤S306,从所述交易提案中获取所述链码1的名称。
在获取交易1的交易提案之后,由于交易提案中包括链码1的调用,因此,可基于该对链码1的调用获取链码1的名称。
在步骤S308,基于链码1的名称进行相应的处理。
在一种实施方式中,链码1例如为跨链转账链码,链码2例如为用于发送跨链消息的链码。在节点设备2中,在通过预执行系统链码3获取链码1的名称之后,在预执行交易1的读集或写集中记录:链码1的名称、转出本通道的金额数、接收转账的区块链和区块链账户,并在预执行完成之后,对获取的读写集进行签名。用户设备12在从节点设备2接收到经签名的预执行交易1的读写集之后,对交易1的交易内容进行广播,该交易内容中包括交易1的交易提案和预执行读写集。之后,如前文所述,经过通道11中各个节点的操作,最终将交易1的交易提案和预执行读写集作为账本数据存储到各个提交节点的节点设备中。从而,链下设备通过在通道11中查询交易1的内容,可获取交易1的读写集,然后基于其中记录的链码1的名称,进行与链码1相对应的跨链转账处理。
在一种实施方式中,链码1例如为用于进行人民币-美元兑换的链码,链码2为用于进行美元-人民币兑换的链码,链码2只允许由链码1对其进行调用。因此,当在预执行系统链码3并获取链码1的名称之后,确定该名称是否为链码1的名称,如果是,则继续预执行交易1,即更改用户1的美元账户余额,并在读写集中进行记录,如果不是,则在预执行的写集中记录兑换失败,结束对交易1的预执行。
图4示出根据本说明书实施例的一种在Fabric区块链中调用链码的装置400,所述Fabric区块链中包括客户端节点和背书节点,所述装置400部署于所述客户端节点,包括:
生成单元41,配置为,生成第一交易的交易提案,所述交易提案中包括对所述第一链码的调用,所述第一链码中包括对第二链码的调用,所述第二链码中包括对预定系统链码的调用,所述预定系统链码用于在执行时获取正在执行的交易的交易提案;
发送单元42,配置为,向所述背书节点发送所述第一交易的交易提案。
在一种实施方式中,所述装置400还包括,签名单元43,配置为,在生成第一交易的交易提案之后,生成对所述交易提案的签名,其中,所述发送单元42还配置为,向所述背书节点发送所述第一交易的交易提案和所述签名。
图5示出根据本说明书实施例的一种在Fabric区块链中预执行链码的装置500,所述Fabric区块链中包括客户端节点和背书节点,所述装置500部署于所述背书节点,包括:
接收单元51,配置为,从客户端节点接收第一交易的交易提案,所述交易提案中包括对第一链码的调用,所述第一链码中包括对第二链码的调用,所述第二链码中包括对预定系统链码的调用;
第一获取单元52,配置为,在开始预执行所述第一交易中的第二链码之后,通过预执行所述预定系统链码,获取所述第一交易的交易提案;
第二获取单元53,配置为,从所述交易提案中获取所述第一链码的名称;
处理单元54,配置为,基于所述第一链码的名称进行相应的处理。
在一种实施方式中,所述第二链码仅用于被预定链码调用,其中,所述处理单元54还配置为,判断所述第一链码是否为所述预定链码,基于所述判断的结果确定是否结束对所述第二链码的预执行。
在一种实施方式中,所述处理单元54还配置为,将所述第一链码的名称写入所述交易的读集或写集中。
在一种实施方式中,所述接收单元51还配置为,从客户端节点接收第一交易的交易提案和所述客户端节点对所述交易提案的签名,所述装置500还包括,验证单元55,配置为,对所述签名进行验证。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序或指令,当所述计算机程序或指令在计算机中执行时,令计算机执行上述任一种方法。
本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有计算机程序或指令,所述处理器在执行所述计算机程序或指令时,实现上述任一种方法。
通过根据本说明书实施例的调用和执行链码的方案,通过在被调用链码中写入系统链码接口GetSignedProposal进行系统链码调用,获取原始提案的内容,并从中提取起始调用的链码的名称,从而识别调用方链码的身份,以便于基于该调用方链码的名称进行后续处理。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述的具体实施方式,对本说明书实施例的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本说明书实施例的具体实施方式而已,并不用于限定本说明书实施例的保护范围,凡在本说明书实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书实施例的保护范围之内。