[0001]
本申请涉及超级账本技术领域,特别是涉及一种超级账本中的交易排序方法、装置、计算机设备和存储介质。
背景技术:[0002]
hyperledger fabric(超级账本)在区块链的联盟链构建中被广泛使用,其技术特性可以通过同共识与排序节点的算法,使链上数据的更新通过共识机制进行,确保分布式系统中数据的一致性与安全性。
[0003]
在超级账本中,一个交易从被发起到最终写入账本中需要经历四个阶段,分别是模拟背书,排序,验证和提交。在模拟阶段,客户端产生交易信息,将交易信息对应的参数发给多个背书节点;背书阶段,每一个背书节点进行模拟背书操作之后,都向客户端返回一个读写集合以及自己的签名;随后客户端把所收到的数据发给排序服务ordering service,进入排序阶段。排序服务不会读取交易中的内容,只是将所收到的交易数据按照接收顺序排序和打包,然后发给各个节点peer;进入验证阶段,各个验证节点(committer peer)验证各个交易数据是否有效,若验证无效则该交易成为无效交易;将验证后的有效交易和无效交易写入账本中。
[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]
更新模块,用于将代表总次数最多的交易的节点从所述交易冲突图中移除,并更
新每个交易出现的总次数,直到所述交易冲突图中不存在所述强连通图,得到无冲突交易图;
[0039]
排序模块,用于根据所述无冲突交易图中每个节点的方向确定所述无冲突交易图中有效交易的执行顺序。
[0040]
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
[0041]
构建区块链中同一时刻发起的交易集合对应的交易冲突图;所述交易冲突图中的每一节点代表一个交易;
[0042]
通过求有向图强连通分量的算法对所述交易冲突图进行分解,得到对应的强连通图集;
[0043]
根据所述强连通图集标记交易集合中每个交易出现的总次数;
[0044]
将代表总次数最多的交易的节点从所述交易冲突图中移除,并更新每个交易出现的总次数,直到所述交易冲突图中不存在所述强连通图,得到无冲突交易图;
[0045]
基于所述无冲突交易图中每个节点的方向,通过超级账本的排序节点确定所述无冲突交易图中有效交易的执行顺序。
[0046]
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
[0047]
构建区块链中同一时刻发起的交易集合对应的交易冲突图;所述交易冲突图中的每一节点代表一个交易;
[0048]
通过求有向图强连通分量的算法对所述交易冲突图进行分解,得到对应的强连通图集;
[0049]
根据所述强连通图集标记交易集合中每个交易出现的总次数;
[0050]
将代表总次数最多的交易的节点从所述交易冲突图中移除,并更新每个交易出现的总次数,直到所述交易冲突图中不存在所述强连通图,得到无冲突交易图;
[0051]
基于所述无冲突交易图中每个节点的方向,通过超级账本的排序节点确定所述无冲突交易图中有效交易的执行顺序。
[0052]
上述超级账本中的交易排序方法、装置、计算机设备和存储介质,通过构建区块链中同一时刻发起的交易集合对应的交易冲突图,基于求有向图强连通分量的算法,对交易冲突图进行分解,得到交易集合对应的所有强连通图;强连通图中的每一个节点代表一个交易,根据所有强连通图标记交易集合中的每个交易出现的次数;对每个交易出现的次数进行排序,根据交易的总次数将无效交易从交易冲突图中移除,直到交易冲突图中不存在强连通图,得到无冲突的交易图,通过超级账本的排序节点对无冲突交易图中有效交易进行排序,得到交易的执行顺序,即对区块链上的交易进行排序之前,对同一时刻发起的所有交易进行验证,剔除无效的交易,通过超级账本的排序节点对将不存在冲突的交易进行排序,提高了排序节点的数据处理效率,进而优化了超级账本的性能。
附图说明
[0053]
图1为一个实施例中超级账本中的交易排方法的流程示意图;
[0054]
图2为一个实施例中交易冲突图的示意图;
[0055]
图3为一个实施例中超级账本中的交易冲突图构建方法的流程示意图;
[0056]
图4为另一个实施例中交易冲突图的示意图;
[0057]
图5为另一个实施例中超级账本中的交易排序方法的流程示意图;
[0058]
图6a和图6b为一个实施例中强连通图的示意图;
[0059]
图7a为一个实施例从交易冲突图中移除目标交易的示意图;
[0060]
图7b为一个实施例中无冲突交易图的示意图;
[0061]
图8为一个实施例中超级账本中的交易排序装置的结构框图;
[0062]
图9为另一个实施例中超级账本中的交易排序装置的结构框图;
[0063]
图10为一个实施例中计算机设备的内部结构图。
具体实施方式
[0064]
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
[0065]
在一个实施例中,如图1所示,提供了一种超级账本中的交易排序方法,本实施例以该方法应用于服务器进行举例说明,可以理解的是,该方法也可以应用于终端,还可以应用于包括终端和服务器的系统,并通过终端和服务器的交互实现。本实施例中,该方法包括以下步骤:
[0066]
步骤102,构建区块链中同一时刻发起的交易集合对应的交易冲突图;交易冲突图中的每一节点代表一个交易。
[0067]
其中,交易冲突是区块链中同一时刻发起的多笔交易中,背书节点将交易请求参数转为读写集并以key-value键值对形式保存,当一个交易在写之前,账户名称信息key(k)对应的用于存储账户对应的值的信息以及世界状态版本号的value(v)已经被另一个交易写入写的数据,则表示这两笔交易冲突。根据交易集合中交易之间的交易冲突,构建交易集合对应的交易冲突图。交易请求参数包括操作对象、操作对象的值的信息;k代表账户名称信息,v代表账户对应的值的信息,包括世界状态版本号;每一个k都对应的世界状态版本号,世界状态版本号是根据区块高度、交易次数和信息共同组成的二元组;区块高度是区块链接在主链的个数,即系统中区块的个数,交易次数为交易对应的交易id;例如一笔交易发生后系统中区块个数为10,该交易对应交易id为1,则生成的世界状态版本号为<10,1>,用超级账本存储账户资产信息,账户a的资产在某一交易后数字为10,交易id和交易后的区块高度信息构成了世界状态版本1.0,那么存储的信息表示为键值对就是<a:10,1.0>。如果交易发生后,资产变为12,交易对应的世界状态版本号为2.0,那么键值对更新为<a:12,2.0>。
[0068]
可选地,如表1所示,区块链中同一时刻发起t1、t2、t3三笔交易,t1最先执行,此时k1对应的值v1已经被更新到v2,即(k1,v1)更新为(k1,v2),k1对应世界状态版本号也进行更新与v2对应,当执行t2、t3时,t2、t3读取的读集是(k1,v1),k1对应的世界版本号已经更新,与t2、t3世界状态版本号不相同,因此交易t2与t3均无效,则得到交易t1、t2、t3的交易冲突图如图2所示,箭头指向代表按该顺序执行交易会发生冲突,图2中冲突表示为t1指向t2和t3。
[0069]
表1:
[0070]
交易读集写集是否有效t1-(k1,v1=>v2)是t2(k1,v1),(k2,v1)(k2,v1=>v2)否t3(k1,v1),(k3,v1)(k3,v1=>v2)否
[0071]
具体地,从区块链中获取由客户端在同一时刻发起的交易集合;通过超级账本中的背书节点将交易集合中各交易的交易请求参数转化为对应的读写集,并以键值对的形式对读写集进行保存;根据各交易的键值对构建交易集合的交易冲突图。
[0072]
步骤104,通过求有向图强连通分量的算法对交易冲突图进行分解,得到对应的强连通图集。
[0073]
其中,求有向图强连通分量的算法可以是tarjan算法。如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected)。如果有向图g的每两个顶点都强连通,称g是一个强连通图。
[0074]
具体地,通过tarjan算法对交易冲突图进行分解,得到该交易冲突图中所有的强连通图,强连通图中每个节点代表一个交易。
[0075]
步骤106,根据强连通图集标记交易集合中每个交易出现的总次数。
[0076]
具体地,强连通图集中各强连通图中每个节点代表一个交易,标记每个交易出现的总次数。
[0077]
步骤108,将代表总次数最多的交易的节点从交易冲突图中移除,并更新每个交易出现的总次数,直到交易冲突图中不存在强连通图,得到无冲突交易图。
[0078]
可选地,当存在至少两个总次数最多的交易时,根据交易的交易标识确定目标交易;将代表目标交易的节点从交易冲突图中移除,并更新每个交易出现的总次数,直到交易冲突图中不存在强连通图,得到无冲突交易图。具体地,当存在至少两个总次数最多的交易时,获取总次数最多交易的交易标识,将交易标识最小的交易作为目标交易,并将代表目标交易的节点从交易冲突图中移除,并更新每个交易出现的总次数,直到交易冲突图中不存在强连通图,得到无冲突交易图。
[0079]
步骤110,基于无冲突交易图中每个节点的方向,通过超级账本的排序节点确定无冲突交易图中有效交易的执行顺序。
[0080]
上述超级账本中的交易排序方法中,通过构建区块链中同一时刻发起的交易集合对应的交易冲突图,基于求有向图强连通分量的算法,对交易冲突图进行分解,得到交易集合对应的所有强连通图;强连通图中的每一个节点代表一个交易,根据所有强连通图标记交易集合中的每个交易出现的次数;对每个交易出现的次数进行排序,将总次数最多的交易对应的节点从交易冲突图中移除,直到交易冲突图中不存在强连通图,得到无冲突的交易图,基于无冲突交易图中每个节点的方向,通过超级账本的排序节点确定无冲突交易图中有效交易的执行顺序,即对区块链上的交易进行排序之前,通过对区块链上同一时刻发起的所有交易进行验证,移除其中无效的交易,通过超级账本的排序节点对将不存在冲突的交易进行排序,减少排序节点的数据处理量,提高了排序节点的数据处理效率,进而优化了超级账本的性能。
[0081]
在一个实施例中,如图3所示,提供了一种超级账本中的交易冲突图构建方法,本实施例以该方法应用于服务器进行举例说明,本实施例中,该方法包括以下步骤:
[0082]
步骤302,从区块链中获取由客户端在同一时刻发起的交易集合。
[0083]
步骤304,通过超级账本中的背书节点将交易集合中各交易的交易请求参数转化为对应的读写集;读写集以键值对的形式进行保存。
[0084]
其中,交易请求是指对超级账本中的某一数据进行增删改查,交易请求参数包括操作对象和操作对象的值的信息,例如,操作对象是账户名称,例如账户a,交易请求可以是查询a的值,删除a的值,修改a的值;交易请求还可以是添加一个新账户b。键值对的形式可以表示为key-value(k-v),k代表账户名称信息,v代表账户对应的值的信息,包括世界状态版本号。
[0085]
具体地,从区块链中获取由客户端在同一时刻发起的交易集合,通过超级账本中的背书节点将交易集合中各交易的交易请求参数转化为对应的读写集;读写集以键值对的形式进行保存。
[0086]
步骤306,依次检测交易集合中各交易的键值对的读写操作。
[0087]
步骤308,当检测到交易集合中一个交易的写集的键值对被执行写操作,且交易的读集的键值对被交易集合中的其它交易执行读操作时,确定交易与对交易的读集的键值对执行了读操作的其它交易存在交易冲突。
[0088]
步骤310,根据交易集合中存在交易冲突的各交易,构建交易集合的交易冲突图。
[0089]
可选地,从区块链中获取由客户端在同一时刻发起的交易集合中包括交易t0、t1、t2、t3、t4、t5,如表2所示,其中,0表示未对该键值进行读操作,1表示对该键值进行了读操作,每个交易在执行时分别去读取对应的读集;如表3所示,其中,0表示未对该键值进行写操作,1表示对该键值进行了写操作,每个交易在执行时需对对应的写集执行写的操作;当执行交易t0时,检测到交易集合中交易t0的写集的键值对被执行写操作,且交易t0的读集的键值对被交易集合中的交易t3执行读操作时,则t0和t3之间存在交易冲突;当执行交易t1时,检测到交易集合中交易t1的写集的键值对被执行写操作,且交易t1的读集的键值对被交易集合中的交易t0执行读操作时,则t0和t1之间存在交易冲突;当执行交易t2时,检测到交易集合中交易t2的写集的键值对被执行写操作,且交易t2的读集的键值对被交易集合中的交易t1、t4执行读操作时,则t2和t1、t4之间存在交易冲突;当执行交易t3时,检测到交易集合中交易t3的写集的键值对被执行写操作,且交易t3的读集的键值对被交易集合中的交易t1、t0执行读操作时,则t3和t1、t0之间存在交易冲突;当执行交易t4时,检测到交易集合中交易t4的写集的键值对被执行写操作,且交易t4的读集的键值对被交易集合中的交易t1、t2及t3执行读操作时,则t4和t1、t2、t3之间存在交易冲突;当执行交易t5时,检测到交易集合中交易t5的写集的键值对被执行写操作,且交易t5的读集的键值对被交易集合中的交易t2执行读操作时,则t5和t2之间存在交易冲突。
[0090]
表2:
[0091]
[0092][0093]
表3:
[0094][0095]
根据t0、t1、t2、t3、t4、t5之间的冲突关系,根据交易集合中存在交易冲突的各交易,构建交易集合的交易冲突图,如图4所示。
[0096]
上述超级账本中的交易冲突图构建方法中,从区块链中获取由客户端在同一时刻发起的交易集合,通过超级账本中的背书节点将交易集合中各交易的交易请求参数转化为对应的读写集;读写集以键值对的形式进行保存,依次检测交易集合中各交易的键值对的读写操作,确定交易集合中的存在交易冲突的交易,得到交易集合的交易冲突图,通过构建交易冲突图可以确定交易集合中存在冲突的交易。
[0097]
在另一个实施例中,如图5所示,提供了一种超级账本中的交易排序方法,本实施例以该方法应用于服务器进行举例说明,本实施例中,该方法包括以下步骤:
[0098]
步骤502,构建区块链中同一时刻发起的交易集合对应的交易冲突图;交易冲突图中的每一节点代表一个交易。
[0099]
具体地,从区块链中获取由客户端在同一时刻发起的交易集合;通过超级账本中的背书节点将交易集合中各交易的交易请求参数转化为对应的读写集;读写集以键值对的形式进行保存;依次检测交易集合中各交易的键值对的读写操作;当检测到交易集合中一个交易的写集的键值对被执行写操作,且交易的读集的键值对被交易集合中的其它交易执行读操作时,确定交易与对交易的读集的键值对执行了读操作的其它交易存在交易冲突;根据交易集合中存在交易冲突的各交易,构建交易集合的交易冲突图。
[0100]
步骤504,通过求有向图强连通分量的算法对交易冲突图进行分解,得到对应的强连通图集。
[0101]
步骤506,根据强连通图集标记交易集合中每个交易出现的总次数。
[0102]
具体地,确定强连通图集中每个强连通图中的交易闭合环,根据交易闭合环标记交易集合中每个交易出现的总次数。
[0103]
步骤508,当存在至少两个总次数最多的交易时,根据交易的交易标识确定目标交易。
[0104]
具体地,当存在至少两个总次数最多的交易时,获取总次数最多的交易携带的交
易标识的数值;将数值最小的交易标识对应的交易作为目标交易。
[0105]
步骤510,将代表目标交易的节点从交易冲突图中移除,并更新每个交易出现的总次数,直到交易冲突图中不存在强连通图,得到无冲突交易图。
[0106]
步骤512,基于无冲突交易图中每个节点的方向,通过超级账本的排序节点确定无冲突交易图中有效交易的执行顺序。
[0107]
可选地,通过求有向图强连通分量的算法对交易冲突图(图4)进行分解,得到对应的强连通图集(图6a和图6b),确定每个强连通图中的交易闭合环,根据交易闭合环标记交易集合中每个交易出现的总次数,每个交易出现的总次数以表4所示,得到强连通图中的交易闭合环c1、c2和c3,存在总次数最多的交易为t0和t3,t0携带的交易标识的数值为0,t3携带的交易标识的数值为3,将t0作为目标交易。将t0从交易冲突图中移除,并移除与之相关的箭头(如图7a所示,用“x”表示移除),并更新每个交易出现的总次数,直到交易冲突图中不存在强连通图,即将t0和t2移除后得到无冲突交易图,如图7b所示,其中,虚线代表交易(t0和t2)被移除。基于无冲突交易图中每个节点的箭头指向,逆箭头方向的交易不冲突(即交易顺序不能包含箭头指向),得到无冲突交易图中有效交易的执行顺序为t5=>t1=>t3=>t4。
[0108]
表4:
[0109][0110][0111]
步骤514,将有效交易的执行顺序发送至超级账本中的验证节点。
[0112]
步骤516,基于执行顺序,通过验证节点对各有效交易的读集中的世界状态版本号进行验证,得到验证结果。
[0113]
具体地,根据有效交易的执行顺序,依次对有效交易进行验证,读取每个有效交易读集中的世界状态版本号,若与当前对应的世界状态版本号一致时,则验证通过。
[0114]
可选地,在一个实施例中,在通过验证节点对各有效交易的读集中的世界状态版本号进行验证,得到验证结果之前,方法还包括:基于执行顺序,获取各有效交易的交易签名;对交易签名进行验证,当验证通过时,根据交易签名的签名信息对提交有效交易的交易节点的提交权限进行验证;当交易节点具有提交权限时,执行通过验证节点对各有效交易的读集中的世界状态版本号进行验证步骤。
[0115]
具体地,当超级账本的背书节点在提交交易时,通过私钥在交易请求中请求交易签名,在验证节点通过对应的公钥对交易签名进行验证,当验证通过时,根据交易签名的签名信息对提交有效交易的交易节点的提交权限进行验证;当交易节点具有提交权限时,根据有效交易的执行顺序,依次对有效交易进行验证,读取每个有效交易读集中的世界状态版本号,若与当前对应的世界状态版本号一致时,则验证通过,通过对交易进行验证,找出部分无效交易,避免数据混乱,便于对数据的维护。
[0116]
步骤518,当验证结果为有效交易不存在冲突时,通过提交节点将有效交易的写集
更新到区块链上。
[0117]
上述超级账本中的交易排序方法中,通过超级账本中的背书节点将区块链上同一时刻发起的交易集合的交易请求参数转化为读写集,确定交易集合中的冲突交易,根据冲突交易构建交易冲突图;通过tarjan算法剔除无效交易,将剩余交易重新排序,将得到执行顺序提交给验证节点,从而对交易进行验证并执行交易,不需要验证节点逐一验证每笔交易的有效性,提高了验证节点的速度与效率,也减小了节点提交交易后的等待时间,一定程度上优化了超级账本的性能。
[0118]
应该理解的是,虽然图1、3、5的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1、3、5中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
[0119]
在一个实施例中,如图8所示,提供了一种超级账本中的交易排序装置,包括:构建模块802、分解模块804、标记模块806、更新模块808和排序模块810,其中:
[0120]
构建模块802,用于构建区块链中同一时刻发起的所有交易对应的交易冲突图;交易冲突图中的每一节点代表一个交易。
[0121]
分解模块804,用于通过求有向图强连通分量的算法对交易冲突图进行分解,得到对应的强连通图集。
[0122]
标记模块806,用于根据强连通图集标记每个交易出现的总次数。
[0123]
更新模块808,用于将代表总次数最多的交易的节点从交易冲突图中移除,并更新每个交易出现的总次数,直到交易冲突图中不存在强连通图,得到无冲突交易图。
[0124]
排序模块810,用于根据无冲突交易图中每个节点的方向确定无冲突交易图中有效交易的执行顺序。
[0125]
上述超级账本中的交易排序装置,通过构建区块链中同一时刻发起的交易集合对应的交易冲突图,基于求有向图强连通分量的算法,对交易冲突图进行分解,得到交易集合对应的所有强连通图;强连通图中的每一个节点代表一个交易,根据所有强连通图标记交易集合中的每个交易出现的次数;对每个交易出现的次数进行排序,根据交易的总次数将无效交易从交易冲突图中移除,直到交易冲突图中不存在强连通图,得到无冲突的交易图,通过超级账本的排序节点对无冲突交易图中有效交易进行排序,得到交易的执行顺序,即对区块链上的交易进行排序之前,对同一时刻发起的所有交易进行验证,剔除无效的交易,通过超级账本的排序节点对将不存在冲突的交易进行排序,提高了排序节点的数据处理效率,进而优化了超级账本的性能。
[0126]
在另一个实施例中,如图9所示,提供了一种超级账本中的交易排序装置,除包括构建模块802、分解模块804、标记模块806、更新模块808和排序模块810之外,还包括:获取模块812、检测模块814、确定模块816、移除模块818、验证模块820和更新模块822,其中:
[0127]
获取模块812,用于从区块链中获取由客户端在同一时刻发起的交易集合。
[0128]
构建模块802还用于通过超级账本中的背书节点将交易集合中各交易的交易请求
参数转化为对应的读写集;读写集以键值对的形式进行保存;根据各交易的键值对构建交易集合的交易冲突图。
[0129]
检测模块814,用于依次检测交易集合中各交易的键值对的读写操作;当检测到交易集合中一个交易的写集的键值对被执行写操作,且交易的读集的键值对被交易集合中的其它交易执行读操作时,确定交易与对交易的读集的键值对执行了读操作的其它交易存在交易冲突。
[0130]
构建模块802还用于根据交易集合中存在交易冲突的各交易,构建交易集合的交易冲突图。
[0131]
确定模块816,用于当存在至少两个总次数最多的交易时,根据交易的交易标识确定目标交易。
[0132]
确定模块816还用于当存在至少两个总次数最多的交易时,获取总次数最多的交易携带的交易标识的数值;将数值最小的交易标识对应的交易作为目标交易。
[0133]
移除模块818,用于将代表目标交易的节点从交易冲突图中移除,并更新每个交易出现的总次数,直到交易冲突图中不存在强连通图,得到无冲突交易图。
[0134]
验证模块820,用于将有效交易的执行顺序发送至超级账本中的验证节点;基于执行顺序,通过验证节点对各有效交易的读集中的世界状态版本号进行验证,得到验证结果。
[0135]
更新模块822,用于当验证结果为有效交易不存在冲突时,通过提交节点将有效交易的写集更新到区块链上。
[0136]
验证模块820还用于基于执行顺序,获取各有效交易的交易签名;对交易签名进行验证,当验证通过时,根据交易签名的签名信息对提交有效交易的交易节点的提交权限进行验证;当交易节点具有提交权限时,执行通过验证节点对各有效交易的读集中的世界状态版本号进行验证步骤。
[0137]
在一个实施例中,通过超级账本中的背书节点将区块链上同一时刻发起的交易集合的交易请求参数转化为读写集,确定交易集合中的冲突交易,根据冲突交易构建交易冲突图;通过tarjan算法剔除无效交易,将剩余交易重新排序,将得到执行顺序提交给验证节点,从而对交易进行验证并执行交易,不需要验证节点逐一验证每笔交易的有效性,提高了验证节点的速度与效率,也减小了节点提交交易后的等待时间,一定程度上优化了超级账本的性能。
[0138]
关于超级账本中的交易排序装置的具体限定可以参见上文中对于超级账本中的交易排序方法的限定,在此不再赘述。上述超级账本中的交易排序装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
[0139]
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图9所示。该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储交易数据。该计算机设备的网络接口用于与外部的终端通过网络连接通
信。该计算机程序被处理器执行时以实现一种超级账本中的交易排序方法。
[0140]
本领域技术人员可以理解,图9中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
[0141]
在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:
[0142]
构建区块链中同一时刻发起的交易集合对应的交易冲突图;交易冲突图中的每一节点代表一个交易;
[0143]
通过求有向图强连通分量的算法对交易冲突图进行分解,得到对应的强连通图集;
[0144]
根据强连通图集标记交易集合中每个交易出现的总次数;
[0145]
将代表总次数最多的交易的节点从交易冲突图中移除,并更新每个交易出现的总次数,直到交易冲突图中不存在强连通图,得到无冲突交易图;
[0146]
基于无冲突交易图中每个节点的方向,通过超级账本的排序节点确定无冲突交易图中有效交易的执行顺序。
[0147]
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
[0148]
从区块链中获取由客户端在同一时刻发起的交易集合;
[0149]
通过超级账本中的背书节点将交易集合中各交易的交易请求参数转化为对应的读写集;读写集以键值对的形式进行保存;
[0150]
根据各交易的键值对构建交易集合的交易冲突图。
[0151]
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
[0152]
依次检测交易集合中各交易的键值对的读写操作;
[0153]
当检测到交易集合中一个交易的写集的键值对被执行写操作,且交易的读集的键值对被交易集合中的其它交易执行读操作时,确定交易与对交易的读集的键值对执行了读操作的其它交易存在交易冲突;
[0154]
根据交易集合中存在交易冲突的各交易,构建交易集合的交易冲突图。
[0155]
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
[0156]
当存在至少两个总次数最多的交易时,根据交易的交易标识确定目标交易;
[0157]
将代表目标交易的节点从交易冲突图中移除,并更新每个交易出现的总次数,直到交易冲突图中不存在强连通图,得到无冲突交易图。
[0158]
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
[0159]
将有效交易的执行顺序发送至超级账本中的验证节点;
[0160]
基于执行顺序,通过验证节点对各有效交易的读集中的世界状态版本号进行验证,得到验证结果;
[0161]
当验证结果为有效交易不存在冲突时,通过提交节点将有效交易的写集更新到区块链上。
[0162]
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
[0163]
基于执行顺序,获取各有效交易的交易签名;
[0164]
对交易签名进行验证,当验证通过时,根据交易签名的签名信息对提交有效交易
的交易节点的提交权限进行验证;
[0165]
当交易节点具有提交权限时,执行通过验证节点对各有效交易的读集中的世界状态版本号进行验证步骤。
[0166]
在一个实施例中,处理器执行计算机程序时还实现以下步骤:
[0167]
当存在至少两个总次数最多的交易时,获取总次数最多的交易携带的交易标识的数值;
[0168]
将数值最小的交易标识对应的交易作为目标交易。
[0169]
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
[0170]
构建区块链中同一时刻发起的交易集合对应的交易冲突图;交易冲突图中的每一节点代表一个交易;
[0171]
通过求有向图强连通分量的算法对交易冲突图进行分解,得到对应的强连通图集;
[0172]
根据强连通图集标记交易集合中每个交易出现的总次数;
[0173]
将代表总次数最多的交易的节点从交易冲突图中移除,并更新每个交易出现的总次数,直到交易冲突图中不存在强连通图,得到无冲突交易图;
[0174]
基于无冲突交易图中每个节点的方向,通过超级账本的排序节点确定无冲突交易图中有效交易的执行顺序。
[0175]
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
[0176]
从区块链中获取由客户端在同一时刻发起的交易集合;
[0177]
通过超级账本中的背书节点将交易集合中各交易的交易请求参数转化为对应的读写集;读写集以键值对的形式进行保存;
[0178]
根据各交易的键值对构建交易集合的交易冲突图。
[0179]
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
[0180]
依次检测交易集合中各交易的键值对的读写操作;
[0181]
当检测到交易集合中一个交易的写集的键值对被执行写操作,且交易的读集的键值对被交易集合中的其它交易执行读操作时,确定交易与对交易的读集的键值对执行了读操作的其它交易存在交易冲突;
[0182]
根据交易集合中存在交易冲突的各交易,构建交易集合的交易冲突图。
[0183]
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
[0184]
当存在至少两个总次数最多的交易时,根据交易的交易标识确定目标交易;
[0185]
将代表目标交易的节点从交易冲突图中移除,并更新每个交易出现的总次数,直到交易冲突图中不存在强连通图,得到无冲突交易图。
[0186]
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
[0187]
将有效交易的执行顺序发送至超级账本中的验证节点;
[0188]
基于执行顺序,通过验证节点对各有效交易的读集中的世界状态版本号进行验证,得到验证结果;
[0189]
当验证结果为有效交易不存在冲突时,通过提交节点将有效交易的写集更新到区块链上。
[0190]
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
[0191]
基于执行顺序,获取各有效交易的交易签名;
[0192]
对交易签名进行验证,当验证通过时,根据交易签名的签名信息对提交有效交易的交易节点的提交权限进行验证;
[0193]
当交易节点具有提交权限时,执行通过验证节点对各有效交易的读集中的世界状态版本号进行验证步骤。
[0194]
在一个实施例中,计算机程序被处理器执行时还实现以下步骤:
[0195]
当存在至少两个总次数最多的交易时,获取总次数最多的交易携带的交易标识的数值;
[0196]
将数值最小的交易标识对应的交易作为目标交易。
[0197]
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(read-only memory,rom)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器(random access memory,ram)或外部高速缓冲存储器。作为说明而非局限,ram可以是多种形式,比如静态随机存取存储器(static random access memory,sram)或动态随机存取存储器(dynamic random access memory,dram)等。
[0198]
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
[0199]
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。