基于区块链的交易共识方法、装置及设备与流程

文档序号:23985055发布日期:2021-02-20 11:47阅读:50来源:国知局
基于区块链的交易共识方法、装置及设备与流程

[0001]
本公开实施例涉及金融科技(fintech)技术领域,尤其涉及一种基于区块链的交易共识方法、装置及设备。


背景技术:

[0002]
随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(finteh)转变,基于区块链的交易技术也不例外,但由于金融行业的安全性、实时性要求,也对技术提出了更高的要求。
[0003]
现有的基于区块链的交易共识过程中,在区块链中所有参与共识的节点中,需要对区块中的各笔交易按照排序依次执行,以保证所有节点执行的结果一定是一致的。
[0004]
然而,发明人发现现有技术至少存在以下技术问题:对于区块中所有交易采用串行方式执行,导致交易执行效率非常低,影响区块链交易处理效率。


技术实现要素:

[0005]
本公开实施例提供一种基于区块链的交易共识方法、装置及设备,以克服现有技术对于区块中所有交易采用串行方式执行,导致交易执行效率非常低,影响区块链交易处理效率的问题。
[0006]
第一方面,本公开实施例提供一种基于区块链的交易共识方法,包括:
[0007]
响应于客户端上传的交易信息,区块链的任一节点将所述交易信息存入交易池中,并向其他节点广播所述交易信息;
[0008]
区块链的领导节点从所述交易池中获取所有待执行的交易信息并进行虚拟交易执行,并根据虚拟执行结果将所述交易信息分为第一类交易信息和第二类交易信息;其中所述第一类交易信息为执行成功的交易信息以及执行失败但与交易执行次序相关的交易信息存入串行执行队列、所述第二类交易信息为执行失败且与交易执行次序无关的交易信息存入并行执行队列;
[0009]
区块链的领导节点对所述串行执行队列的第一类交易信息进行串行交易执行得到第一执行结果,对所述并行执行队列的第二类交易信息进行并行交易执行得到第二执行结果;
[0010]
区块链的领导节点将所述串行执行队列的第一类交易信息和第一执行结果、所述并行执行队列的第二类交易信息和第二执行结果打包成区块,发送至区块链的副本节点;
[0011]
区块链的副本节点对所述区块进行解包,对所述串行执行队列的第一类交易信息进行串行交易执行并与所述第一执行结果进行校验、对所述并行执行队列的第二类交易信息进行并行交易执行并与所述第二执行结果进行校验,得到所述区块的验证结果,并向所有节点广播所述验证结果的报文;
[0012]
基于预设共识算法启动共识流程,若区块链的其他节点收到的相同的验证结果的报文数量达到预设阈值,则将所述区块中的交易信息在所述区块链落盘存储。
[0013]
在一种可能的设计中,所述区块链的副本节点对所述并行执行队列的第二类交易信息进行并行交易执行,包括:
[0014]
启动线程池存入所述并行执行队列的第二类交易信息,并设定多个线程;
[0015]
根据多个线程分别并行对所述线程池中的第二类交易信息进行交易执行。
[0016]
在一种可能的设计中,所述将所述区块中的交易信息在所述区块链落盘存储,包括:
[0017]
删除所述区块中所述并行执行队列的第二类交易信息;
[0018]
将所述区块中所述串行执行队列的第一类交易信息在所述区块链落盘存储。
[0019]
在一种可能的设计中,所述区块链的副本节点对所述并行执行队列的第二类交易信息进行并行交易执行之后,还包括:
[0020]
若所述副本节点对所述并行执行队列的任一第二类交易信息进行并行交易执行的结果为执行成功,则判断所述第二类交易信息是否被加入过并行执行队列;
[0021]
若所述第二类交易信息加入过并行执行队列,则判断所述第二类交易信息的执行失败的交易执行次数;
[0022]
若所述执行失败的交易执行次数超过设定阈值,则删除所述第二类交易信息;
[0023]
若所述第二类交易信息没有被加入过并行执行队列或所述第二类交易信息的执行失败的交易执行次数不超出所述设定阈值,则将所述交易执行次数更新到所述第二类交易信息中,并将更新处理后的第二类交易信息重新存入所述交易池,并向其他节点广播所述第二类交易信息。
[0024]
在一种可能的设计中,所述若所述第二类交易信息没有被加入过并行执行队列或所述第二类交易信息的执行失败的交易执行次数不超出所述设定阈值,则将所述交易执行次数更新到所述第二类交易信息中,并将更新后的第二类交易信息重新存入所述交易池,并向其他节点广播所述第二类交易信息之后,还包括:
[0025]
区块链基于预设共识算法强制触发视图切换,以更换所述区块链中参与共识的共识节点,其中所述共识节点包括领导节点和副本节点。
[0026]
在一种可能的设计中,所述交易信息中携带交易执行次数;
[0027]
所述区块链的任一节点将所述交易信息存入交易池中之后,还包括:
[0028]
若所述交易信息的交易执行次数超过设定阈值,则删除所述交易信息。
[0029]
在一种可能的设计中,所述区块链的领导节点从所述交易池中获取所有待执行的交易信息并进行虚拟交易执行,并根据虚拟执行结果将所述交易信息分为第一类交易信息和第二类交易信息,包括:
[0030]
区块链的领导节点调用虚拟机对所述交易信息进行交易执行得到执行结果,其中所述执行结果包括交易执行的交易返回响应码;
[0031]
若所述交易返回响应码为执行成功响应码、或者所述响应码为执行失败但与交易执行次序相关的响应码,则将所述交易信息确定为第一类交易信息;
[0032]
若交易返回响应码为执行失败且与交易执行次序无关的响应码,则将所述交易信息确定为第二类交易信息。
[0033]
在一种可能的设计中,所述执行失败且与交易执行次序无关的响应码,包括:
[0034]
报文解析类错误、智能合约二进制编码参数检查错误或智能合约函数参数异常类
错误对应的响应码;
[0035]
所述执行失败但与交易执行次序相关的响应码,包括:
[0036]
执行时资源不足类错误、执行过程中的控制异常错误或其他未知错误对应的响应码。
[0037]
在一种可能的设计中,所述预设共识算法包括以下一种:
[0038]
工作证明pow算法、股权证明pos算法、委任权益证明dpos算法、验证池pool算法和实用拜占庭容错pbft算法。
[0039]
第二方面,本公开实施例提供一种基于区块链的交易共识装置,包括:
[0040]
交易上传模块,用于响应于客户端上传的交易信息,区块链的任一节点将所述交易信息存入交易池中,并向其他节点广播所述交易信息;
[0041]
交易分类模块,用于区块链的领导节点从所述交易池中获取所有待执行的交易信息并进行虚拟交易执行,并根据虚拟执行结果将所述交易信息分为第一类交易信息和第二类交易信息;其中所述第一类交易信息为执行成功的交易信息以及执行失败但与交易执行次序相关的交易信息存入串行执行队列、所述第二类交易信息为执行失败且与交易执行次序无关的交易信息存入并行执行队列;
[0042]
交易执行模块,用于区块链的领导节点对所述串行执行队列的第一类交易信息进行串行交易执行得到第一执行结果,对所述并行执行队列的第二类交易信息进行并行交易执行得到第二执行结果;
[0043]
区块发送模块,用于区块链的领导节点将所述串行执行队列的第一类交易信息和第一执行结果、所述并行执行队列的第二类交易信息和第二执行结果打包成区块,发送至区块链的副本节点;
[0044]
区块验证模块,用于区块链的副本节点对所述区块进行解包,对所述串行执行队列的第一类交易信息进行串行交易执行并与所述第一执行结果进行校验、对所述并行执行队列的第二类交易信息进行并行交易执行并与所述第二执行结果进行校验,得到所述区块的验证结果,并向所有节点广播所述验证结果的报文;
[0045]
区块落盘模块,用于基于预设共识算法启动共识流程,若区块链的其他节点收到的相同的验证结果的报文数量达到预设阈值,则将所述区块中的交易信息在所述区块链落盘存储。
[0046]
在一种可能的设计中,所述交易执行模块,具体用于启动线程池存入所述并行执行队列的第二类交易信息,并设定多个线程;根据多个线程分别并行对所述线程池中的第二类交易信息进行交易执行。
[0047]
在一种可能的设计中,所述区块落盘模块,具体用于删除所述区块中所述并行执行队列的第二类交易信息;将所述区块中所述串行执行队列的第一类交易信息在所述区块链落盘存储。
[0048]
第三方面,本公开实施例提供一种服务设备,包括:处理器和存储器;
[0049]
所述存储器存储计算机执行指令;
[0050]
所述处理器执行所述存储器存储的计算机执行指令,使得所述处理器执行如上第一方面以及第一方面各种可能的设计所述的基于区块链的交易共识方法。
[0051]
第四方面,本公开实施例提供一种计算机可读存储介质,所述计算机可读存储介
质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上第一方面以及第一方面各种可能的设计所述的基于区块链的交易共识方法。
[0052]
本公开实施例提供的基于区块链的交易共识方法、装置及设备,该方法中,区块链的领导节点从交易池中获取所有待执行的交易信息并进行交易执行,并根据执行结果将交易信息分为第一类交易信息和第二类交易信息;其中第一类交易信息为执行成功的交易信息以及执行失败但与交易执行次序相关的交易信息、第二类交易信息为执行失败且与交易执行次序无关的交易信息;并将第一类交易信息和第一执行结果存入串行执行队列、将第二类交易信息和第二执行结果存入并行执行队列;区块链的副本节点对区块进行解包,对串行执行队列的第一类交易信息进行串行交易执行并进行校验、对并行执行队列的第二类交易信息进行并行交易执行并进行校验,得到区块的验证结果,根据验证结果对区块的交易信息完成共识。由于,对与交易执行次序无关的交易信息按照并行执行,可以大大提高区块交易的执行效率,提升共识算法的吞吐量和执行速度,进而提升区块链交易处理效率。
附图说明
[0053]
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0054]
图1为现有技术的区块中交易信息的列表示意图;
[0055]
图2为现有技术的区块链的交易共识原理示意图;
[0056]
图3为本公开实施例提供的基于区块链的交易共识方法的流程示意图;
[0057]
图4为本公开实施例提供的区块中交易信息的列表示意图;
[0058]
图5为本公开实施例提供的基于区块链的交易共识装置的结构示意图;
[0059]
图6为本公开实施例提供的服务设备的硬件结构示意图。
具体实施方式
[0060]
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
[0061]
技术名词解释:
[0062]
交易:用于调用智能合约,其包含了智能合约的必要信息,包括调用的合约、调用输入参数等。其中,输入参数是已编码后的二进制数据。在交易调用完智能合约后,会得到交易结果信息,包括调用是否成功、合约返回值。其中,合约返回值也是已编码后的二进制数据。
[0063]
共识节点:区块链中参与共识过程的节点,包含了领导节点和副本节点。
[0064]
领导节点(leader/primary):负责将交易打包成区块和发起区块共识,每轮共识过程中有且仅有一个领导节点。
[0065]
副本节点(replica):负责完成区块共识,每轮共识过程中有多个副本节点,每个
副本节点的处理过程类似。
[0066]
视图(view):记录每个节点的共识状态,相同的视图节点维护相同的领导节点和副本节点的节点列表。当领导节点出现故障时,会发生视图切换。
[0067]
区块链的交易处理模块可以被抽象为一个基于交易的状态机。状态指的是区块链中所有账户的状态,区块链将交易作为状态迁移函数,并根据交易内容从旧状态更新为新状态。区块链从创世块状态开始,不断收集区块链网络上发生的交易并由领导节点将交易排序并打包成区块,并在所有参与共识的共识节点间执行区块中的交易。当一个区块内的交易在多个共识节点上执行完成且状态一致,则称在该区块上达成了共识,并将该区块永久记录在区块链中,完成区块上链。
[0068]
从区块链的打包

共识

存储过程中可以理解,执行区块中的所有交易是区块上链的必经之路。目前传统的区块链的交易共识过程是:区块链的领导节点从交易池中取出一定量的交易并进行排序,然后打包成一个交易列表的区块,如图1所示,区块m中包括按照交易顺序排序的各笔交易,包括交易1、交易2、交易3......交易n。然后领导节点主节点广播并发送至所有参与共识的副本节点进行共识。如图2所示,副本节点从区块的交易列表中逐条读出交易,执行完每一笔交易后,状态机都会迁移至下一个状态,直至所有的交易被串行执行完成。
[0069]
然而,在现有技术中,对于区块中所有交易采用串行方式执行,导致交易执行效率非常低,影响区块链交易处理效率。
[0070]
为了解决上述技术问题,本公开实施例提供如下技术方案:区块链的领导节点从交易池中获取所有待执行的交易信息并进行虚拟交易执行,并根据虚拟执行结果将交易信息分为第一类交易信息和第二类交易信息;其中第一类交易信息为执行成功的交易信息以及执行失败但与交易执行次序相关的交易信息、第二类交易信息为执行失败且与交易执行次序无关的交易信息;区块链的领导节点对所述串行执行队列的第一类交易信息进行串行交易执行得到第一执行结果,对所述并行执行队列的第二类交易信息进行并行交易执行得到第二执行结果,并将第一类交易信息和第一执行结果存入串行执行队列、将第二类交易信息和第二执行结果存入并行执行队列,打包成区块;区块链的副本节点对区块进行解包,对串行执行队列的第一类交易信息进行串行交易执行、对并行执行队列的第二类交易信息进行并行交易执行,得到区块的验证结果,这样,对与交易执行次序无关的交易信息按照并行执行,可以大大提高区块交易的执行效率,提升共识算法的吞吐量和执行速度,进而提升区块链交易处理效率。
[0071]
参考图3,图3为本公开实施例提供的基于区块链的交易共识方法的流程示意图。本实施例应用于服务端的区块链,该区块链包括共识节点,其中共识节点包括领导节点和多个副本节点,上述方法详述如下:
[0072]
s301:响应于客户端上传的交易信息,区块链的任一节点将交易信息存入交易池中,并向其他节点广播交易信息。
[0073]
在本实施例,客户端可以任一发生交易行为的客户端,客户端根据交易行为生产交易信息,并发送至区块链的任一节点上。例如,用户在网上商城购买商品,通过客户端完成交易,客户端将购买商品的交易信息发送至区块链的任一节点。
[0074]
在本实施例中,区块链的任一节点为区块链中的共识节点中的任一节点。领导节
点由区块链的共识节点中选举产生。任一共识节点既可以是领导节点,也可以是副本节点。
[0075]
s302:区块链的领导节点从交易池中获取所有待执行的交易信息并进行虚拟交易执行,并根据虚拟执行结果将交易信息分为第一类交易信息和第二类交易信息;其中第一类交易信息为执行成功的交易信息以及执行失败但与交易执行次序相关的交易信息存入串行执行队列、第二类交易信息为执行失败且与交易执行次序无关的交易信息存入并行执行队列。
[0076]
在本实施例中,领导节点获取获取所有待执行的交易信息。具体地,领导节点首先产生新空块,然后从交易池中获取所有待执行的交易信息,并将交易信息插入到新空块中。
[0077]
在本公开的一个实施例中,区块链的领导节点调用虚拟机对交易信息进行交易执行得到虚拟机的虚拟执行结果,其中所述执行结果包括交易执行的交易返回响应码;若所述交易返回响应码为执行成功响应码、或者所述响应码为执行失败但与交易执行次序相关的响应码,则将所述交易信息确定为第一类交易信息;若交易返回响应码为执行失败且与交易执行次序无关的响应码,则将所述交易信息确定为第二类交易信息。
[0078]
在本实施例中,所述执行失败且与交易执行次序无关的响应码,包括:
[0079]
报文解析类错误、智能合约二进制编码参数检查错误或智能合约函数参数异常类错误对应的响应码;
[0080]
所述执行失败但与交易执行次序相关的响应码,包括:
[0081]
执行时资源不足类错误、执行过程中的控制异常错误或其他未知错误对应的响应码。
[0082]
参考图4,图4为本公开实施例提供的区块中交易信息的列表示意图。其中,区块m中,包括串行执行队列的第一类交易信息以及并行执行队列的第二类交易信息。
[0083]
s303:区块链的领导节点对所串行执行队列的第一类交易信息进行串行交易执行得到第一执行结果,对并行执行队列的第二类交易信息进行并行交易执行得到第二执行结果。
[0084]
s304:区块链的领导节点将串行执行队列的第一类交易信息和第一执行结果、并行执行队列的第二类交易信息和第二执行结果打包成区块,发送至区块链的副本节点。
[0085]
在本实施例中,区块链的领导节点将打包节点设为领导节点自己,将串行执行队列的第一类交易信息和第一执行结果、并行执行队列的第二类交易信息和第二执行结果打包成新区块。
[0086]
其中,交易信息和执行结果中携带队列类型标识。串行执行队列的第一类交易信息和第一执行结果携带有串行执行标识;并行执行队列的第二类交易信息和第二执行结果携带有并行执行标识。
[0087]
s305:区块链的副本节点对区块进行解包,对串行执行队列的第一类交易信息进行串行交易执行并与所述第一执行结果进行校验、对并行执行队列的第二类交易信息进行并行交易执行并与所述第二执行结果进行校验,得到区块的验证结果,并向所有节点广播所述验证结果的报文。
[0088]
在本实施例中,副本节点对区块进行解包获取交易信息和执行结果中携带队列类型标识,分别获取串行执行队列的第一类交易信息和第一执行结果、并行执行队列的第二类交易信息和第二执行结果。
[0089]
在本实施例中,启动线程单线程,对串行执行队列的第一类交易信息进行串行交易执行的过程为:按照交易信息在串行执行队列的交易顺序,对串行执行队列的第一类交易信息进行串行交易执行,得到新的执行结果,并与上述串行执行队列的第一执行结果进行比较验证,得到第一验证结果。
[0090]
在本公开的一个实施例中,区块链的副本节点对所述并行执行队列的第二类交易信息进行并行交易执行,包括:启动线程池存入并行执行队列的第二类交易信息,并设定多个线程;根据多个线程分别并行对线程池中的第二类交易信息进行交易执行,得到新的执行结果,并与上述并行执行队列的第二执行结果进行比较验证,得到第二验证结果。
[0091]
在本实施例中,根据第一验证结果和/或第二验证结果,得到区块的验证结果。具体地,可以将串行执行队列的第一验证结果作为区块的验证结果,也可以将第一验证结果和第二验证结果综合结果作为区块的验证结果。
[0092]
s306:基于预设共识算法启动共识流程,若区块链的其他节点收到的相同的验证结果的报文数量达到预设阈值,则将所述区块中的交易信息在所述区块链落盘存储。
[0093]
在本实施例中,所述预设共识算法包括以下一种:工作证明pow算法、股权证明pos算法、委任权益证明dpos算法、验证池pool算法和实用拜占庭容错pbft算法。
[0094]
在本实施例中,报文数量达到预设阈值在不同的算法中,要求不同。可以是共识节点数量的一半再加一(2*f+1),也可以是识节点数量的三分之一再加一(3*f+1)。
[0095]
从上述实施例描述可知,区块链的领导节点从交易池中获取所有待执行的交易信息并进行交易执行,并根据执行结果将交易信息分为第一类交易信息和第二类交易信息;其中第一类交易信息为执行成功的交易信息以及执行失败但与交易执行次序相关的交易信息、第二类交易信息为执行失败且与交易执行次序无关的交易信息;并将第一类交易信息和第一执行结果存入串行执行队列、将第二类交易信息和第二执行结果存入并行执行队列;区块链的副本节点对区块进行解包,对串行执行队列的第一类交易信息进行串行交易执行并进行校验、对并行执行队列的第二类交易信息进行并行交易执行并进行校验,得到区块的验证结果,根据验证结果对区块的交易信息完成共识。由于,对与交易执行次序无关的交易信息按照并行执行,可以大大提高区块交易的执行效率,提升共识算法的吞吐量和执行速度,进而提升区块链交易处理效率。
[0096]
在本公开的一个实施例中,所述区块中的交易信息在所述区块链落盘存储过程中,可以删除所述区块中所述并行执行队列的第二类交易信息;将所述区块中所述串行执行队列的第一类交易信息在所述区块链落盘存储。
[0097]
在本实施例中,传统的共识交易方法中,会区分区块中的成功交易和失败交易,将所有的交易统一落盘存储到区块链节点中。本技术方案会在落盘时节点会丢弃所有并行执行队列中执行失败的交易,只落盘串行队列中的交易,大大节省了区块链节点的存储资源。同时,由于降低了区块链存储的交易数量,减少了区块链存储的数据量,延缓了因为区块链数据量提升后带来的性能衰减,反过来可以提升区块链节点执行的效率。
[0098]
在本公开的一个实施例中,在上述步骤s304中,所述区块链的副本节点对所述并行执行队列的第二类交易信息进行并行交易执行之后,还包括:
[0099]
s306:若副本节点对并行执行队列的任一第二类交易信息进行并行交易执行的结果为执行成功,则判断交易信息是否被加入过并行执行队列。
[0100]
在本实施例中,并行执行队列的第二类交易信息为领导节点进行交易执行后执行结果为执行失败的交易信息,而副本节点对并行执行队列的第二类交易信息进行并行交易执行的结果为执行成功,表明该交易信息存在误判可能。
[0101]
在本实施例中,判断交易信息是否被加入过并行执行队列,可以是:获取所述交易信息中的历史执行结果,若历史执行结果显示该交易信息存在执行结果为执行失败的记录,则确定交易信息加入过并行执行队列。
[0102]
s307:若该第二类交易信息加入过并行执行队列,则判断该第二类交易信息的执行失败的交易执行次数。
[0103]
在本实施例中,判断交易信息的执行失败的交易执行次数,可以是:通过交易信息中的历史执行结果获取该交易信息存在执行结果为执行失败的的次数。
[0104]
s308:若执行失败的交易执行次数超过设定阈值,则删除该第二类交易信息。
[0105]
在本实施例中,设定阈值可以根据施加交易过程进行动态设置。
[0106]
s309:若该第二类交易信息没有被加入过并行执行队列或该第二类交易信息的执行失败的交易执行次数不超出设定阈值,则将交易执行次数更新到该第二类交易信息中,并将更新处理后的该第二类交易信息重新存入交易池,并向其他节点广播交易信息。
[0107]
在本实施例中,将更新处理后的交易信息重新存入交易池,并向其他节点广播交易信息,将更新处理后的交易信息成为新的待执行交易信息,并继续参与到区块链的领导节点从所述交易池中获取所有待执行的交易信息并进行交易执行的步骤中。
[0108]
从上述实施例的描述可知,通过验证并行交易队列中是否存在被共识节点误判的交易,对存在误判的交易信息,重新发送至交易池,以再次被主节点重新执行,避免节点对交易信息的误判;同时对于已经超过一定执行失败的交易执行次数的交易信息进行删除,以进一步节省存储区块链存储的数据量。
[0109]
在本公开的一个实施例中,在上述步骤s309之后,还包括:
[0110]
s310:区块链基于预设共识算法强制触发视图切换,以更换所述区块链中参与共识的共识节点,其中所述共识节点包括领导节点和副本节点。
[0111]
在本实施例中,对于存在误判的交易信息,在一下轮的共识中由新的共识节点打包执行该笔被误判的交易信息,避免笔被误判的交易信息被旧的共识节点继续误判的情况发生。
[0112]
在本公开的一个实施例中,所述交易信息中携带交易执行次数;在上述步骤s301区块链的任一节点将交易信息存入交易池中之后,还包括:
[0113]
s311:若所述交易信息的交易执行次数超过设定阈值,则删除所述交易信息。
[0114]
在本实施例中,对于交易池中已经超过一定次数的执行失败的交易信息,进行删除,避免重复被执行交易,降低区块链的处理效率。
[0115]
下面通过一个具体的实例,对本公开实施例提供的基于区块链的交易共识方法进行详细说明。本实例中,以pbft算法为例,详述如下。
[0116]
第一阶段:客户端提交交易信息,区块链的任一节点将所述交易信息存入交易池中,并向其他节点广播所述交易信息。
[0117]
其中,在节点的交易池中,缓存了已经执行交易的交易根(transaction root,为对transaction二进制数据计算的hash值)和交易执行次数。对于待执行的交易信息,如果
此前已经加入过失败对列(并行执行队列),则计算其被加入区块并执行的次数,当超出某个阈值后,则从交易池中删除该笔交易信息。如果是新提交的交易信息,则交易执行次数为0。
[0118]
第二阶段:领导节点进行新区块打包。
[0119]
在pbft算法中,共识节点轮流出块,每一轮共识仅有一个领导节点打包区块,产生新的空块。领导节点的主要步骤如下:
[0120]
步骤1,产生新空块:获取当前最高块(高度最高的区块),并基于该最高块产生新空块(将新区块父哈希置为最高块哈希,时间戳置为当前时间,交易清空)。
[0121]
步骤2,从交易池打包交易信息:产生新空块后,从交易池中获取交易信息,并将获取的交易信息插入到产生的新区块中。
[0122]
在本实施例中,交易池中包含了所有待执行的交易信息,按照交易信息是否曾被执行过分为:初始提交的交易信息和次共识流程中失败的待执行的交易信息。
[0123]
步骤3,组装新区块:将新区块的打包节点设置为领导节点自己,并根据打包的交易信息调用虚拟模块进行交易执行,得到交易信息的执行结果。
[0124]
在本实施例中,交易信息的执行结果包括以下关键数据:
[0125]
transactionhash:交易hash;
[0126]
index:交易序号;
[0127]
gasused:交易执行消耗的hash;
[0128]
from:交易调用者的地址;
[0129]
to:交易调用的目标地址;
[0130]
input:交易执行的输入二进制代码;
[0131]
output:交易执行输出的二进制代码;
[0132]
logs:交易执行过程中的日志记录;
[0133]
logsbloom:记录交易日志的topic检索信息;
[0134]
status:交易返回响应码,可根据响应码获取交易执行失败的详细原因。
[0135]
在执行结果中,包含了交易返回响应码,既包括执行成功响应码(执行结果为执行成功的交易信息的交易返回响应码),也包括执行结果为执行失败的交易信息的交易返回响应码。对于执行失败的交易信息的交易返回响应码可以分为以下几种:
[0136]
1)报文解析类错误的响应码。例如区块rlp解析失败、无效交易格式、交易格式错误异常。
[0137]
2)智能合约二进制编码参数检查错误的响应码。例如部署合约长度超过gas限制、调用合约接口参数超过gas限制、调用合约的参数过长,部署合约的长度超过最长限制,交易格式错误等。
[0138]
3)参数异常响应码。例如无效的签名、无效的nonce、错误指令、错误异常跳转、无效的链id异常、被调用的合约地址不存在等。
[0139]
4)执行时资源不足类错误的响应码。例如转账余额不足,gaslimit不足,合约执行时gas部署,栈溢出异常等
[0140]
5)执行过程中的控制异常的响应码。例如revert异常、无权限异常、非法部署合约、非法交易、合约被冻结、账户被冻结等。
[0141]
6)其他未知错误的响应码。例如未知异常。
[0142]
对于上述执行失败的交易信息的交易返回响应码,与交易执行次序无关的响应码包括:报文解析类错误、智能合约二进制编码参数检查错误或智能合约函数参数异常类错误对应的响应码;与交易执行次序相关的响应码包括:执行时资源不足类错误、执行过程中的控制异常错误或其他未知错误对应的响应码。与交易执行次序相关的响应码对应与交易执行次序相关的交易信息,例如:存在两笔转账交易,a转账给b,b转账给c。假设这两笔转账的金额相同,且b初始账户余额为0,a账户有充足的初始余额;那么如果先执行a转账给b,后执行b转账给c则交易成功,反之,则交易失败。
[0143]
因此,领导节点会在交易信息执行完成后,对所有执行失败的交易信息根据执行结果的交易返回响应码区分失败类型。根据交易返回响应码的类型,确定该笔交易的失败是否与交易排序相关。
[0144]
交易信息的执行结果中还包括队列类型标识(queuetype),用于标识交易信息属于串行执行队列或并行执行队列。在串行执行队列或并行执行队列,交易信息按照交易序号重新进行排序。
[0145]
执行成功的交易信息以及执行失败但与交易执行次序相关的交易信息存入串行执行队列,执行失败且与交易执行次序无关的交易信息存入并行执行队列。
[0146]
领导节点对串行执行队列中的交易信息按照串行进行交易执行,得到串行执行队列的第一状态根(state root);领导节点对并行执行队列中的交易信息按照并行进行交易执行,得到并行执行队列的第二状态根(state root)。state root的计算规则为将执行的交易回执导出到一个数组中,计算其hash值。
[0147]
其中,串行执行队列的第一状态根有两个结果,一个是包含了失败交易的全部状态根(all state root),另一个是不包含失败交易的有效状态根(valid state root)。需要说明的是:如果串行交易队列执行的结果中,不包含执行失败的交易,则全部状态根与有效状态根相等。
[0148]
步骤4,产生准备包(prepare包):将组装的新区块编码到准备包中,并广播给组内所有共识节点,其他共识节点收到准备包后,开始进行三阶段共识。
[0149]
在本实施例中,新区块的组包中包括执行串行执行队列的交易信息的列表及其执行结果、并行执行队列的交易信息的列表及其执行结果。
[0150]
第三阶段:副本节点预准备阶段(pre-prepair阶段)。
[0151]
副本节点收到prepare包后,进入pre-prepare阶段,此阶段的主要工作流程包括:
[0152]
步骤1,prepare包合法性判断:判断是否是重复的prepare包、prepare请求中包含的区块父哈希是否是当前节点最高块哈希(防止分叉)、prepare请求中包含区块的块高是否等于最高块高加一。
[0153]
步骤2,空块判断:prepare请求包含的区块中交易数目是0,则触发空块视图切换,并向所有其他节点广播视图切换请求。
[0154]
步骤3,执行区块中交易信息并缓存执行结果:若prepare请求包含的区块中交易数目大于0,则调用区块执行器执行区块,并缓存执行后的区块。
[0155]
在本实施例中,执行区块中交易信息,如下:副本节点基于交易信息列表中的队列类型标识(queuetype)来解析出区块中的串行执行交易队列和并行执行队列,对于串行执
行队列,使用线程进行串行执行。对于并行执行队列,同时启动线程池,设定多个线程,并行对线程池里的交易进行执行。
[0156]
例如,在图4中,交易2是共识节点中执行失败的交易,但其失败类型属于与交易次序强相关的交易。而并行队列中的所有交易属于失败且失败类型与交易次序无关的交易。因此,串行队列中的交易还是会按照区块中串行队列的排序被依次执行。而并行队列中的交易会被同时并行执行,其被执行的次序是不确定的,可以按照任意的次序被执行。
[0157]
执行完成后,共识节点会组装签名包。除了原有的区块内容外,同样的,区块中还额外包含了区块的串行执行队列和并行执行队列的state root。state root的计算规则为将执行的交易回执导出到一个数组中,计算其hash值。其中串行执行队列的state root结果有两个,一个是包含了失败交易后的all state root,另外一个是不包含失败交易的valid state root。如果串行交易队列执行的结果中,不包含执行失败的交易,则all state root与valid state root相等。
[0158]
步骤4,产生并广播签名包:基于执行后的区块哈希,产生并广播签名包,表明本节点已经完成区块执行和验证。
[0159]
第四阶段:共识节点准备阶段。
[0160]
共识节点收到签名包后,进入prepare阶段,此阶段的主要工作流程包括:
[0161]
步骤1,签名包合法性判断:主要判断签名包的哈希与pre-prepare阶段缓存的执行后的区块哈希相同,若不相同,则是非法的签名请求,节点直接拒绝该签名请求。
[0162]
步骤2,签名包结果判断:共识节点收到签名包后,会将签名包的内容与已收到的其他的签名包进行比对和缓存。
[0163]
在本实施例中,判断pre-prepare阶段缓存的区块对应的签名包,且这些签名包对应的串行执行队列的valid state root相等,缓存是否达到2*f+1,若收集满签名包,广播commit包:若pre-prepare阶段缓存的区块哈希对应的签名包数目超过2*f+1,则说明大多数节点均执行了该区块,并且执行结果一致,说明本节点已经达到可以提交区块的状态,开始广播commit包。
[0164]
若收集的相等的并行执行队列的all state root的签名包数目超过2*f+1,则说明大多数节点均执行了该区块中的所有队列,并且执行结果一致。此时,假如并行队列中存在执行成功的交易信息,且判断该交易信息此前是否加入过并行执行队列。如果此前已经加入过并行执行队列的,计算其失败的次数。当超出某个阈值后,则无论是否成功,都抛弃该笔交易信息;否则将其放入到交易池并向所有其他节点进行广播。同时,发生了失败交易被重新广播到其他节点,则强制触发视图切换,更换共识节点。(本步骤主要是为了发现和验证并行交易队列中是否存在被共识节点误判的交易信息。如果存在误判,则在下个共识阶段重新由新的共识节点打包执行该笔被误判的交易。同时,记录交易被打包共识执行的次数,当超出某个设定的阈值时,该笔交易信息被强制抛弃。)
[0165]
步骤3,若收集满签名包,备份pre-prepare阶段缓存的prepare包落盘:为了防止commit阶段区块未提交到数据库之前超过2*f+1个节点宕机,这些节点启动后重新出块,导致区块链分叉(剩余的节点最新区块与这些节点最高区块不同),还需要备份pre-prepare阶段缓存的prepare包到数据库,节点重启后,优先处理备份的prepare包。
[0166]
第五阶段:提交阶段(commit阶段)。
[0167]
共识节点收到commit包后,进入commit阶段,此阶段工作流程包括:
[0168]
commit包合法性判断:主要判断commit包的哈希与pre-prepare阶段缓存的执行后的区块哈希相同,若不相同,则是非法的commit请求,节点直接拒绝该请求;判断pre-prepare阶段缓存的区块对应的commit包缓存是否达到2*f+1,若收集满commit包,则将新区块落盘:若pre-prepare阶段缓存的区块哈希对应的commit请求数目超过2*f+1,则说明大多数节点达到了可提交该区块状态,且执行结果一致,则将pre-prepare阶段缓存的区块写入数据库;落盘时节点会丢弃所有并行执行队列中执行失败的交易信息,只落盘串行队列中的交易信息。
[0169]
参考图5,图5为本公开实施例提供的基于区块链的交易共识装置的结构示意图。如图5所示,该基于区块链的交易共识装置50包括:交易上传模块501、交易分类模块502、交易执行模块503、区块发送模块504、区块验证模块505和区块落盘模块506。
[0170]
交易上传模块501,用于响应于客户端上传的交易信息,区块链的任一节点将所述交易信息存入交易池中,并向其他节点广播所述交易信息;
[0171]
交易分类模块502,用于区块链的领导节点从所述交易池中获取所有待执行的交易信息并进行虚拟交易执行,并根据虚拟执行结果将所述交易信息分为第一类交易信息和第二类交易信息;其中所述第一类交易信息为执行成功的交易信息以及执行失败但与交易执行次序相关的交易信息存入串行执行队列、所述第二类交易信息为执行失败且与交易执行次序无关的交易信息存入并行执行队列;
[0172]
交易执行模块503,用于区块链的领导节点对所述串行执行队列的第一类交易信息进行串行交易执行得到第一执行结果,对所述并行执行队列的第二类交易信息进行并行交易执行得到第二执行结果;
[0173]
区块发送模块504,用于区块链的领导节点将所述串行执行队列的第一类交易信息和第一执行结果、所述并行执行队列的第二类交易信息和第二执行结果打包成区块,发送至区块链的副本节点;
[0174]
区块验证模块505,用于区块链的副本节点对所述区块进行解包,对所述串行执行队列的第一类交易信息进行串行交易执行并与所述第一执行结果进行校验、对所述并行执行队列的第二类交易信息进行并行交易执行并与所述第二执行结果进行校验,得到所述区块的验证结果,并向所有节点广播所述验证结果的报文;
[0175]
区块落盘模块506,用于基于预设共识算法启动共识流程,若区块链的其他节点收到的相同的验证结果的报文数量达到预设阈值,则将所述区块中的交易信息在所述区块链落盘存储。
[0176]
本实施例提供的装置,可用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,本实施例此处不再赘述。
[0177]
在本公开的一个实施例中,所述交易执行模块503,具体用于启动线程池存入所述并行执行队列的第二类交易信息,并设定多个线程;根据多个线程分别并行对所述线程池中的第二类交易信息进行交易执行。
[0178]
在本公开的一个实施例中,所述区块落盘模块506,具体用于删除所述区块中所述并行执行队列的第二类交易信息;
[0179]
将所述区块中所述串行执行队列的第一类交易信息在所述区块链落盘存储。
[0180]
在本公开的一个实施例中,所述装置还包括:误判验证模块507,用于若所述副本节点对所述并行执行队列的任一第二类交易信息进行并行交易执行的结果为执行成功,则判断所述第二类交易信息是否被加入过并行执行队列;若所述第二类交易信息加入过并行执行队列,则判断所述第二类交易信息的执行失败的交易执行次数;若所述执行失败的交易执行次数超过设定阈值,则删除所述第二类交易信息;若所述第二类交易信息没有被加入过并行执行队列或所述第二类交易信息的执行失败的交易执行次数不超出所述设定阈值,则将所述交易执行次数更新到所述第二类交易信息中,并将更新处理后的第二类交易信息重新存入所述交易池,并向其他节点广播所述第二类交易信息。
[0181]
在本公开的一个实施例中,所述装置还包括:视图切换模块508,用于区块链基于预设共识算法强制触发视图切换,以更换所述区块链中参与共识的共识节点,其中所述共识节点包括领导节点和副本节点。
[0182]
在本公开的一个实施例中,所述交易信息中携带交易执行次数;所述交易上传模块501,还用于若所述交易信息的交易执行次数超过设定阈值,则删除所述交易信息。
[0183]
在本公开的一个实施例中,所述交易分类模块502,具体用于区块链的领导节点调用虚拟机所述对交易信息进行交易执行得到执行结果,其中所述执行结果包括交易执行的交易返回响应码;若所述交易返回响应码为执行成功响应码、或者所述响应码为执行失败但与交易执行次序相关的响应码,则将所述交易信息确定为第一类交易信息;若交易返回响应码为执行失败且与交易执行次序无关的响应码,则将所述交易信息确定为第二类交易信息。
[0184]
本实施例提供的装置,可用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,本实施例此处不再赘述。
[0185]
参考图6,图6为本公开实施例提供的服务设备的硬件结构示意图。如图6所示,本实施例的服务设备60包括:处理器601以及存储器602;其中
[0186]
存储器602,用于存储计算机执行指令;
[0187]
处理器601,用于执行存储器存储的计算机执行指令,以实现上述实施例中客户端或服务器所执行的各个步骤。具体可以参见前述方法实施例中的相关描述。
[0188]
可选地,存储器602既可以是独立的,也可以跟处理器601集成在一起。
[0189]
当存储器602独立设置时,该基于服务设备还包括总线603,用于连接所述存储器602和处理器601。
[0190]
本公开实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上所述的基于区块链的交易共识方法。
[0191]
在本公开所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。例如,以上所描述的设备实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0192]
所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显
示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案。
[0193]
另外,在本公开各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个单元中。上述模块成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
[0194]
上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器执行本公开各个实施例所述方法的部分步骤。
[0195]
应理解,上述处理器可以是中央处理单元(central processing unit,简称cpu),还可以是其他通用处理器、数字信号处理器(digital signal processor,简称dsp)、专用集成电路(application specific integrated circuit,简称asic)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合发明所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
[0196]
存储器可能包含高速ram存储器,也可能还包括非易失性存储nvm,例如至少一个磁盘存储器,还可以为u盘、移动硬盘、只读存储器、磁盘或光盘等。
[0197]
总线可以是工业标准体系结构(industry standard architecture,简称isa)总线、外部设备互连(peripheral component interconnect,简称pci)总线或扩展工业标准体系结构(extended industry standard architecture,简称eisa)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本公开附图中的总线并不限定仅有一根总线或一种类型的总线。
[0198]
上述存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(sram),电可擦除可编程只读存储器(eeprom),可擦除可编程只读存储器(eprom),可编程只读存储器(prom),只读存储器(rom),磁存储器,快闪存储器,磁盘或光盘。存储介质可以是通用或专用计算机能够存取的任何可用介质。
[0199]
一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于专用集成电路(application specific integrated circuits,简称asic)中。当然,处理器和存储介质也可以作为分立组件存在于电子设备或主控设备中。
[0200]
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。
[0201]
最后应说明的是:以上各实施例仅用以说明本公开的技术方案,而非对其限制;尽管参照前述各实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本公开各实施例技术方案的范围。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1