对区块链中的交易进行分组的方法和装置
技术领域
本说明书实施例涉及区块链技术领域,更具体地,涉及一种对区块链中的交易进行分组的方法和装置。
背景技术
区块链技术也被称之为分布式账本技术,区块链中的每个全节点都有全量的、一致的数据。为了保证每个全节点具有一致的数据,对区块链中的多个交易进行并发处理的前提是确保并发执行的交易之间没有任何数据依赖关系。在例如Hyperledger Fabric区块链(下文简称为Fabric区块链)中,由背书节点预执行各个交易生成各个交易的读写集,所述读写集中包括在预执行交易的过程中读取的变量或写入的变量。Fabric区块链中的提交节点在对区块进行入块时,执行区块中的交易,基于当前的世界状态,确定区块中的每个交易的读写集是否可成功执行,如果可成功执行,则相应地更改世界状态。因此,如果两个交易的访问变量没有读写冲突,则其导致的世界状态的改变不会影响另一个交易的执行,因此该两个交易可以并发执行。如果两个交易的访问变量存在读写冲突,则只能串行执行。
若在执行一批交易前,根据各个交易的读写集之间的重叠关系,将读写集有重叠的交易放到同一个组中,则可以保证不同组内的交易之间一定没有数据依赖关系。传统方案为单线程根据各个交易读写集的重叠性来进行交易分组,当待分组交易数达到数万个时,分组算法耗时达到数百毫秒,会严重制约整个系统的吞吐率。
因此,需要一种更有效的对区块链中的交易进行分组的方案。
发明内容
本说明书实施例旨在提供一种更有效的对区块链中的交易进行分组的方案,以解决现有技术中的不足。
为实现上述目的,本说明书一个方面提供一种对区块链中的交易进行分组的方法,包括:
获取多个交易的第一子集和第二子集,其中,所述第一子集中包括相互之间没有共同访问变量的多个交易组,所述第二子集中包括相互之间没有共同访问变量的多个交易组;
从所述第一子集和所述第二子集中确定多个关联交易组对,所述关联交易组对中包括访问相同变量的两个交易组;
基于所述多个关联交易组对,将关联的交易组合并为一个交易组,作为所述多个交易的交易组。
在一种实施方式中,从所述第一子集和所述第二子集中确定多个关联交易组对包括:
获取第一子集的第一访问变量位图;
获取第二子集的第二访问变量位图;
对所述第一访问变量位图和所述第二访问变量位图进行位图与操作,获取重叠变量位图,所述重叠变量位图指示第一子集和第二子集共同访问的变量;
基于所述重叠变量位图中指示的变量对应的第一子集中的交易组和第二子集中的交易组,确定关联交易组对。
在一种实施方式中,对所述第一访问变量位图和所述第二访问变量位图进行位图与操作包括,通过simd指令对所述第一访问变量位图和所述第二访问变量位图进行位图与操作。
在一种实施方式中,所述方法还包括,获取第一访问变量位图中各个变量与第一子集中的交易组的对应关系,获取第二访问变量位图中各个变量与第二子集中的交易组的对应关系。
在一种实施方式中,基于所述多个关联交易组对,将关联的交易组合并为一个交易组包括:将关联交易组对中的两个交易组合并到一个交易组中。
在一种实施方式中,基于所述多个关联交易组对,将关联的交易组合并为一个交易组包括:确定包括相同交易组的第一交易组对和第二交易组对,将第一交易组对和第二交易组对中包括的交易组合并到一个交易组中。
在一种实施方式中,基于所述多个关联交易组对,将关联的交易组合并为一个交易组,作为所述多个交易的交易组包括,基于所述多个关联交易组对,将关联的交易组合并为一个交易组,作为第三子集中的交易组,所述第三子集为合并第一子集和第二子集的子集,所述方法还包括,对所述第一访问变量位图和所述第二访问变量位图进行位图或操作,以获取第三子集的第三访问变量位图。
本说明书另一方面提供一种对区块链中的交易进行分组的装置,包括:
获取单元,配置为,获取多个交易的第一子集和第二子集,其中,所述第一子集中包括相互之间没有共同访问变量的多个交易组,所述第二子集中包括相互之间没有共同访问变量的多个交易组;
确定单元,配置为,从所述第一子集和所述第二子集中确定多个关联交易组对,所述关联交易组对中包括访问相同变量的两个交易组;
合并单元,配置为,基于所述多个关联交易组对,将关联的交易组合并为一个交易组,作为所述多个交易的交易组。
在一种实施方式中,所述确定单元包括:
第一获取子单元,配置为,获取第一子集的第一访问变量位图;
第二获取子单元,配置为,获取第二子集的第二访问变量位图;
与操作子单元,配置为,对所述第一访问变量位图和所述第二访问变量位图进行位图与操作,获取重叠变量位图,所述重叠变量位图指示第一子集和第二子集共同访问的变量;
确定子单元,配置为,基于所述重叠变量位图中指示的变量对应的第一子集中的交易组和第二子集中的交易组,确定关联交易组对。
在一种实施方式中,所述与操作子单元配置为,通过simd指令对所述第一访问变量位图和所述第二访问变量位图进行位图与操作。
在一种实施方式中,所述装置还包括,第一获取单元,配置为,获取第一访问变量位图中各个变量与第一子集中的交易组的对应关系,第二获取单元,配置为,获取第二访问变量位图中各个变量与第二子集中的交易组的对应关系。
在一种实施方式中,所述合并单元配置为:将关联交易组对中的两个交易组合并到一个交易组中。
在一种实施方式中,所述合并单元配置为:确定包括相同交易组的第一交易组对和第二交易组对,将第一交易组对和第二交易组对中包括的交易组合并到一个交易组中。
在一种实施方式中,所述合并单元配置为,基于所述多个关联交易组对,将关联的交易组合并为一个交易组,作为第三子集中的交易组,所述第三子集为合并第一子集和第二子集的子集,所述装置还包括,或操作单元,配置为,对所述第一访问变量位图和所述第二访问变量位图进行位图或操作,以获取第三子集的第三访问变量位图。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
通过根据本说明书实施例的对区块链中的交易并行分组的方法,通过位图来描述子集中的交易访问的变量集合,通过simd指令进行位操作,快速获知交易组之间的数据冲突问题并进行分组合并。通过采用多线程并行进行交易分组,每个线程处理的问题规模仅为原始问题规模的1/N(N为线程数);通过采用simd指令,一次可以同时处理多个变量的重叠访问关系,当需要访问几万个变量时,仅需要几百条指令就可以完成重叠关系的确定,进而进行交易组的合并。在执行过程中完全无锁,可并行执行,从而可以极大降低进行交易分组的时间开销。
附图说明
通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:
图1示出Fabric区块链的结构示意图;
图2示出根据本说明书实施例的对区块链中的交易进行分组的示意图;
图3示出根据本说明书实施例的一种对区块链中的交易进行分组的方法流程图;
图4示出对步骤S304的一种具体实施方式的示意图;
图5示出根据本说明书实施例的一种对区块链中的交易进行分组的装置500。
具体实施方式
下面将结合附图描述本说明书实施例。
图1示出Fabric区块链的结构示意图。Fabric区块链是一种面向企业的联盟链。如图1所示,Fabric区块链中包括以下多种类型的节点:客户端节点11、对等节点(Peer)12、排序节点(orderer)13等等。所述对等节点12中又包括背书节点(Endorsor)121、提交节点(Committer)122等。Fabric区块链中包括多个通道(channel),每个通道具有自身封闭的账本数据和链码(chaincode),所述链码即为Fabric区块链中的智能合约。对等节点12可选择加入哪些通道,其在经过通道中已有的对等节点的身份验证之后可加入该通道。
如图1中所示,客户端节点11可向Fabirc区块链中的某个通道发起交易提案,从而,客户端节点11向该通道中的至少两个背书节点121发送交易提案。通道中的背书节点121具有交易提案系统接口,从而背书节点可通过调用该系统接口对从客户端节点接收的交易提案进行预执行并进行数字签名,并在预执行之后将预执行结果和数字签名返回给所述客户端节点11。所述预执行结果为在预执行交易过程中的读写集。图1中示意示出了读写集。读写集中包括读集(Rset)和写集(Wset)。其中,读集为背书节点在预执行交易的过程中读取的变量值,其以键值(Key-Value)对的形式进行记录,如图1中所示,读集中的“123abc456:2”表示,读取变量123abc456(Key)的值为2,其中123abc456为变量名。写集为背书节点在预执行交易的过程中对变量预写入的值,即,该对变量的写入只是记录在写集中,并未更改世界状态,同样地,写集中也以键值对的形式进行记录。
所述客户端节点11在从各个背书节点121接收到交易预执行结果和签名之后,将交易信息发送给排序节点13,以提交交易,所述交易信息中包括交易的交易提案和交易预执行结果及其签名。排序节点13用于对交易进行排序、并将经排序的交易按照固定的时间间隔打包成区块,并发送给区块链中的每个提交节点122。提交节点122在收到区块之后执行交易,即,基于世界状态验证区块中每个交易的读写集是否可成功执行,在区块的每个交易中标记其执行状态(即成功或失败),然后将区块加入本节点的账本数据中(即,提交区块)。
例如,区块中包括顺序排列的交易Tx1和交易Tx2,交易Tx2为在后交易,交易Tx2包括对变量123abc456的读取,交易Tx1包括对变量123abc456的写入,由于预执行各个交易时并不改变世界状态,即,预执行交易Tx1时并未改变变量123abc456的值,而在由提交节点执行交易Tx1之后将改变变量123abc456的值。因此,在预执行交易Tx2时读取的变量123abc456的值和执行交易Tx2时读取的变量123abc456值是不同的,在该情况中,提交节点122将判断交易Tx2的读写集不能成功执行。从该实例可以看出,交易Tx1和交易Tx2的读写集中记录了相同的变量时,可确定交易Tx1和交易Tx2可能存在读写冲突,因此交易Tx1和交易Tx2需要按照其排序串行执行。如果两个交易的读写集中未记录相同的变量,则其不会存在读写冲突,在该情况中,就可以对其并发执行。也就是说,为了确定各个交易是否可并发执行,需要判断各个交易的读写集中是否记录了相同的变量。通过将读写集有重叠关系的交易放到一个组中,从而可保证不同组内的交易之间没有数据依赖关系,以并发执行各个组中的交易。
图2示出根据本说明书实施例的对区块链中的交易进行分组的示意图。如图2所示,在对区块链中的多个交易(如图2中的N个交易)进行分组时,首先在阶段I,将多个交易划分为多个子集,图2中示意示出子集1、子集2、子集3,子集4,其中各个子集相互之间没有交集。在该划分之后,每个子集中都包括N个交易中的一部分交易,例如,每个子集中可包括近似N/4个交易。之后,在阶段II,可对每个子集中的交易进行分组。例如可基于子集中各个交易的读写集对交易进行分组,以使得一个子集中的各个交易组相互之间没有访问相同的变量,也就是说,一个交易组中的交易的读写集与另一个交易组中的交易的读写集没有重叠关系。如图2中所示,例如,将子集1中的交易分为A组、D组和E组,将子集2中的交易分为B组、C组和F组,将子集3中的交易分为G组、H组,将子集4中的交易分为I组合J组。可以理解,图2中示出的对子集中的交易进行分组获取的交易组数仅仅是示意性的,在实际计算中,每个子集中分组的交易组数通常更多。在完成对各个子集的交易的分组之后,在阶段III,基于各个子集中的交易组对变量访问的重叠情况,将各个子集中的交易组进行合并,例如,组A与组B中的交易都包括对变量a的访问,组A与组C中的交易都包括对变量b的访问,从而,将组A、组B和组C合并为一个交易组。如图2中所示,将子集1与子集2具有关联关系的交易组进行合并之后,将该合并的交易组放入新的子集5中,并将子集1和子集2中的其它交易组加入子集5中,从而获取合并子集1和子集2的子集5。可通过相同的方式获取合并子集3和子集4的子集6,最后,与上文类似地将子集5与子集6合并,从而获取N个交易的最终的交易分组结果。
图2所示过程可由多线程并行执行,例如,在将N个交易分为子集1~子集4之后,在阶段II,可由线程t1~线程t4(图2中未示出)并行对子集1~子集4中的交易进行分组。之后,在阶段III,例如,可由线程t1获取子集2,并对子集1和子集2进行合并,从而获取子集5,由线程t3获取子集4,并对子集3和子集4进行合并,从而获取子集6,最后,可由线程t1获取子集6,并对子集5和子集6进行合并,从而获取N个交易的最终的多个交易组。
可以理解,在上述描述中,虽然以Fabric链为例进行描述,本说明书实施例不限于此,例如,在以太坊链的情况中,可基于交易中对账户的访问情况确定交易访问的变量,从而可基于此进行交易分组。
下面将详细描述上述根据本说明书实施例的对区块链中的交易进行分组的过程。
图3示出根据本说明书实施例的一种对区块链中的交易进行分组的方法流程图,包括:
步骤S302,获取多个交易的子集1和子集2,其中,每个子集包括多个交易组;
步骤S304,从子集1和子集2中确定多个关联交易组对,每个关联交易组对中的两个交易组访问相同变量;
步骤S306,基于所述多个关联交易组对,将关联的交易组合并为一个交易组。
图3所示方法例如由上述多个线程中的线程t1执行。多个线程通过并行地执行如图3所示的交易分组过程,从而获取例如上述N各交易的最终分组结果。
首先,在步骤S302,获取多个交易的子集1和子集2,其中,每个子集包括多个交易组。
参考上文的描述,线程t1在阶段II对子集1的分组操作完成之后,线程t1将对子集1的分组结果存储到共享内存中,并在共享内存中与子集1对应的变量(或者位)中记录对子集1的分组完成。之后,线程t1在共享内存中读取与各个子集分别对应的各个变量,以确定有没有其它子集已经分组完成。例如,与子集2对应的变量的值指示子集2的分组已经完成,因此,线程t1在共享内存中获取对子集2的分组结果。也就是说,线程t1获取图2中的子集1和子集2,该子集1和子集2中都包括经上述分组过程获得的多个交易组。
在步骤S304,从子集1和子集2中确定多个关联交易组对,每个关联交易组对中的两个交易组访问相同变量。
根据子集1和子集2中各个交易的读写集可确定各个交易的访问变量,从而可确定子集1和子集2中访问相同变量的两个交易组作为关联交易组。
具体实施时,为了高效便利地确定子集1和子集2中的关联交易组,本说明书实施例中基于变量位图来操作。图4示出对步骤S304的一种具体实施方式的示意图。如图4中所示,线程t1首先获取子集1的变量位图和子集2的变量位图。所述变量位图包括与各个变量分别对应的位,变量位图中各位的值表示相应变量的存在性指示。例如如图4中底部小写字母所示,变量位图中包括与变量a、b、c、d、e对应的位,其中,在子集1的变量位图中,与变量a对应的位的值为1,表示子集1中有至少一个交易包括对变量a的访问,在子集2的变量位图中,与变量e对应的位的值为0,表示子集2中的全部交易都不访问变量e。为了获取例如子集1的变量位图,可首先获取子集1中每个交易的变量位图,然后,通过对子集1中的每两个交易的变量位图进行位图或操作,也即对两个交易的变量问题的每对对应位进行位或操作,从而可最终获取子集1的变量位图。其中,所述变量位图中的各个变量的位置可以人为设定,或者可以与变量存在一定对应关系,例如变量位图中的位对应于变量的哈希值、或者对应于变量的预定排序等,对此不作限定。
在获取子集1的变量位图之后,线程t1还可以获取子集1中各个交易组的变量位图,从而可基于各个交易组的变量位图,确定各个变量对应的交易组。类似地,各个交易组的变量位图可以通过对交易组中包括的每两个交易的变量位图进行位图或操作,从而获取交易组的变量位图。例如,线程t1可从A组的变量位图中读取与变量a对应的位为1,从而可确定子集1中的变量a与A组相对应,从而,线程t1记录子集1中的变量a与A组的对应关系,图4中在子集1的变量位图中的与变量a对应的位的下方示出“A”,以指示在子集1中变量a与A组的对应关系。
其中,子集2的变量位图可由线程t1通过上述过程获取,或者可由线程t2通过上述过程获取并存入共享内存中,从而线程t1可从共享内存中读取子集2的变量位图。类似地,线程t2也可以预先确定子集2中包括的各个变量与子集2中的交易组的对应关系并将其记录到共享内存中,如子集2变量位图下方的大写字母所示,从而线程t1可从共享内存中获取该对应关系。
线程t1在获取子集1的变量位图和子集2的变量位图之后,对这两个位图进行位图与操作,也即对这两个位图的每对对应位进行位与操作,从而可获取子集1和子集2中重叠的变量,之后,线程t1将该位图与操作的结果记录到图4中的重叠变量位图中。其中,该重叠变量位图的各位也与各个变量分别对应,并且该重叠变量位图中的各位的值表示相应的变量是否为子集1和子集2的重叠变量(即共同访问的变量)。如图4中所示,子集1变量位图中与变量a对应的位为1,子集2变量位图中与变量a对应的位为1,因此通过对这两个位进行位与操作,从而获得重叠变量位图中与变量a对应的位为1,这表示子集1和子集2中都包括对变量a的访问。
在一种实施方式中,可通过多数据单指令(Single Instruction MultipleData,simd指令)来进行上述位与操作。所述simd指令例如为ARM的NEON指令或英特尔的avx512指令。通过该simd指令,可通过单个指令对连续多个存储单元(例如多位)同时进行并行操作。即,在本说明书实施例中,通过使用simd指令,可并行进行对子集1变量位图和子集2变量位图中的各对对应位的位与操作,从而提高计算效率。
在进行上述位图与操作从而获取重叠变量位图之后,线程t1可基于重叠变量位图中的重叠变量确定子集1和子集2的关联交易组对。具体是,参考图4,对于重叠变量位图中的第一个“1”,即变量a对应的位,线程t1可基于之前的记录确定子集1中的变量a属于A组,子集2中的变量a属于B组,从而可确定关联交易组对(A,B)。在一种实施方式中,在确定A组与B组关联之后,线程t1可继续对重叠变量位图中的第二个“1”进行确定,即,与变量b对应的位,通过该位可同样地确定A组与B组关联。在另一种实施方式中,线程t1可获取A组的变量位图和B组的变量位图,通过将A组的变量位图与B组的变量位图进行位图与操作,从而获取A组与B组的全部重叠变量,并在重叠变量位图中消除对这些重叠变量的指示。例如,通过将A组的变量位图与B组的变量位图进行位图与操作,从而获取A组与B组的另一个重叠变量b,从而可在图4中的重叠变量位图中将与变量b对应的位的值修改为0。
类似地,线程t1通过对重叠变量位图中的“1”进行依次确定,还可以确定关联交易组对(A,C)和(D,F),即可以获取子集1和子集2中的全部关联交易组对。
在步骤S306,基于所述多个关联交易组对,将关联的交易组合并为一个交易组。
例如如图4所示,在上述步骤中,获取了关联交易组对(A,B)、(A,C)和(D,F)。每个关联交易组对中的两个交易组是访问相同变量的交易组,因此,这两个交易组是存在相关性的,应合并到一个交易组中。对于关联交易组对(A,B)和(A,C),表示A组与B组关联,A组与C组关联,因此,A组应与B组合并,A组应与C组合并,也即表示A组应与B组和C组应合并到一起,形成新的交易组,图4中以(A,B,C)示意示出。参考图2,该新的交易组(A,B,C)构成子集5的交易组。另外,对于关联交易组对(D,F),将交易组D与交易组F合并到一起从而构成子集5中的交易组。
在进行上述合并之后,线程t1将子集1和子集2中剩余的不需要合并的交易组加入子集5中,从而完成对子集1和子集2的合并,如图2所示,在进行对子集1和子集2的合并之后,子集5中共包括三个交易组,该三个交易组彼此不存在共同访问的变量。在获取子集5之后,通过对子集1的变量位图和子集2的变量位图进行位图或操作,从而可获取子集5的变量位图,基于已经记录的子集1中各个变量对应交易组、子集2中各个变量对应的交易组、以及新合并的交易组的访问变量,可重新记录子集5中各个变量对应的交易组。并且,线程t1可在共享内存中记录子集5中的上述信息。上述线程t3在获取子集6之后可类似地在共享内存中记录子集6的变量位图及各个变量对应的交易组。从而,线程t1可从共享内存中获取子集6的信息并与图4过程类似地合并子集5和子集6中的关联交易组,从而最终获取对N个交易的分组结果。
图5示出根据本说明书实施例的一种对区块链中的交易进行分组的装置500,包括:
获取单元51,配置为,获取多个交易的第一子集和第二子集,其中,所述第一子集中包括相互之间没有共同访问变量的多个交易组,所述第二子集中包括相互之间没有共同访问变量的多个交易组;
确定单元52,配置为,从所述第一子集和所述第二子集中确定多个关联交易组对,所述关联交易组对中包括访问相同变量的两个交易组;
合并单元53,配置为,基于所述多个关联交易组对,将关联的交易组合并为一个交易组,作为所述多个交易的交易组。
在一种实施方式中,所述确定单元52包括:
第一获取子单元521,配置为,获取第一子集的第一访问变量位图;
第二获取子单元522,配置为,获取第二子集的第二访问变量位图;
与操作子单元523,配置为,对所述第一访问变量位图和所述第二访问变量位图进行位图与操作,获取重叠变量位图,所述重叠变量位图指示第一子集和第二子集共同访问的变量;
确定子单元524,配置为,基于所述重叠变量位图中指示的变量对应的第一子集中的交易组和第二子集中的交易组,确定关联交易组对。
在一种实施方式中,所述与操作子单元523配置为,通过simd指令对所述第一访问变量位图和所述第二访问变量位图进行位图与操作。
在一种实施方式中,所述装置500还包括,第一获取单元54,配置为,获取第一访问变量位图中各个变量与第一子集中的交易组的对应关系,第二获取单元55,配置为,获取第二访问变量位图中各个变量与第二子集中的交易组的对应关系。
在一种实施方式中,所述合并单元53配置为:将关联交易组对中的两个交易组合并到一个交易组中。
在一种实施方式中,所述合并单元53配置为:确定包括相同交易组的第一交易组对和第二交易组对,将第一交易组对和第二交易组对中包括的交易组合并到一个交易组中。
在一种实施方式中,所述合并单元53配置为,基于所述多个关联交易组对,将关联的交易组合并为一个交易组,作为第三子集中的交易组,所述第三子集为合并第一子集和第二子集的子集,所述装置500还包括,或操作单元56,配置为,对所述第一访问变量位图和所述第二访问变量位图进行位图或操作,以获取第三子集的第三访问变量位图。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
本说明书另一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
通过根据本说明书实施例的对区块链中的交易并行分组的方法,通过位图来描述子集中的交易访问的变量集合,通过simd指令进行位操作,快速获知交易组之间的数据冲突问题并进行分组合并。通过采用多线程并行进行交易分组,每个线程处理的问题规模仅为原始问题规模的1/N(N为线程数);通过采用simd指令,一次可以同时处理多个变量的重叠访问关系,当需要访问几万个变量时,仅需要几百条指令就可以完成重叠关系的确定,进而进行交易组的合并。在执行过程中完全无锁,可并行执行,从而可以极大降低进行交易分组的时间开销。
需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。其中,软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。