掌桥专利:专业的专利平台
掌桥专利
首页

一种在区块链中处理交易的方法和装置

文献发布时间:2023-06-19 09:30:39


一种在区块链中处理交易的方法和装置

技术领域

本说明书实施例涉及区块链技术领域,更具体地,涉及一种在区块链中处理交易的方法和装置。

背景技术

在区块链中,通常在对交易进行共识之后执行交易,由于交易共识占用较多时间,使得交易处理效率较低。为了提高交易处理效率,现有技术中在共识之前投机执行交易并保存交易的执行结果,该产生的执行结果并不立即提交,而是等待正式执行交易时在确定可用的情况下才提交。在对交易共识之后正式执行交易时,如果确定所述投机执行的执行结果有效可用,则直接使用该投机执行的执行结果即可,而不需要再次执行交易。在该实现方案中,所述对交易的投机执行并不考虑与其它交易的读写冲突,当不同交易访问的变量没有重叠时,该实现方案可能具有较好的效果,但当不同交易出现对变量的读写冲突时,所述投机执行的执行结果将无法使用,降低了交易处理效率。

发明内容

本说明书实施例提供了一种共识前的交易处理方案,可以减少投机执行失效的概率,提高了区块链中的交易处理效率。

为实现上述目的,本说明书第一方面提供一种在区块链中处理交易的方法,所述方法由区块链节点执行,包括:获取等待投机执行的第一交易,其中,所述投机执行为在交易共识结束前对交易的预先执行;在确定正在投机执行的第二交易在先访问了所述第一交易中请求访问的变量的情况中,在对第二交易的投机执行完成之后进行对所述第一交易的投机执行。

在所述第一方面的一种实施方式中,所述方法由区块链记账节点执行,所述方法还包括:根据所述第二交易和所述第一交易的投机执行顺序,对所述第二交易和所述第一交易的执行顺序提出共识提议。

在所述第一方面的一种实施方式中,所述确定正在投机执行的第二交易在先访问了所述第一交易中请求访问的变量包括,基于变量访问表确定正在投机执行的第二交易在先访问了所述第一交易中请求访问的变量。

在所述第一方面的一种实施方式中,所述确定正在投机执行的第二交易在先访问了所述第一交易中请求访问的变量包括以下任一项:确定正在投机执行的第二交易在先读取了所述第一交易中请求写入的变量;确定正在投机执行的第二交易在先写入了所述第一交易中请求读取的变量;确定正在投机执行的第二交易在先写入了所述第一交易中请求写入的变量。

在所述第一方面的一种实施方式中,在对第二交易的投机执行完成之后进行对所述第一交易的投机执行包括,获取预先记录的第二交易开始投机执行的第一时间,基于所述第一时间确定开始投机执行所述第一交易的第二时间,以所述第二时间的时间顺序在阻塞交易表中记录所述第一交易和所述第二时间以等待投机执行。

在所述第一方面的一种实施方式中,所述方法还包括,在对所述第一交易的投机执行成功的情况中,在为投机执行交易所分配的存储空间中保存所述第一交易的投机执行结果,以所述第一交易的开始或结束投机执行的时间顺序在已投机执行交易表中记录所述第一交易。

在所述第一方面的一种实施方式中,根据所述第二交易和所述第一交易的投机执行顺序,对所述第二交易和所述第一交易的执行顺序提出共识提议包括,获取已投机执行交易表中的顺序排列的多个交易作为共识提议。

在所述第一方面的一种实施方式中,所述方法还包括,获取所述阻塞交易表中的顺序排列的多个交易排列在所述已投机执行交易表中的所述多个交易之后,作为共识提议。

在所述第一方面的一种实施方式中,所述获取等待投机执行的第一交易包括,从所述阻塞交易表中获取所述第一交易。

在所述第一方面的一种实施方式中,方法,还包括,在获取所述第一交易之后,投机执行所述第一交易;所述在确定正在投机执行的第二交易在先访问了所述第一交易中请求访问的变量的情况中,在对第二交易的投机执行完成之后进行对所述第一交易的投机执行包括,在投机执行所述第一交易的过程中,在确定正在投机执行的第二交易在先访问了所述第一交易中将要访问的变量的情况中,结束对所述第一交易的投机执行,在对第二交易的投机执行完成之后再次进行对所述第一交易的投机执行。

在所述第一方面的一种实施方式中,在对第二交易的投机执行完成之后进行对所述第一交易的投机执行包括,在对所述第一交易的投机执行的过程中,在为投机执行交易所分配的存储空间中存储所述第一交易请求写入的变量的值,从所述存储空间中存储的各个变量的值中读取所述第一交易请求读取的变量的值。

本说明书第二方面提供一种在区块链中处理交易的装置,所述装置部署于区块链节点,包括:获取单元,配置为,获取等待投机执行的第一交易,其中,所述投机执行为在交易共识结束前对交易的预先执行;投机执行单元,配置为,在确定正在投机执行的第二交易在先访问了所述第一交易中请求访问的变量的情况中,在对第二交易的投机执行完成之后进行对所述第一交易的投机执行。

在所述第二方面的一种实施方式中,所述装置部署于区块链记账节点,所述装置还包括:共识提议单元,配置为,根据所述第二交易和所述第一交易的投机执行顺序,对所述第二交易和所述第一交易的执行顺序提出共识提议。

在所述第二方面的一种实施方式中,所述投机执行单元还配置为,基于变量访问表确定正在投机执行的第二交易在先访问了所述第一交易中请求访问的变量。

在所述第二方面的一种实施方式中,所述投机执行单元还配置为执行以下任一项:确定正在投机执行的第二交易在先读取了所述第一交易中请求写入的变量;确定正在投机执行的第二交易在先写入了所述第一交易中请求读取的变量;确定正在投机执行的第二交易在先写入了所述第一交易中请求写入的变量。

在所述第二方面的一种实施方式中,所述投机执行单元包括,获取子单元,配置为,获取预先记录的第二交易开始投机执行的第一时间,确定子单元,配置为,基于所述第一时间确定开始投机执行所述第一交易的第二时间,记录子单元,配置为,以所述第二时间的时间顺序在阻塞交易表中记录所述第一交易和所述第二时间以等待投机执行。

在所述第二方面的一种实施方式中,所述装置还包括,记录单元,配置为,在对所述第一交易的投机执行成功的情况中,在为投机执行交易所分配的存储空间中保存所述第一交易的投机执行结果,以所述第一交易的开始或结束投机执行的时间顺序在已投机执行交易表中记录所述第一交易。

在所述第二方面的一种实施方式中,所述共识提议单元还配置为,获取已投机执行交易表中的顺序排列的多个交易作为共识提议。

在所述第二方面的一种实施方式中,所述共识提议单元还配置为,获取所述阻塞交易表中的顺序排列的多个交易排列在所述已投机执行交易表中的所述多个交易之后,作为共识提议。

在所述第二方面的一种实施方式中,所述获取单元还配置为,从所述阻塞交易表中获取所述第一交易。

在所述第二方面的一种实施方式中,所述投机执行单元还配置为,在获取所述第一交易之后,投机执行所述第一交易;在投机执行所述第一交易的过程中,在确定正在投机执行的第二交易在先访问了所述第一交易中将要访问的变量的情况中,结束对所述第一交易的投机执行,在对第二交易的投机执行完成之后再次进行对所述第一交易的投机执行。

在所述第二方面的一种实施方式中,所述投机执行单元还配置为,在对所述第一交易的投机执行的过程中,在为投机执行交易所分配的存储空间中存储所述第一交易请求写入的变量的值,从所述存储空间中存储的各个变量的值中读取所述第一交易请求读取的变量的值。

本说明书第三方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行本说明书第一方面提供的方法。

本说明书第四方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现本说明书第一方面提供的方法。

由于区块链中各个节点在共识前都基于投机执行交易时访问变量的先后顺序来确定交易投机执行的顺序,从而可较大程度地避免各个节点的交易投机执行顺序的不确定性,并且根据投机执行的顺序确定共识交易的顺序,从而使得各个节点的在共识后执行交易时可以大概率地复用已经投机执行的交易的投机执行结果,提高了区块链中的交易处理效率。

附图说明

通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:

图1示出根据一个实施例的交易传播、入块和执行的示意图;

图2示出记账节点对交易进行处理的过程;

图3示出根据本说明书实施例的一种在区块链中处理交易的方法;

图4示出区块链节点中的线程投机执行交易的方法流程图;

图5示出线程在投机执行交易的过程中在写变量时对变量访问表进行操作的流程图;

图6示出根据本说明书实施例的一种在区块链中处理交易的装置。

具体实施方式

下面将结合附图描述本说明书实施例。

图1示出根据一个实施例的交易传播、入块和执行的示意图。首先,区块链网络中包含若干节点,各个节点之间可以进行通信。区块链网络的节点中,至少部分节点是有记账能力的节点。记账节点可以将收集到的交易打包成预定的区块形式,形成区块链中新的区块。

假定网络中某个记账节点Bob获取到一笔交易Tx。该交易Tx可以是连接到该节点的区块链的用户终端发出的交易,或者,该笔交易Tx也可以是另一节点Alice转发过来的交易。并且,该交易Tx可以是普通转账交易,创建智能合约的交易,或者调用智能合约的交易。

记账节点Bob会在本地维护一个交易池,将接收到的交易Tx放入交易池中。当交易池中的交易足够多时,节点Bob就从交易池中提取一部分交易,将其打包成块。一般地,在将交易放入交易池时,或者从交易池中提取交易进行打包时,节点会对交易进行校验,以验证其合法性。在Bob打包一部分交易后,它会在区块链网络中广播自己打包的交易(即区块),以期达成共识。在对区块达成共识之后,每个节点都会以共识的顺序执行达成共识的区块中的交易,以保持整个网络中各个节点处记录的数据内容的一致性。

图2示出记账节点对交易进行处理的过程。如图2所示,简单来说,记账节点首先对本地交易池中的交易进行校验,以一定顺序打包成块,然后发起共识,等待共识结果,在获取到共识结果后,执行共识区块中的顺序排列的交易。可以看到,这个过程中,各个步骤是依次串行执行的,因此,对交易的处理效率较低。

在一种相关技术中,区块链节点在对区块的共识结束(或者达成共识)之前对交易池中的交易进行投机执行。所述对交易的投机执行可以理解为,在尚未确定是否应执行此交易、以及此交易与其它交易的执行顺序的情况下,对此交易进行预先执行或前瞻执行,产生执行结果,但是并不立即提交这些执行结果,而是将该执行结果缓存到内存中,以在共识之后执行交易时在确定有效的情况下用作为执行交易的执行结果。投机执行的过程与共识的过程可以并行进行。在获取到共识结果从而对交易进行正式执行时,判断投机执行的执行结果是否有效可用,如果可用,则直接提交这样的执行结果即可,而不必重新执行交易。然而,该投机执行的方案在投机执行交易的阶段并不考虑与其它交易的读写冲突。在并行投机执行不同交易时因为访问相同的变量而出现读写冲突的情况中,由于实际运行环境的微小差异,在一个节点对所述不同交易的投机执行顺序使得对变量的读写顺序可能是先读后写,在另一个节点对所述不同交易的投机执行顺序使得对所述变量的读写顺序可能是先写后读。在正式执行这两个交易时,与共识的交易顺序不同的节点的投机执行的执行结果有可能将不可用,从而降低了交易处理效率。

为了进一步提高区块链中的交易处理效率,根据本说明书中的至少一个实施例,在投机执行交易阶段,对交易进行读写冲突检测,将与正在执行的交易存在读写冲突的交易滞后处理,以防止投机执行的交易出现读写冲突,并根据投机执行交易的顺序来进行共识提议,以进一步提高投机执行的执行结果可用的概率,从而提高交易处理效率。

下面将详细描述本说明书实施例提供的交易处理方法中的具体实施步骤。

图3示出根据本说明书实施例的一种在区块链中处理交易的方法,所述方法由区块链节点执行,该节点可以体现为任何具有计算、处理能力的设备、平台或设备集群。所述交易处理方法包括以下步骤:步骤S302,获取等待投机执行的交易Tx2;步骤S304,确定是否有其它正在投机执行的交易在先访问了交易Tx2中请求访问的变量;在确定结果为是的情况中,执行步骤S306,在投机执行所确定的交易之后投机执行交易Tx2;在确定结果为否的情况中,执行步骤S308,投机执行交易Tx2。下面分别描述以上各个步骤的具体执行过程。

首先,在步骤S302,获取等待投机执行的交易Tx2。

区块链中的节点每当产生或接收到一条交易,将该交易放入交易池中以等待共识并执行。为了在交易共识之前预先对交易进行投机执行,区块链节点可从交易池中获取未经投机执行的交易进行投机执行。在一种实施方式中,在区块链节点中可如表1所示的待投机执行交易表来记录交易池中的未投机执行的交易,所述待投机执行交易表以及下文描述的变量访问表、阻塞交易表和已投机执行交易表例如存储在为投机执行交易所分配的存储空间(例如内存空间)中。

表1

随着节点不断获取到交易,这些交易的信息被基于获取的时间在待投机执行交易表中顺序(例如从左向右的顺序)添加。该待投机执行交易表的每列对应于一条交易。在一种实施方式中,该待投机执行交易表的第一行用于记录各个交易的交易内容。在另一种实施方式中,该待投机执行交易表的第一行用于记录相应交易的交易内容的内存地址,以用于链接到相应交易的交易内容。所述待投机执行交易表的第二行在相应的交易开始投机执行并且未执行完成时用于记录相应交易的开始投机执行的时间。如表1所示,其中记录了交易Tx1为正在投机执行的交易,其开始投机执行的时间为t1,例如当前由线程1在执行交易Tx1。线程2在从表1中获取最左侧的未开始投机执行的交易(交易Tx2)之后,在表1中记录交易Tx2的开始投机执行的时间为t2,表1中的交易Tx3为尚未开始投机执行的交易。区块链节点中例如通过多个执行体(例如线程)来并行投机执行交易池中的交易,通过在待投机执行交易表中记录交易的开始投机执行的时间,各个进行投机执行的线程可基于该时间确定交易之间是否存在读写冲突,并设置冲突交易的滞后投机执行的时间,这将在下文详细描述。

可以理解,所述待投机执行交易表不限于具有表1所示的形式,例如,所述待投机执行交易表中可以不记录各个交易的开始投机执行时间,而在线程开始投机执行交易之后,在存储交易的交易内容的地址中记录该交易的开始投机执行时间,从而,其它线程可从所述地址确定该交易是否开始投机执行、以及该交易的开始投机执行时间。

另外,所述线程不限于从待投机执行交易表中获取等待投机执行的交易,在另一种实施方式中,线程还可以从阻塞交易表中获取等待投机执行的交易,这方面内容将在下文中详细描述。

在步骤S304,确定是否有其它正在投机执行的交易在先访问了交易Tx2中请求访问的变量。

为了便于进行读写冲突检测,可通过表2所示的变量访问表来记录已经开始投机执行的交易对各个变量的读写情况。

表2

如表2所示,该变量访问表从第2列开始的每列与一个变量相对应,例如,第2列与变量a相对应,第3列与变量b相对应。该变量访问表例如为散列表,即该表的每列的存储地址对应于相应变量的散列值,例如表2中的第2列的存储地址对应于变量a的散列值,当交易中存在对变量a的访问时,通过计算变量a的散列值从而可找到变量a的读写记录。变量访问表的第2行中的“L”为锁标识,表示有线程正在对该列进行操作。另外,变量访问表中的“Pos1”用于记录访问该变量的交易在待投机执行交易表(或者下文中将描述的阻塞交易表)中的记录位置,该Pos1例如用于指示表1中的第1列,“t1”用于记录访问该变量的交易的开始投机执行时间。

线程2在获取交易Tx2之后开始执行交易Tx2,假设交易Tx2中包括对变量a的(读或写)访问,线程2首先通过计算变量a的散列值可找到表2中的变量a的读写记录表项,并在确定该读写记录表项未锁定的情况中对该读写记录表项进行锁定,即在表2中的变量a对应的第2行中标记“L”。然后,线程2对变量a的读写记录表项进行读取。

在一种情况中,交易Tx2中包括对变量a的写请求,并且变量访问表中记录的变量a的读写记录如表2中所示。线程2基于表2中的变量a的读记录表项中的Pos1,读取表1中的第1列,比较第1列中记录的t1与表2中的第2列中记录的t1相一致,即可确定表2中的(Pos1,t1)与Tx1相对应,即当前Tx1正在投机执行,从而可确定正在投机执行的交易Tx1在先读取了变量a,交易Tx2与当前正在投机执行的Tx1存在读写冲突。

在另一种情况中,交易Tx2中包括对变量a的写请求,并且变量访问表中记录了例如交易Tx1对变量a的写入。在通过与上文类似地过程基于该写记录确定交易Tx1当前正在投机执行的情况中,也可以确定正在投机执行的交易Tx1在先写入了变量a,交易Tx2与正在投机执行的交易Tx1存在写写冲突。

在另一种情况中,交易Tx2中包括对变量a的读请求,并且变量访问表中记录了例如交易Tx1对变量a的写入。在通过与上文类似地过程基于该写记录确定交易Tx1当前正在投机执行情况中,也可以确定正在投机执行的交易Tx1在先写入了变量a,交易Tx2与正在投机执行的交易Tx1存在读写冲突。

在另一种情况中,如果表2中第2列中的读记录表项为(Pos1,t0),线程2比较t0与表1中第1列中的t1不一致,则说明(Pos1,t0)对应的交易已经投机执行完成或者被滞后投机执行(将在下文中描述),因此,线程2可将表2中记录的(Pos1,t0)删除。之后,如果交易Tx2没有请求对其它变量的访问,线程2可确定当前没有正在投机执行的交易与Tx2存在访问冲突。

在另一种情况中,交易Tx2中包括对变量a的读请求,并且变量访问表中记录了交易Tx1对变量a的读取,线程2可确定当前没有正在投机执行的交易与Tx2存在访问冲突,线程2可执行步骤S308,在变量访问表中记录交易Tx2对变量a的读取信息并继续投机执行交易Tx2。

可以理解,表2所示的读写冲突表仅仅是示意性地,而不用于限定本说明书实施例中的读写冲突表的形式。例如,在读写冲突表中不一定通过锁定的形式来进行互斥性地操作,例如可通过对原子操作的形式来对读写冲突表中的变量进行操作。另外,读写冲突表中不一定记录表1中的位置,而可以直接记录交易编号,以指示当前对变量进行访问的交易,当交易投机执行完成之后可将该读写冲突表中对该交易的记录进行删除。

另外,所述变量访问表不限于包括读记录表项和写记录表项,例如,所述变量访问表中只包括变量访问记录,线程在投机执行交易的过程中,只要读取或写入了例如变量a,就在该变量访问表中记录对变量a的在先访问,该实施方式相比于上述实施方式,对于正在投机执行的交易Tx1在先读取变量a,并且交易Tx2中请求读取变量a的情况也进行对交易Tx2的阻塞投机执行,但是由于对于前述读写冲突和写写冲突都可以对交易Tx2进行阻塞投机执行,因此,整体上仍然能提高节点的交易处理效率。

另外,在上述描述中虽然描述了在开始投机执行交易Tx2之后执行步骤S304,本说明书实施例不限于此,例如,线程在获取交易Tx2之后,可预先读取交易Tx2中请求读写的变量,并执行步骤S304。

在上述步骤S304的确定结果为否的情况中,线程2确定交易Tx2与当前正在投机执行的交易都没有访问冲突,线程2可执行步骤S308,投机执行交易Tx2。具体是,线程2在变量访问表中的变量a的访问记录中记录(Pos2,t2),在表2中释放对变量a的锁定,并继续投机执行交易Tx2,其中,Pos2为待投机执行交易表或阻塞交易表中记录交易Tx2的位置,t2为交易Tx2的开始投机执行的时间。如果交易Tx2中不包括对其它变量的访问,则线程2可完成对交易Tx2的投机执行,在内存中存储交易Tx2的投机执行的执行结果,在区块链节点中设置的已投机执行交易表中按照交易投机执行完成的先后顺序记录交易Tx2,并在待投机执行交易表(或阻塞交易表)中删除交易Tx2的列,例如将表1中的Tx3的相关内容移动到第2列中。如果交易Tx2除了变量a之外还包括对变量b的访问,则与上文类似地基于变量b的读写记录确定交易Tx2是否与正在投机执行的其它交易存在访问冲突。

在所述步骤S304的确定结果为是的情况中,线程2执行步骤S306,在投机执行所确定的交易(例如交易Tx1)之后投机执行交易Tx2。

线程2在确定交易Tx2与当前正在投机执行的交易Tx1存在访问冲突的情况中,可释放对读写冲突表中的变量a的锁定,并使得交易Tx2滞后投机执行,以确保在交易Tx1投机执行完成之后再投机执行交易Tx2。通过确保在投机执行交易Tx1之后投机执行交易Tx2,使得各个节点投机执行交易Tx1和Tx2的顺序是一致的,从而防止某些节点在共识之后的正式执行交易时该交易的投机执行结果失效。

可通过多种方式确保在交易Tx1之后投机执行交易Tx2。在一种实施方式中,在区块链节点中可设置如表3所示的阻塞交易表。

表3

为了滞后执行交易Tx2,线程2从表1中删除对交易Tx2的记录,将表1中的Tx3的相关内容移动到第3列中,并在如表3所示阻塞交易表中记录交易Tx2的信息。如表3中所示,假设阻塞交易表当前未记录阻塞交易,线程2可在左起第2列的阻塞交易信息中记录存储交易Tx2的交易内容的内存地址,以链接到交易Tx2,并在第2列第2行的解阻时间中记录交易Tx2解阻的时间t3,即交易Tx2可再次投机执行的最早时间。时间t3通过对交易Tx1的开始投机执行时间t1增加预定时间长度(例如200微秒)而确定,所述预定时间长度用于确保在时间t3之后(包括时间t3),交易Tx1已经投机执行完成。所述预定时间长度基于预计的交易执行时间和进程调度扰动来确定。例如,对于交易执行耗时较小、执行阶段基本不会被打扰、存储访问等性能波动很小的系统,可将该预定时间长度设定为较短,否则将该预定时间长度设定为较长。

如表3所示,所述阻塞交易表中还包括阻塞交易的开始投机执行时间,线程可从该表中获取等待投机执行的交易进行投机执行,线程在从阻塞交易表中获取到交易并开始投机执行之后,可在该阻塞交易表中记录相应交易的开始投机执行时间,以便于在与其它交易存在读写冲突时,用于计算其它交易的解阻时间。与上述待投机执行交易表类似地,所述开始投机投机执行时间也可以不记录在阻塞交易表中,而是记录在相应交易的交易内容的记录地址中。

当后续还有其它交易的投机执行被阻塞时,可在表3中从左到右的顺序记录后续的被阻塞的交易。在该情况中,当线程在执行上述步骤S302获取等待投机执行的交易时,该线程可首先获取阻塞交易表中最左侧的被阻塞的交易进行投机执行,其它线程可以从左到右的顺序获取阻塞交易表中的各个阻塞的交易。在阻塞交易表中的交易被取空或者获取的阻塞交易的解阻时间晚于当前时间的情况中,线程可从待投机执行交易表中获取未开始投机执行的交易进行投机执行。通过这样获取交易进行投机执行,可将阻塞交易表实现为先入先出队列(First Input First Output,FIFO)。可以理解,上述获取交易的顺序不是必需的,只要保证阻塞交易表中的交易在该表中记录的解阻时间之后执行即可。线程2在阻塞交易表中记录交易Tx2之后,这里,由于交易Tx2是阻塞交易表中解阻时间最早的交易,线程2可在待投机执行交易表中获取其它交易进行投机执行。

例如线程1在投机执行完成交易Tx1之后可如上文所述从阻塞交易表中获取交易Tx2,线程1首先确定当前时间t4是否大于等于阻塞交易表中记录的交易Tx2对应的解阻时间t3,在t4≥t3的情况中,线程1可开始投机执行交易Tx2,并再次对交易Tx2执行上述步骤S304,在确定没有其它正在投机执行的交易与交易Tx2存在访问冲突的情况中,线程1可执行步骤S308,完成对交易Tx2的投机执行,并存储交易Tx2的投机执行的执行结果,在表3中删除交易Tx2的列,并在已投机执行交易表中按照交易Tx2的投机执行完成的先后顺序记录交易Tx2。在另一种实施方式中,线程在投机执行完成交易Tx2之后,可基于交易Tx2的开始投机执行的时间顺序在已投机执行交易表中进行记录。表4示出已投机执行交易表中记录的内容。

表4

如表4所示,由于在该情况中,在投机执行交易Tx1之后投机执行交易Tx2,因此,在完成交易Tx2的投机执行完成之后,交易Tx1也已经投机完成,因此,在已投机执行交易表中已经记录了交易Tx1,从而,按照交易投机完成的先后顺序,在已投机执行交易表中,在记录交易Tx1标识的位置的右侧记录交易Tx2的标识。

上文中主要描述了区块链节点对交易进行投机执行的方法过程。下文中以线程的角度描述对本说明书实施例提供的区块链中的交易处理方法的执行过程。

图4示出区块链节点中的线程投机执行交易的方法流程图。假设区块链节点中包括用于并行投机执行交易的多个线程,该每个线程都执行图4所示的流程。首先,在步骤S401,线程获取阻塞交易表中未开始投机执行交易的最早解阻时间etime。如上文所述,线程在获取交易投机执行时,首先确定阻塞交易表中有没有解阻时间已经过了的交易,以首先投机执行被阻塞的交易。例如,参考表3,假设表3中的左起第3列和第4列都记录了被阻塞的交易,由于该阻塞交易表以从左向右的顺序记录解阻时间从先到后的交易,因此,如果表3中指示Tx2尚未被投机执行,则t3即为最早解阻时间etime。

在步骤S402,获取当前时间ctime。在步骤S403,确定ctime是否大于等于etime,即,确定当前是否已经过了解阻时间etime,如果ctime大于等于解阻时间etime(例如表3中的t3),则说明交易Tx2当前可以再次投机执行,因此,线程执行步骤S404,获取阻塞交易表中的etime对应的交易(即交易Tx2)。

如果ctime小于解阻时间etime,则说明阻塞交易表中的全部交易都未解阻,从而,线程执行步骤S405,获取待投机执行交易表中的未开始投机执行的交易以进行投机执行。参考表1,在如上文所述将交易Tx2从待投机执行交易表中删除之后,表1中未开始投机执行的最早接收的交易为Tx3,因此,线程可获取交易Tx3进行投机执行。

在从阻塞交易表中获取交易Tx2的情况中,线程执行步骤S406,在表3中的第2列中的第3行中记录ctime作为交易Tx2的开始投机执行时间。在从待投机执行交易表中获取交易Tx3的情况中,线程执行步骤S406,在表1中记录交易Tx3的开始投机执行时间。

之后,线程执行步骤S407,投机执行交易,对变量访问表进行操作。

例如,线程在再次开始投机执行交易Tx2之后,由于交易Tx2中包括对变量的读和/或写请求,线程通过对变量访问表进行操作而确定是否继续投机执行交易Tx2,下文中将通过图5详细描述线程对变量访问表进行操作的流程图。

基于对变量访问表的操作,如果确认交易Tx2与当前正在投机执行的其它交易都没有访问冲突,则可继续执行交易Tx2,使得对交易Tx2的投机执行成功,从而线程可执行步骤S409,将交易Tx2记录到已投机执行交易表中,即,将交易Tx2从阻塞交易表中删除,并如表4所示将交易Tx2以投机执行成功的时间顺序记录到已投机执行交易表中。同时,线程在内存中保存对交易Tx2的投机执行的结果,该投机执行的结果中包括读取的变量的值可写入的变量的值。其中,在投机执行的过程中,当读取例如变量a的值时,首先确定为投机执行交易所分配的内存空间(或者其它存储空间)中是否维护有变量a的值,如果内存中维护了变量a的值,则从内存中读取变量a的值,如果内存中未找到变量a的值,则可从世界状态数据库中读取变量a的值,并在内存中存储该变量a的值。当在投机执行的过程中对变量a进行写入时,修改内存中维护的变量a的值,而不将该值更新到世界状态数据库中。

基于对变量访问表的操作,如果线程确认交易Tx2与当前正在投机执行的其它交易存在访问冲突,则可执行步骤S410,将交易Tx2记录到阻塞交易表中。具体是,首先将阻塞交易表中当前记录的交易Tx2删除,并按照交易Tx2的重新确定的解阻时间的顺序在阻塞交易表中再次记录交易Tx2的信息,以使得交易Tx2再次滞后投机执行。

线程在执行上述步骤S410或者步骤S409之后,可回到步骤S401,开始一个新的循环。

图5示出线程在投机执行交易的过程中在写变量时对变量访问表进行操作的流程图。

上文中已经描述了在投机执行过程中可能出现的不同交易之间的多种访问冲突,图5中示意示出交易之间的一种读写冲突,即线程当前投机执行的交易(例如交易Tx2)包括对变量(例如变量a)的写请求,所述线程基于变量访问表确定是否有正在投机执行的其它交易预先对变量a进行了读操作,从而确定是否存在读写冲突。可以理解,对于不同交易之间的其它类型的访问冲突,可使用与图5所示流程类似的流程进行操作,例如,所述线程还可以基于变量访问表确定是否有正在投机执行的其它交易预先对变量a进行了写操作,从而确定是否存在写写冲突。

参考图5,线程在执行到交易Tx2中的读取变量a的指令(或请求)之后,线程执行步骤S501,获得变量访问表中的变量a的变量锁。参考上文的表2,线程例如可通过对变量a对应的第2列的第2行进行互斥性操作而获取变量锁,从而在确定该位置为空的情况中在该位置记录“L”,以用于指示变量访问表中的变量a的信息已经被锁定。所述互斥性操作例如为原子操作等操作,在此不作限定。

在步骤S502,线程确定变量a的读记录表项是否为空,即确定是否有交易的投机执行的过程中进行了对变量a的读取。如果该读记录表项为空,说明尚未有交易的投机执行读取了变量a,因此,线程可执行步骤S507,在写记录表项中记录当前交易的信息,即记录交易Tx2的记录位置(即记录交易Tx2的待投机执行交易表或阻塞交易表中的位置)和开始投机执行时间。其中,该记录可以为插入式的记录,也可以为覆盖式的记录。所述插入式的记录为在之前记录的交易信息的后面记录当前交易的信息,而不覆盖之前交易的信息,所述插入式的记录中的各个交易信息例如可以为链表的形式。所述覆盖式的记录为用当前交易信息覆盖之前记录的交易信息,即在写记录表项中只记录最新的交易信息。之后可执行步骤S508,返回变量a的变量锁,并执行步骤S509,返回继续投机执行的标识。从而线程可对变量a进行写入,并继续投机执行交易Tx2。

当线程在步骤S502确定变量a的读记录表项不为空时,线程执行步骤S503获得变量a的读记录表项中的Pos和对应的时间bt。参考上述在写记录表项中记录交易信息的方式,在该读记录表项中可以插入式地记录过去读取该变量的多个交易的交易信息,也可以覆盖式地只记录过去读取该变量的最新交易的交易信息。在变量a的读记录表项中只记录最新的交易信息的情况中,参考表2,即读取(Pos1,t1),这里bt=t1,Pos1为记录该最新的交易的位置,根据该交易是从待投机执行交易表中获取还是从阻塞交易表中获取,该Pos可以为待投机执行交易表中的位置或者阻塞交易表中的位置,例如,这里Pos1为如表1所示的待投机执行交易表中的第1列。之后,线程执行步骤S504,获得Pos对应交易的开始投机执行时间ct。具体是,线程可读取待投机执行交易表中的第1列中记录的开始投机执行时间ct(其值为t1)。然后,线程执行步骤S505,比较bt是否等于ct。在变量a的读记录表项中记录过去访问变量a的多个交易的交易信息的情况中,线程可相对于每个交易的交易信息执行步骤S503~S505,在此不再详述。

如果在步骤S505确定bt不等于ct,则说明在读记录表项中记录的交易已经执行完成或者被阻塞执行,该读记录表项中记录的交易信息已经是过时的信息,该交易对变量a的读取操作现在已经终止,因此不会与当前执行的交易存在读写冲突,从而线程执行步骤S506,从读记录表项中删除当前信息,之后执行步骤S507~S509,该对步骤S507~S509的执行过程可参考上文的描述,在此不再详述。如果在步骤S505确定bt=ct,则说明读记录表项中记录的交易当前正在投机执行中,并且该交易与线程当前执行的交易存在读写冲突。从而,为了保证各个节点的读写一致性,线程将结束对当前交易的投机执行,并使得该当前交易滞后执行,具体是,线程执行步骤S508,释放锁,即将变量访问表中的变量的变量锁删除,然后执行步骤S509,返回结束投机执行标识,线程在执行该步骤之后将继续执行图4中的步骤S410,将交易记录到阻塞交易表中,在执行该步骤中,线程基于与当前交易存在读写冲突的交易的开始投机执行时间(即ct)确定该当前交易的解阻时间。

上文描述了区块链节点中在交易共识之前投机执行交易的过程,区块链中的记账节点同样通过上述方法对交易池中的交易进行投机执行,同时,该记账节点在预定时间会根据交易池中的交易发起共识提议以将经共识的交易入块。记账节点为了保证投机执行的执行结果大部分可用,可根据已经投机执行的交易的顺序来发起共识提议。

在一种实施方式中,如上文所述,在节点中通过如表4所示的已投机执行交易表来按照投机执行的先后顺序来记录各个已经投机执行的交易,从而,记账节点可首先从已投机执行交易表中获取顺序排列的多个交易作为共识提议中的以同样顺序排列的多个交易。

在获取上述多个交易作为共识提议之后,如果上述已经共识提议的多个交易的数量不足以构成区块,则记账节点还可以从上述如表3所示的阻塞交易表中获取顺序排列的多个交易排列在已经共识提议的多个交易之后一起作为共识提议。如果共识提议的交易数量仍然不足,记账节点还可以从如表1所示的待投机执行交易表中获取顺序排列的多个交易排列在已经共识提议的多个交易的后面一起作为共识提议。

通过这样设置共识提议中的交易及其排列顺序,后续记账节点在执行共识的多个交易的过程中,由于共识提议中的排列在前面的多个交易与已投机执行的顺序排列的多个交易一致,因此,可直接使用这些交易的投机执行的结果作为正式执行的结果。由于共识提议中的排列在中间的多个交易从阻塞交易表中顺序获取,该多个交易的排列在前面的若干交易可能已经执行了一部分,并存储了部分执行结果,则可以使用该部分执行结果完成对交易的执行。其它非记账节点在执行该共识的交易的过程中,对于共识提议中的已经投机执行、且在共识提议中的排列顺序与投机执行的顺序一致的交易,可以直接使用本地对该交易的投机执行的执行结果,对于共识提议中的已经投机执行、但是在共识提议中的排列顺序与投机执行的顺序不一致的交易,在待执行的交易在共识之后执行时的世界状态与对该交易的投机执行时的世界状态一致的情况中,可将对该交易的投机执行的执行结果用作为该交易在共识之后的执行结果,否则丢弃投机执行的执行结果,重新执行该交易。

由于区块链中各个节点在共识前都基于投机执行交易时访问变量的先后顺序来确定交易投机执行的顺序,从而可较大程度地避免各个节点的交易投机执行顺序的不确定性,并且根据投机执行的顺序确定共识交易的顺序,从而使得各个节点的在共识后执行交易时可以大概率地复用已经投机执行的交易的投机执行结果,提高了交易处理效率。

图6示出根据本说明书实施例的一种在区块链中处理交易的装置600,所述装置600部署于区块链节点,用于执行本说明书图3~图5所示的方法,所述装置600包括:

获取单元61,配置为,获取等待投机执行的第一交易,其中,所述投机执行为在交易共识结束前对交易的预先执行;

投机执行单元62,配置为,在确定正在投机执行的第二交易在先访问了所述第一交易中请求访问的变量的情况中,在对第二交易的投机执行完成之后进行对所述第一交易的投机执行。

在一种实施方式中,所述装置600部署于区块链记账节点,所述装置600还包括:共识提议单元63,配置为,根据所述第二交易和所述第一交易的投机执行顺序,对所述第二交易和所述第一交易的执行顺序提出共识提议。

在一种实施方式中,所述投机执行单元62还配置为,基于变量访问表确定正在投机执行的第二交易在先访问了所述第一交易中请求访问的变量。

在一种实施方式中,所述投机执行单元62还配置为执行以下任一项:确定正在投机执行的第二交易在先读取了所述第一交易中请求写入的变量;确定正在投机执行的第二交易在先写入了所述第一交易中请求读取的变量;确定正在投机执行的第二交易在先写入了所述第一交易中请求写入的变量。

在一种实施方式中,所述投机执行单元62包括:

获取子单元621,配置为,获取预先记录的第二交易开始投机执行的第一时间,

确定子单元622,配置为,基于所述第一时间确定开始投机执行所述第一交易的第二时间,

记录子单元623,配置为,以所述第二时间的时间顺序在阻塞交易表中记录所述第一交易和所述第二时间以等待投机执行。

在一种实施方式中,所述装置600还包括,记录单元64,配置为,在对所述第一交易的投机执行成功的情况中,在为投机执行交易所分配的存储空间中保存所述第一交易的投机执行结果,以所述第一交易的开始或结束投机执行的时间顺序在已投机执行交易表中记录所述第一交易。

在一种实施方式中,所述共识提议单元63还配置为,获取已投机执行交易表中的顺序排列的多个交易作为共识提议。

在一种实施方式中,所述共识提议单元63还配置为,获取所述阻塞交易表中的顺序排列的多个交易排列在所述已投机执行交易表中的所述多个交易之后,作为共识提议。

在一种实施方式中,所述获取单元61还配置为,从所述阻塞交易表中获取所述第一交易。

在一种实施方式中,所述投机执行单元62还配置为,在获取所述第一交易之后,投机执行所述第一交易;在投机执行所述第一交易的过程中,在确定正在投机执行的第二交易在先访问了所述第一交易中将要访问的变量的情况中,结束对所述第一交易的投机执行,在对第二交易的投机执行完成之后再次进行对所述第一交易的投机执行。

在一种实施方式中,所述投机执行单元62还配置为,在对所述第一交易的投机执行的过程中,在为投机执行交易所分配的存储空间中存储所述第一交易请求写入的变量的值,从所述存储空间中存储的各个变量的值中读取所述第一交易请求读取的变量的值。

本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行如本说明书图3~图5所示的方法。

本说明书实施例还提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现本如说明书图3~图5所示的方法。

需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。其中,软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。

以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

相关技术
  • 用于处理交易处理网络中的区块链交易的方法和系统
  • 一种在区块链中处理交易的方法和装置
技术分类

06120112195675