技术领域
[0001] 本
说明书实施例涉及区块链技术领域,更具体地,涉及一种在区块链中并发执行多个交易的方法和装置。
背景技术
[0002] 区块链技术是构建在点对点(P2P)网络上,利用链式数据结构来验证与存储数据,利用分布式
节点共识
算法来生成和更新数据,利用
密码学的方式保证数据传输和
访问的安全,利用由自动化脚本代码组成的
智能合约来编程和操作数据的一种全新的分布式
基础架构与计算范式。区块链技术也被称之为
分布式账本技术,是一种去中心化的分布式
数据库技术,其特点是去中心化、公开透明、不可篡改、可信任。区块链的每笔数据,都会广播到全网的区块链节点,每个全节点都有全量的、一致的数据。区块链中的节点通过发送交易而进行转账、存入数据等业务,区块链中的记账节点在交易池中收集区块链中的交易,执行所述交易,并在执行所述交易之后,将这些交易打包到区块中并扩散到区块链中。区块链中的验证节点会对从记账节点发出的区块进行验证,在验证通过之后,每个节点在接收到该区块时,都会执行该区块中包括的每个交易。为了保证各个节点的数据一致性,各个节点中在执行区块中的多个交易时,对该多个交易的提交顺序需要是一致的,这样才能得到一致的执行结果。因此,在
现有技术中,记账节点在执行交易之前会按照预定规则对将要执行的多个交易进行编号,并按照编号的顺序依次执行多个交易,也即依次提交多个交易,并且其它节点在接收到该区块之后,也是按照上述交易编号顺序依次执行并提交所述多个交易。然而,所述多个交易并不一定都是相互依赖的,在两个交易之间不存在依赖性的情况中,并发执行这两个交易并不影响最终的结果。而如果并发执行的两个交易存在依赖性,则该并发执行将影响到最终的结果。
[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] 在一个实施例中,所述多个交易中还包括第二交易,其中,所述第二交易的提交顺序在所述多个交易中位于第一位,所述第二交易中包括对所述第一变量的写操作,当在相应地修改所述读字段之后提交所述第二交易的情况中,所述装置还包括,
[0039] 第二确定单元,配置为,基于所述读字段,确定是否已执行第一交易中的对所述第一变量的读操作;
[0040] 通知单元,配置为,在确定已执行第一交易中的对所述第一变量的读操作的情况中,通知本地重新执行第一交易中的对所述第一变量的读操作。
[0041] 在一个实施例中,所述多个交易中还包括第三交易,其中,所述第三交易的提交顺序在所述第一交易和第二交易之间,所述装置还包括:
[0042] 第三确定单元,配置为,在从本地接收重新执行第一交易中的对所述第一变量的读操作的通知之后,基于所述写字段确定是否已执行了第三交易中对第一变量的写操作;
[0043] 等待单元,配置为,在确定已执行了第三交易中的写操作的情况中,进行等待,以在提交了第三交易中对第一变量的写操作之后,重新执行第一交易中对第一变量的读操作。
[0044] 在一个实施例中,所述写字段中包括的预定数目的位与预定数目的交易分别对应,所述装置还包括,第一复原单元,配置为,在提交所述第二交易之后,将所述写字段中与所述第二交易对应的位的第一值复原,其中所述第一值用于记录:已执行所述第二交易中的对所述第一变量的写操作。
[0045] 在一个实施例中,所述读字段中包括的预定数目的位与预定数目的交易分别对应,所述第二交易中还包括对第一字段的读操作,所述装置还包括,第二复原单元,配置为,在提交所述第二交易之后,将所述读字段中与所述第二交易对应的位的第一值复原,其中该第一值用于记录:已执行所述第二交易中的对所述第一变量的读操作。
[0046] 在一个实施例中,所述第一节点中预设有交易执行窗口,所述多个交易为所述交易执行窗口当前包括的多个交易,其中,所述多个交易的数目小于等于所述预定数目,所述装置还包括,窗口移动单元,配置为,在提交所述第二交易之后,将所述交易执行窗口在所述第一节点中包括的以预定提交顺序排列的多个交易中向后移动一个交易。
[0047] 本说明书另一方面提供一种计算机可读存储介质,其上存储有
计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
[0048] 本说明书另一方面提供一种计算设备,包括
存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
[0049] 通过根据本说明书实施例的在区块链中并发执行交易的方案,通过利用变量访问表记录交易执行窗口中并发执行的多个交易执行的对同一个变量的读写操作,从而可使得对于没有相互依赖性的多个交易,可并发执行这些交易,对于具有相互依赖性的多个交易,可串行执行这些交易,从而在保证计算结果一致性的同时,加快了处理速度,提高了处理性能。
附图说明
[0050] 通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:
[0051] 图1示出根据本说明书实施例的区块链系统;
[0052] 图2示出根据本说明书实施例的一种在区块链中并发执行多个交易的方法
流程图;
[0053] 图3示出图1中的变量访问表中与第一变量相对应的条目;
[0054] 图4示出了根据本说明书实施例的交易执行窗口的示意图;
[0055] 图5示出根据本说明书实施例的一种在区块链中并发执行多个交易的装置5000。
具体实施方式
[0056] 下面将结合附图描述本说明书实施例。
[0057] 图1示出根据本说明书实施例的区块链系统示意图。如图1所示,所述系统中包括构成区块链的多个节点(图中示意示出6个节点),这些节点两两相连,其中例如包括节点11、节点12和节点13。如本领域技术人员所知,在区块链中,一些节点会收集区块链中的多个交易放入交易池中并竞争记账权。例如图中的节点11通过获取记账权而成为记账节点。
节点11在成为记账节点之后会执行其交易池中的多个交易,并将该多个交易打包成区块发送给其它节点,例如发送给节点12。节点12将会对该区块进行验证,并同样地执行该区块中的多个交易。在预定数目个节点对该区块进行验证之后,也即对该区块达到了共识,区块链中的其它节点(例如节点13)将不需要继续对该区块进行验证,而是直接对该区块中的交易进行执行,以更新本地的相关数据。
[0058] 所述多个交易中可能涉及到对多个变量的计算,在两个交易中不涉及相同的变量的情况中,其执行顺序并不会影响最终的计算结果,而在两个交易中涉及相同的变量的情况中,其执行顺序将会影响最终的计算结果。因此,在本说明书实施例中,为了保证各个节点对多个交易的执行结果是相同的,在各个节点都预设了各自的变量访问表,如图中的与节点11、节点12和节点13分别对应的变量访问表11、变量访问表12和变量访问表13。该变量访问表中包括多个交易中涉及的各个变量的条目,在变量的条目中,包括各个交易对该变量的执行记录。例如,如图中对节点11的变量访问表11中放大所示,该变量访问表中包括k1,k2,…kn等,以及与k1,k2,…kn分别对应的写字段,读字段,窗口位置(字段)和序列号(字段)。其中,k1,k2,…kn分别为与多个交易中包括的各个变量相对应的键(key),其例如为各个变量的哈希值,n例如可以取较大值,例如100万。其中,写字段用于记录各个交易对应的执行体对相应变量执行的写操作,读字段用于记录各个交易对应的执行体对相应变量执行的读操作,该执行体例如可以为线程、
进程、协程中的任一个。在本说明书实施例中,由于交易数量较多,可设定交易执行窗口,即当前只并发执行交易执行窗口中的多个交易。在该情况中,如图中所示,变量访问表中的窗口位置用于指示当前交易执行窗口的位置,该窗口位置字段值可基于对应于窗口位置预设的全局变量获取。所述序列号为交易批次号。
[0059] 从而,在执行区块中的多个交易(例如交易执行窗口中的多个交易)时,通过参考变量访问表,使得对于不存在相互依赖关系的多个交易,可并发执行该多个交易,而对于存在相互依赖关系的多个交易,可通过重读、等待等方式串行执行该多个交易,从而在保证各个节点计算结果一致的同时,对部分交易并发执行,节省了处理时间,提高了计算效率。
[0060] 可以理解,上文对图1的描述只是示意性地,而不是用于限制本说明书实施例的范围。例如,所述变量访问表不限于为图1中所示的表,而可以根据需要进行变化。例如,所述变量访问表中不一定包括窗口位置字段和序列号字段等。下文将详细描述根据本说明书实施例的并发执行交易的过程。
[0061] 图2示出根据本说明书实施例的一种在区块链中并发执行多个交易的方法流程图,其中,所述多个交易具有预定的提交顺序,其中包括第一交易,所述方法在区块链中的第一节点执行,所述第一节点预设有变量访问表,所述变量访问表中包括与第一变量对应的写字段,其中,所述写字段用于记录所述多个交易中的对所述第一变量的写操作的执行,所述方法包括:
[0062] 步骤S202,对于每个在前交易,基于所述写字段确定:是否已执行该在前交易中的对所述第一变量的写操作,其中,所述在前交易为所述多个交易中提交顺序在所述第一交易之前的交易;以及
[0063] 步骤S204,基于所述确定结果,执行第一交易中的对所述第一变量的读操作。
[0064] 如上文中参考图1中所述,该方法在区块链中的一个节点执行。该节点在打包区块时,或者该节点在接收到新生成的区块之后,都会对相关的多个交易进行执行提交。例如,一个区块中可包括几千笔交易,而这几千笔交易可能涉及几百个变量,其中,多个交易可能访问不同的变量,或者,多个交易可能访问相同的变量。在现有技术中,在记账节点中,已经根据预定规则确定了将打包到一个区块中的多个交易各自的交易编号,该交易编号的顺序指示了交易的执行顺序和提交顺序。在本说明书实施例中,为了使得最后的计算结果与现有技术中的串行计算结果相同,对区块中的多个交易保留预定好的提交顺序,即,以各个交易的编号顺序作为其各自的提交顺序,同时,基于各个节点预设的变量访问表,使得没有依赖关系的各个交易可并发执行,并使得具有依赖关系的各个交易依据其编号的先后串行执行,其中,对于先后编号的交易1和交易2,如果在交易1中对第一变量进行写入,在交易2中对第一变量进行读取,则交易2依赖于交易1的结果。
[0065] 图3示出图1中的变量访问表中与第一变量相对应的条目。如图3中所示,第一变量例如与变量访问表中的k1对应,k1为第一变量的键值,其例如为第一变量的哈希值。可以理解,k1不限于为第一变量的哈希值,而还可以为第一变量的任意标识。在变量访问表中,k1对应的字段包括以下与第一变量对应的几个字段:写字段、读字段、窗口位置字段、以及序列号字段。其中,写字段和读字段都包括预定数目的位数(图中仅示意示出6位),例如,所述位数为64位,该位数应大于等于区块链中并发执行的交易的最大数目,从而使得并发执行的每个交易都可以与该字段中的一位唯一对应。其中,如图3中所示,写字段和读字段中各位的初始值都为0。其中,所述写字段用于记录并发执行的多个交易中包括的各个写操作是否已执行,所述读字段用于记录并发执行的多个交易中包括的各个读操作是否已执行。例如,在写字段中,对于预定数目的并发执行的多个交易(例如5个交易),可通过将其交易编号对64取模,从而确定其在64位中对应的位。也就是说,出于节省内存的考虑,将所述读写字段设置为环形缓冲区,从而多个交易可复用该读写字段,例如,读写字段中最多能记录64个交易的访问信息,从而,交易1和交易65会使用同一个位置进行记录。在写字段中与例如第一交易相应的位中,当第一交易未执行对第一变量的写操作时,第一交易对应的位中的值为0,当第一交易执行对第一变量的写操作之后,可将该位中的值修改为1。在本说明书实施例中,执行对变量的写操作是指,在本地内存中执行该写操作,而并未对变量进行实际的写操作,在本实施例中,仅在提交该交易时,才对变量进行实际的写操作。读字段的各位的值可类似地修改,例如,当第一交易未执行对第一变量的读操作时,在读字段中与第一交易相应的位中的值为0,当第一交易执行对第一变量的读操作之后,可将该位中的值修改为1。在本说明书实施例中,执行对变量的读操作是指,对存储的变量进行读取,以获取该变量的当前值。
[0066] 可以理解,图3所示的读写字段只是根据本实例的读写字段的一种具体实现方式,根据本说明书实施例的读写字段不限于为图3所示的具体形式,只要其可以记录并发执行的各个交易的执行体对第一变量的读操作/写操作即可。
[0067] 通常,在需要执行的交易数目较多的情况中,在执行交易时可设置交易执行窗口,该交易执行窗口可包括预定数目的交易。交易执行窗口的目的是:使得执行体在执行完窗口下限处的交易时,知道“这个交易获得的输入信息都是最新的,而不用等待其它交易就可以进行最终提交”,而对于窗口中间的交易,其执行体在执行完该交易之后不能确定此交易是否获得了最新的输入,因此要等到它位于窗口下限时,才能最终提交,在提交之前,该交易可能发现自己被标记了要重做;窗口上限用于限制执行交易所使用的资源量,如果上限是无限大,则就算没有交易最终提交,执行体也可以一直处理交易,直到内存资源耗光。
[0068] 将该交易执行窗口在以提交顺序(或交易编号)排列的多个交易中滑动,使得在区块链节点中可并发执行该交易执行窗口中的多个交易,并且可设定,每提交一个交易,就将交易执行窗口向后滑动一个交易。图4示出了根据本说明书实施例的交易执行窗口的示意图。如图4中所示,图中1到10十个数字表示编号分别为1到10的十个交易,所述交易执行窗口例如可包括5个交易。该交易执行窗口初始可落在交易1到5上。在提交交易1之后,窗口往后移动一个交易,即落到交易2到6上,同样地,在提交交易2之后,窗口再往后移动一个交易,从而如图中所示,落到交易3到7上。
[0069] 从而,图3中的窗口位置字段用于指示交易执行窗口目前所在位置。该窗口位置字段例如对应于第一全局变量,从而每个变量对应的该字段都可以基于该第一全局变量获取当前的窗口位置。该第一全局变量例如可以设定为等于当前窗口的起始交易编号、结束交易编号等。例如在窗口位置如图4所示的情况中,图3中的窗口位置例如可填入“3”,即,在该情况中,以窗口中的起始交易标识窗口位置。该窗口位置字段可以对应于多个值,例如第一个值对应于当前应串行提交的交易编号,第二个值对应于出于被处理状态的交易的最大编号,或者第二个值可以为窗口包括交易的数目等等。
[0070] 在一个区块中包括几千个交易的情况中,可对这些交易分批执行,例如可设定每批交易包括1000个交易,并且对于每批交易设定批号。从而,所述序列号字段可指示当前处理交易的批号。例如,在执行第一交易对第一变量的写或读操作时,可比较该第一交易的当前批号与变量访问表中记录的第一变量的序列号字段中指示的批号,如果二者一致,则可继续执行所述操作,如果二者不一致,则可清空变量访问表中与第一变量对应的已有数据。例如,图3所示的序列号为“2”,这表示,正在执行的交易为第二批交易,该第二批交易同样从1到1000编号,其通过序列号“2”与第一批中编号从1到1000的交易相区分。通过在变量访问表中加入序列号字段,可免去对变量访问表的清零设置。在变量访问表中,各个变量的访问率可能不同,有的变量(例如变量k2)很容易引起冲突。对于该变量k2,需要将其标记出来,以使得对该变量k2的读访问者在等前序交易提交之后再进行。如果通过序列号字段,通过判断批号是否过时,就可以作为对该变量k2的标记。如果不采用序列号的方法,则可以通过异步的方式进行清零。
[0071] 可以理解,图3所示的变量访问表仅仅是示意性的,并不用于限制本说明书实施例的范围。例如,在并发执行的交易数量较少的情况中,不需要对交易进行分批,也不需要通过交易执行窗口控制交易执行数量,从而变量访问表中可以仅包括写字段和读字段。在一个实施例中,在变量访问表中可仅包括写字段,从而,在执行交易中的读操作时,可通过基于写字段判断编号在前的并发执行的交易是否执行了写操作来进行读操作,而在执行交易的写操作时,可对编号在后的交易都进行通知,以使得编号在后的执行过读操作的交易都重新执行读操作。在一个实施例中,在变量访问表中可仅包括读字段,从而,在执行交易中的读操作时,可直接进行,在执行交易的写操作时,可通过基于读字段判断编号在后的同时执行的交易是否执行了读操作,并在提交之后通知执行了读操作的交易重新执行读操作。
[0072] 下面详细描述该方法中的步骤。
[0073] 首先,在步骤S202,对于每个在前交易,基于所述写字段确定:是否已执行该在前交易中的对所述第一变量的写操作,其中,所述在前交易为所述多个交易中提交顺序在所述第一交易之前的交易。
[0074] 例如,参考图4中的交易执行窗口,例如所述窗口如图中所示落在交易3~7上,即,在区块链节点中当前对交易3~7进行并发执行,例如,可通过5个执行体3~7并发执行交易3~7,例如在以太坊节点中,具体是在
虚拟机中对交易3~7进行并发执行。在该情况中,假设交易6为所述第一交易,其即将执行对第一变量的读操作。由于交易3~7是按照该交易编号顺序依次提交,因此,交易6需要判断正在同时执行的交易3~5有没有进行写操作,如果交易3~5中任一个交易进行了写操作,该写操作将最终改变第一变量的值,因此,交易6需要等前面的包括写操作的交易提交了之后,才能读取到第一变量的经过该写操作的值。例如,交易4中包括对第一变量的写操作,并且在节点中当前已经执行了交易4中的所述写操作,从而变量访问表中与第一变量对应的写字段中与交易4对应位被修改为1,节点中与交易6对应的执行体基于所述变量访问表可获知节点中的其它执行体已经执行了交易4中的对第一变量的写操作。
[0075] 在一个实施例中,区块链节点部署在一台服务器上,从而所述变量访问表存储在本地的共享内存中,在该情况中,与交易6对应的执行体可在查找变量访问表的近乎同时获知查找结果。
[0076] 在一个实施例中,区块链节点部署在多台服务器上,从而,所述变量访问表例如存储在一台专用服务器上,该节点中的其它服务器可通过访问该专用服务器而从专用服务器接收到该变量访问表中的信息。
[0077] 在步骤S204,基于所述确定结果,执行第一交易中的对所述第一变量的读操作。
[0078] 在一个实施例中,在所述变量访问表存储在本地的共享内存中的情况中,与交易6对应的执行体可在查找变量访问表的近乎同时获知查找结果,并在获知查找结果之后再基于该结果进行后续的操作。例如,交易6在对其之前的每个交易都进行上述查询之后确定:交易3~5目前都未进行对第一变量的写操作,也就是说,交易3~5的执行目前都未改变第一变量的值,因此,执行体6执行对第一变量的值的读取。例如,执行体6在对其之前的每个交易都进行上述查询之后确定:执行体4已经进行了对第一变量的写操作,则交易6进行等待,直到交易4提交之后,再确定是否进行对第一变量的读取。在交易4提交之后,如前文所述,交易执行窗口将移动到5~9上,执行体6可再次对其之前的每个交易进行上述查询,即基于变量访问表查询执行体5是否进行了对第一变量的写操作,在执行体5也进行了所述写操作的情况中,执行体6将等待交易5提交之后再读取。再例如,执行体6在对其之前的每个交易都进行上述查询之后确定:交易4和执行体5都已经进行了对第一变量的写操作,则交易6进行等待,直到交易5提交之后再进行对第一变量的读取。即,执行体6需要等到并发执行的多个交易中的在交易6前面的且距离交易6最近的交易的写操作提交之后再进行读操作。而并发执行的交易中的在交易6后面的交易的写操作并不影响交易6的读操作的执行。
[0079] 在一个实施例中,所述变量访问表存储在本地,与交易6对应的执行体可向本地专用硬件发送报告,以请求所述专用硬件上述步骤中的确定。所述专用硬件例如为本地的专用于访问和改写变量访问表的CPU或FPGA等。执行体6在发送所述报告的同时,执行对第一变量的读取操作,即,这里不等待接收到查询结果而直接进行对第一变量的读取。在交易6提交之前,由执行体6基于从专用硬件接收的信息确定是否要进行对第一变量的重新读取。例如,在专用硬件接收到所述报告并进行查询之后确定在交易6之前的交易3~5中存在执行了对第一变量的写操作的交易,在该情况中,专用硬件通知执行体6重新进行对第一变量的读取。
[0080] 在所述变量访问表例如存储在一台专用服务器上的情况中,例如当前通过服务器1并发执行交易3~7,服务器1中与交易6对应的执行体将要执行对第一变量的读取操作。服务器1向专用服务器发送将要读取第一变量的报告,以请求专用服务器进行确定在交易6之前的并发执行的交易的执行体是否进行了对第一变量的写操作。服务器1在发送所述报告的同时,由执行体6请求所述专用服务器执行对第一变量的读取操作,即,由于接收到来自专用服务器的查询结果需要经过较长通信时间,因此,这里不等待接收到查询结果而直接进行对第一变量的读取。在交易6提交之前,由执行体6基于从专用服务器接收的信息确定是否要进行对第一变量的重新读取。例如,在专用服务器接收到所述报告并进行查询之后确定在交易6之前的交易3~5中存在执行了对第一变量的写操作的交易,在该情况中,专用服务器通知执行体6重新进行对第一变量的读取。这里,为了降低开发难度,执行体6在接收到该通知之后,通常是重新执行全部交易6。例如,在上述查询中未查询到交易3~5中存在执行了对第一变量的写操作的交易,但是交易3~5的执行体在执行体6进行读取之后后续进行了写操作,并在提交之后写入专用服务器的变量访问表中,从而专用服务器基于该写入通知执行体6进行对第一变量的重新读取,则执行体6在提交前重新执行交易6。而在上述查询中未查询到交易3~5中存在执行了对第一变量的写操作的交易,且交易3~5的执行体在执行体6进行读取之后也未进行写操作,即专用服务器未通知执行体6进行重新读取,则执行体6可直接提交交易6。
[0081] 在由执行体6如上述进行对第一变量的读操作之后,将变量访问表中的与第一变量对应的读字段中的对应于交易6的位修改为例如“1”,该位在执行体6为执行读操作之前例如为0。
[0082] 在一个实施例中,所述多个交易中还包括第二交易,其中,所述第二交易的提交顺序在所述多个交易中位于第一位,所述第二交易中包括对所述第一变量的写操作,当在相应地修改所述读字段之后提交所述第二交易的情况中,如图2中虚线框所示,所述方法还包括以下步骤:
[0083] 步骤S206,基于所述读字段,确定是否已执行第一交易中的对所述第一变量的读操作;以及
[0084] 步骤S208,在确定已执行第一交易中的对所述第一变量的读操作的情况中,通知本地重新执行第一交易中的对所述第一变量的读操作。
[0085] 在上述实施例中,例如图4中所示的交易3即为所述第二交易。在执行体6如上所述进行了读操作之后,例如执行体3执行了写操作。具体是,执行体3将将要对第一变量进行写入的值存入内存预
定位置中,然后将变量访问表中的与第一变量对应的写字段中的对应于交易3的位修改为“1”。在经过该修改之后,例如执行体7在该修改之后将要进行对第一变量的读操作,其与上文类似地,通过查询变量访问表可获知执行体3已经执行了对第一变量的写操作,从而,执行体7将等待交易3提交之后再进行上述读操作。
[0086] 由于交易3位于交易执行窗口的最左边,因此,执行体3在执行完交易3之后,将进行对交易3的提交。例如,进程3可基于表中的窗口位置字段确定当前是否提交交易3。在提交了交易3之后,也即对第一变量进行了实际写入,修改了第一变量的值。当提交了交易3之后,将进行如下步骤。
[0087] 在步骤S206,基于所述读字段,确定是否已执行第一交易中的对所述第一变量的读操作。
[0088] 在上述提交交易3之后,执行体3将针对该提交之前在所述窗口中的其它几个交易(即交易4~7)确定其对应执行体是否已进行了对第一变量的读操作,如果已经进行了读操作,则通知相应执行体重新执行读操作。例如,如上文所述,交易6(即所述第一交易)为所述窗口中在交易3之后的一个交易,则执行体3基于所述读字段中与交易6对应的位确定执行体6是否已经执行了对第一变量的读操作。
[0089] 在步骤S208,在确定已执行第一交易中的对所述第一变量的读操作的情况中,通知本地重新执行第一交易中的对所述第一变量的读操作。
[0090] 在通过上述步骤的确定之后,执行体3在基于变量访问表确定执行体6已经进行了读操作之后,通知执行体6重新执行对第一变量的读操作。其中,在变量访问表存储在本地共享内存中的情况中,执行体3可在交易6的私有存储空间中进行标记,以通知执行体6进行重读操作,交易6在提交前或其它时机检查是否存在该重读标记。或者,执行体3在进行所述标记之后,可向执行体6发送异步
信号,执行体6在接收到该异步信号之后,检查当前交易是否被设置为需要重读(因为该执行体在接收到异步信号时,可能已经不在执行交易6了),若需要,则转入重读流程。在变量访问表存储在另外的专用服务器的情况中,该服务器通过网络委托执行体6所在主机进行标记,以通知执行体6进行重读操作。
[0091] 执行体6可立即重新执行该读操作,或者,执行体6可从变量访问表查看执行体4和5后续有没有进行写操作,例如,在执行体4也进行了写操作的情况中,执行体6可等到交易4提交之后再重新执行读操作。
[0092] 另外,在提交了交易3之后,交易执行窗口往后移动一位,即位于交易4~8上,在该情况中,执行体3还将变量访问表中与第一变量对应的写字段中的与交易3对应的位清零,以使得不影响后续交易对该位的使用。类似地,如果交易3中还包括读操作,执行体3在之前执行读操作之后也将读字段中的相应为修改为1,而在提交交易3之后,执行体3同样地将该位清零。
[0093] 图5示出根据本说明书实施例的一种在区块链中并发执行多个交易的装置5000,其中,所述多个交易具有预定的提交顺序,其中包括第一交易,所述装置部署在区块链中的第一节点中,所述第一节点预设有变量访问表,所述变量访问表中包括与第一变量对应的写字段,其中,所述写字段用于记录所述多个交易中的对所述第一变量的写操作的执行,所述装置包括:
[0094] 第一确定单元501,配置为,对于每个在前交易,基于所述写字段确定:是否已执行该在前交易中的对所述第一变量的写操作,其中,所述在前交易为所述多个交易中提交顺序在所述第一交易之前的交易;以及
[0095] 执行单元502,配置为,基于所述确定结果,执行第一交易中的对所述第一变量的读操作。
[0096] 在一个实施例中,所述变量访问表存储在本地,其中,所述执行单元502还配置为,在对于每个在前交易,基于所述写字段确定未执行对所述第一变量的写操作的情况中,执行第一交易中的对所述第一变量的读操作。
[0097] 在一个实施例中,所述执行单元502还配置为,对于所述多个交易中提交顺序在所述第一交易之前的第二交易,基于所述写字段确定已执行该第二交易中的对所述第一变量的写操作的情况中,相对于第一交易进行等待,以在提交第二交易之后执行第一交易中的对所述第一变量的读操作。
[0098] 在一个实施例中,所述变量访问表存储在本地,其中,所述第一确定单元501还配置为,向本地专用硬件发送报告,以请求所述专用硬件进行所述确定,
[0099] 所述执行单元502还配置为,在发送所述报告的同时,执行第一交易中的对所述第一变量的读操作,以及在提交第一交易之前,基于从所述专用硬件接收的确定结果,确定是否重新执行第一交易。
[0100] 在一个实施例中,所述变量访问表存储在专用服务器中,其中,所述第一确定单元501还配置为,向所述专用服务器发送报告,以请求所述专用服务器进行所述确定,[0101] 所述执行单元502还配置为,在发送所述报告的同时,请求所述专用服务器执行第一交易中的对所述第一变量的读操作,以及在提交第一交易之前,基于从所述专用服务器接收的确定结果,确定是否重新执行第一交易。
[0102] 在一个实施例中,所述变量访问表中还包括与所述第一变量对应的读字段,所述读字段用于记录所述多个交易中的对所述第一变量的读操作的执行,所述装置还包括,修改单元503,配置为,在执行第一交易中的对所述第一变量的读操作之后,相应地修改所述读字段。
[0103] 在一个实施例中,所述读字段包括与所述多个交易分别对应的多位,其中,所述修改单元还配置为,相应地修改所述读字段中与第一交易对应的位。
[0104] 在一个实施例中,所述多个交易中还包括第二交易,其中,所述第二交易的提交顺序在所述多个交易中位于第一位,所述第二交易中包括对所述第一变量的写操作,当在相应地修改所述读字段之后提交所述第二交易的情况中,所述装置还包括,
[0105] 第二确定单元504,配置为,基于所述读字段,确定是否已执行第一交易中的对所述第一变量的读操作;以及
[0106] 通知单元505,配置为,在确定已执行第一交易中的对所述第一变量的读操作的情况中,通知本地重新执行第一交易中的对所述第一变量的读操作。
[0107] 在一个实施例中,所述多个交易中还包括第三交易,其中,所述第三交易的提交顺序在所述第一交易和第二交易之间,所述装置还包括:
[0108] 第三确定单元506,配置为,在从本地接收重新执行第一交易中的对所述第一变量的读操作的通知之后,基于所述写字段确定是否已执行了第三交易中对第一变量的写操作;
[0109] 等待单元507,配置为,在确定已执行了第三交易中的写操作的情况中,进行等待,以在提交了第三交易中对第一变量的写操作之后,重新执行第一交易中对第一变量的读操作。
[0110] 在一个实施例中,所述写字段中包括的预定数目的位与预定数目的交易分别对应,所述装置还包括,第一复原单元508,配置为,在提交所述第二交易之后,将所述写字段中与所述第二交易对应的位的第一值复原,其中所述第一值用于记录:已执行所述第二交易中的对所述第一变量的写操作。
[0111] 在一个实施例中,所述读字段中包括的预定数目的位与预定数目的交易分别对应,所述第二交易中还包括对第一字段的读操作,所述装置还包括,第二复原单元509,配置为,在提交所述第二交易之后,将所述读字段中与所述第二交易对应的位的第一值复原,其中该第一值用于记录:已执行所述第二交易中的对所述第一变量的读操作。
[0112] 在一个实施例中,所述第一节点中预设有交易执行窗口,所述多个交易为所述交易执行窗口当前包括的多个交易,其中,所述多个交易的数目小于等于所述预定数目,所述装置还包括,窗口移动单元510,配置为,在提交所述第二交易之后,将所述交易执行窗口在所述第一节点中包括的以预定提交顺序排列的多个交易中向后移动一个交易。
[0113] 本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
[0114] 本说明书另一方面提供一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
[0115] 通过根据本说明书实施例的在区块链中并发执行交易的方案,通过利用变量访问表记录交易执行窗口中并发执行的多个交易执行的对同一个变量的读写操作,从而可使得对于没有相互依赖性的多个交易,可并发执行这些交易,对于具有相互依赖性的多个交易,可串行执行这些交易,从而在保证计算结果一致性的同时,加快了处理速度,提高了处理性能。
[0116] 需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念执行区分,并不具有其他限定作用。
[0117] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0118] 上述对本说明书特定实施例执行了描述。其它实施例在所附
权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0119] 本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以
电子硬件、计算机
软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执轨道,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本
申请的范围。
[0120] 结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执轨道的
软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、
只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、
硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
[0121] 以上所述的具体实施方式,对本发明的目的、技术方案和有益效果执行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。