块链式账本中全局状态的哈希的生成方法、装置及设备
技术领域
本说明书实施例涉及信息技术领域,尤其涉及块链式账本中全局状态的哈希的生成方法、装置及设备。
背景技术
在块链式账本中,通常都会存在一颗记录全局状态的全局状态树。当前对于全局状态的更新方式中每新产生一个交易就会计算一次全局状态所对应的哈希值。在交易频率较高的场景下,对系统的计算负担太大。
发明内容
本申请实施例的目的是提供一种在块链式账本中计算全局状态的哈希时可以降低系统负载的方案。
为解决上述技术问题,本申请实施例是这样实现的:
块链式账本中全局状态的哈希的生成方法,应用于以块链式账本存储数据记录的中心化的数据库服务端中,包括:
获取已经确定需要写入账本的多个新交易,其中,所述多个新交易的哈希还没有写入全局状态树;
根据所述多个新交易的哈希生成对应所述多个新交易的临时默克尔树;
合并所述临时默克尔树和当前的全局状态树,生成以所述多个新交易的哈希为叶子节点的新的全局状态树;
获取所述新的全局状态树的根哈希,将所述新的全局状态树的根哈希写入所述账本中的数据块的块头中。
对应的,本说明书实施例还提供块链式账本中全局状态的哈希的生成装置,应用于以块链式账本存储数据记录的中心化的数据库服务端中,包括:
获取模块,获取已经确定需要写入账本的多个新交易,其中,所述多个新交易的哈希还没有写入全局状态树;
生成模块,根据所述多个新交易的哈希生成对应所述多个新交易的临时默克尔树;
合并模块,合并所述临时默克尔树和当前的全局状态树,生成以所述多个新交易的哈希为叶子节点的新的全局状态树;
写入模块,获取所述新的全局状态树的根哈希,将所述新的全局状态树的根哈希写入所述账本中的数据块的块头中。
通过本说明书实施例中所提供的方案,在更新块链式账本中的全局状态树时,对新写入账本的交易实行批量计算,得到对应于该批次交易的临时默克尔树,然后拼接临时默克尔树和当前的全局状态树,并更新计算所述全局状态树的根哈希,从而降低了全局状态的更新频率,降低了系统的计算负载。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本说明书实施例。
此外,本说明书实施例中的任一实施例并不需要达到上述的全部效果。
附图说明
为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
图1为本当前技术中更新全局状态树的示意图;
图2是本说明书实施例提供的一种块链式账本中全局状态的哈希的生成方法的流程示意图;
图3为本说明书实施例所提供的一种多线程方式生成临时默克尔树的示意图;
图4为本说明书实施例所提供的一种临时默克尔树和当前的全局状态树进行拼接的示意图;
图5为本说明书实施例所提供的一种块链式账本中生成数据块的流程示意图;
图6为本说明书实施例所提供的一种数据块的块头的示意图;
图7是本说明书实施例提供的一种块链式账本中全局状态的哈希的生成装置的结构示意图;
图8是用于配置本说明书实施例方法的一种设备的结构示意图。
具体实施方式
为了使本领域技术人员更好地理解本说明书实施例中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行详细地描述,显然,所描述的实施例仅仅是本说明书的一部分实施例,而不是全部的实施例。基于本说明书中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于保护的范围。
在块链式的账本交易记录的集合,由相连的区块构成,每个区块中包含一些有序交易。全局状态可以被视作为随着交易的执行而持续更新的状态,账本中所有的交易信息都体现在全局状态之中,并由全局状态树保存。
具体而言,可以通过全局状态树的根哈希来表征当前的全局状态,全局状态中包含了账本中所有的交易信息。账本最初创建时,全局状态为空。全局状态树中的叶子结点与账本中的交易是一一对应的。通常的,叶子节点从左到右的排序方式与业务节点所对应的交易在账本中的顺序一致。
在当前的块链式账本中,对于全局状态树的更新方式是每在账本中新写入一个交易,即需要更新一次全局状态树(即在全局状态树中的右边新加入了一个叶子节点),那么就需要重新计算一次全局状态树的根哈希。
如图1所示,图1为本当前技术中更新全局状态树的示意图,图中的虚线节点表征了该节点需要重新计算哈希值。可以看到,每一个新交易都会对全局状态中的若干节点的哈希值造成改变,如果每来一个新交易就重新计算一次全局状态树的哈希值,显然系统的计算负载是很高的。
在中心化的数据库服务端中,由于交易频次大为提高,这种全局状态树的更新方式就给服务端带来了很大的计算压力。基于此,本说明书实施例提供一种在块链式账本中计算全局状态的哈希时可以降低系统负载的方案。
以下结合附图,详细说明本说明书各实施例提供的技术方案。如图2所示,图2是本说明书实施例提供的一种块链式账本中全局状态的哈希的生成方法的流程示意图,该流程具体包括如下步骤:
S201,获取已经确定需要写入账本的多个新交易。
其中,所述多个新交易的哈希还没有写入全局状态树。
本说明书中所涉及的交易是指用户向区块链发布的一笔具有业务意图的数据记录;例如,运营方可以基于实际的业务需求搭建一个联盟链,依托于联盟链部署一些与价值转移无关的其它类型的在线业务(比如,租房业务、车辆调度业务、保险理赔业务、信用服务、医疗服务等),而在这类联盟链中,交易可以是用户在联盟链中发布的一笔具有业务意图的业务消息或者业务请求。
本说明书实施例中的新交易,是指已经被确定需要写入账本,但是还在等待出块条件到达,而并未写入账本的交易。具体的写入方式将在后文详述,换言之,新交易的信息还在等待写入当前的全局状态树中。
新交易具体数量通常而言是预先指定数量的。例如,服务端预先指定每1000个新交易作为一个批次。
在实际应用中,预先指定数量可以根据账本中交易的写入频率自行设定。进一步地,在一种实施方式中,可以根据全局状态树的分叉情形来设定数量。如果全局状态树是M叉树,那么在预先指定数量时可以指定新交易的数量为诸如M^n的形式。
例如,全局状态树是2叉树,则可以指定新交易的数量为2^9,即512个。如果全局状态树是3叉树。则可以指定新交易的数量为诸如3^6,即729个。通过指定数量于全局状态树的分叉情形相适应,可以便于以后生成的临时默克尔树是一颗满树,便于临时默克尔树和当前的全局状态树的拼接。
S203,根据所述多个新交易的哈希生成对应所述多个新交易的临时默克尔树。
具体而言,在生成临时默克尔树之前,可以对于多个新交易进行随机的排序,并将随机排序后的新交易作为叶子节点来生成临时默克尔树。
由于交易的顺序也是账本中的一部分信息,在由同样的交易所生成的全局状态树中,如果有任意两个交易的顺序不同,则生成的全局状态树的根哈希也会不同,因此叶子节点的依序排列同样需要被反应到全局状态树中。
在一种实施方式中,则可以对交易在账本中的排序信息多个新交易进行排序,所述排序信息包括写入时间或者位置信息。例如,对于已经写入账本中的新交易,每个交易都会存在一个写入时间戳,那么就可以根据写入时间戳的先后顺序来对所述多个新交易进行排序。
在另一种实施方式中,还可以根据新交易在账本中的位置信息来进行排序。对于一个交易的位置信息,可以通过其所处的数据块的块高和在数据块中的偏移量进行确定。
而在本说明书,块高是单调递增的,越小的数据块排序越靠前;在同一个数据块中,交易的排序也已经固定,因此一个交易在该数据块中的偏移量也是明确的。例如,在交易的长度为固定单位时,序号同样可以用于明确该交易在其所处的数据块中的位置信息。即,序号同样也可以用于指示偏移量,并且序号越小,在同一个数据块中排序就越靠前。即一个交易在账本中的位置先后与块高和偏移量均负相关,块高和偏移量越小,位置排序越靠前。
例如,假设新交易中存在的五条数据记录的位置信息为(2,08),(3,01),(2,09),(2,10),(3,01),那么排序后新交易顺序即为(2,08),(2,09),(2,10),(3,01)。
在生成临时默克尔树时,则是新写入的交易所对应的叶子节点在左边,后写入的交易所对应的叶子节点在右边,依序排列来生成临时默克尔树。通过该方式,则可以保持新生成的临时默克尔树的排序和全局状态树中的叶子结点的排序方式的一致性,从而可以便于后续的临时默克尔树和全局状态树的合并。
在一种实施方式中,对于指定数量的多个新交易,还可以采用多线程并行计算的方式来构建临时默克尔树。
具体而言,可以首先将多个新交易进行排序例如,根据时间戳或者位置信息排序。
在排序之后,即可以将多个新交易划分为K个有序的集合,进而创建出与集合一一对应的K
个线程来计算每个集合所对应的子树,此处的K的数量可以基于服务端的计算性能自行设
定。即对于第i集合,创建与该集合对应的第i个线程,根据第i集合中所包含的新交易的顺
序,生成以第i集合中所包含的新交易为叶子节点的第i个子树,
;然后依序拼接所
得到的K个子树,从而得到以所述多个新交易为叶子节点的临时默克尔树。如图3所示,图3
为本说明书实施例所提供的一种多线程方式生成临时默克尔树的示意图。在该示意图中,
将8个新交易划分为了4个部分,通过4个线程同时计算构成了临时默克尔树。在实际应用
中,可以创建更多的线程,以及每个线程中所计算的新交易的数量也可以更多,例如,将
1024个新交易划分为16个部分并创建16个线程,每个线程中需要计算64个新交易。通过这
样并行的方式,可以提高生成临时默克尔树的速度。
S205,合并所述临时默克尔树和当前的全局状态树,生成以所述多个新交易的哈希为叶子节点的新的全局状态树。
在合并的过程中,首先需要保证的是每个新交易在临时默克尔树中是作为叶子节点存在,那么在新的全局状态树中也应当作为叶子节点存在。只有新交易都作为叶子结点,才能保证全局状态树的根哈希可以准确的反应出账本中所有交易的信息。
基于此,一种合并方式可以是,确定所述临时默克尔树的根节点的高度,保持所述临时默克尔树的根节点的高度不变,拼接所述临时默克尔树至当前的全局状态树中最晚的叶子节点的右侧,生成以所述多个新交易的哈希为叶子节点的新的全局状态树。
例如,假设临时默克尔树的根节点的高度为3,那么在拼接时,则需要保证根节点在全局状态树中的高度同样为3。同时,如果全局状态树中的叶子节点也是基于前述排序信息依序排列时,那么在当前的全局状态树中最右边的叶子节点即为最晚的叶子节点,那么在拼接时,即只需将临时默克尔树中最左侧的叶子结点拼接至全局状态树中最右边的叶子节点的右边即可。如图4所示,图4为本说明书实施例所提供的一种临时默克尔树和当前的全局状态树进行拼接的示意图。在实际应用中,为容纳足够多的交易,一个二叉树形态的全局状态树可以高度达到30层,一颗临时默克尔树的高度也可能达到十几层。
通过这样的拼接方式,保持了临时默克尔树的完全不变,以及,保持了新生成的全局状态树中所有叶子结点仍然是依序排列。即新生成的全局状态树完全反应了账本中各交易的信息。
显然,在合并得到的新的全局状态树中,由于加入了新交易所对应的临时默克尔树,那么从临时默克尔树中的根节点到新的全局状态树的根节点所构成的路径上的相关节点的哈希值都需要重新计算。如图4中所示,需要重新计算哈希值的节点用虚线给出了示意。
S207,获取所述新的全局状态树的根哈希,将所述新的全局状态树的根哈希写入所述账本中的数据块的块头中。
在本说明书实施例中,每新出一个数据块,即需要在数据块的区块头中写入当前的全局状态树的根哈希。
如前所述,作为新交易,可以是已经写入了账本的多个新交易,或者是已经被确定需要写入账本的多个新交易,仅仅是在等待出块条件到达。那么就存在以下多种可能的实施方式。
例如,假设在账本中出块的数量阈值大于新交易的指定数量。例如,账本中出块的数量阈值为1024个数据记录出一个数据块,而每一个批次新交易的指定数量是256个,那么显然在一次出块期间就会更新四次全局状态树,在这个过程中由于需要将多个批次的新交易写入在一个数据块中,因此,在数据块的块头中实际上存储的是最后一次所更新的全局状态树的根哈希。
又例如,假设在账本中出块的数量阈值小于新交易的指定数量,例如,账本中出块的数量阈值为1个数据记录出一个数据块,而每一个批次新交易的指定数量为256个,那么显然,这期间需要产生256个数据块才会更新一次全局状态树。在这样的方式下,则会有连续的多个数据块的块头中所保存的全局状态树的根哈希相同。
在一种实施方式中,可以设置账本中出块的数量阈值和每一个批次中指定的多个新交易的数量相同。例如,账本中出块的数量阈值为256个数据记录出一个数据块,而每一个批次新交易的指定数量为256个。在这样的方式下,新生成的数据块包含了该批次的全部新交易,每出一个数据块就正好更新一次全局状态树,每个数据块的块头中所保存的全局状态树的根哈希不同,且每一次全局状态树的更新都会被写入账本中。
通过本说明书实施例中所提供的方案,在更新块链式账本中的全局状态树时,对新写入账本的交易实行批量计算,得到对应于该批次交易的临时默克尔树,然后拼接临时默克尔树和当前的全局状态树,并更新计算所述全局状态树的根哈希,从而降低了全局状态的更新频率,降低了系统的计算负载。
进一步地,在一种实施方式中,如果已经确认更新后的全局状态树的根哈希已经写入了账本,那么还可以删除更新过程中所产生的临时默克尔树,有效的释放内存空间,进一步降低系统负载。
在本说明书所涉及的中心化的数据库服务提供方,块链式的账本通过如下方式生成,如图5所示,图5为本说明书实施例所提供的一种块链式账本中生成数据块的流程示意图,包括:
S501,接收待存储的数据记录,确定各数据记录的哈希值。
如前所述,此处的待存储的数据记录,可以是客户端个人用户的各种消费记录,也可以是应用服务器基于用户的指令,在执行业务逻辑时产生的业务结果、中间状态以及操作记录等等。具体的业务场景可以包括消费记录、审计日志、供应链条、政府监管记录、医疗记录等等。此处的数据记录的含义与前述的交易的含义相同。
在一种实施例中,数据记录中可以包含有业务属性。在每个与数据库服务方对接的机构中,所述业务属性在所述对接机构中,一般而言是唯一存在的,业务属性基于不同的业务场景,可以包括用户名、用户身份证号、驾照编号、手机号、项目唯一编号、数据记录的种类(例如,各种报表的型号、收据、发票或者支出表等)等等。
例如,对于第三方支付机构而言,数据记录是用户的消费记录,此时的业务属性即为用户标识(包括手机号、身份证号、用户名等等),或者对该用户标识进行哈希算法所得到的哈希值;或者,对于政府机构而言,数据记录为多个公共项目的开销流水,则此时的业务属性可以为每个项目的唯一编号。
业务属性可以存储于数据记录中的指定字段(例如,数据记录的头部或者尾部),从而可以方便数据库服务端以及用户从中获取该数据记录的业务属性。
需要说明的是,在同一账本中,可以包含有多条数据记录。这些数据记录的业务属性则很可能是不一样的。例如,在一个账本面向多个用户开放时,数据记录可能来源于不同的的用户,若业务属性为用户标识, 则容易理解不同的数据记录中常常包含了不同的用户标识。
在同一用户所上传的数据记录中,也可能包含有多种不同的业务属性。例如,在账本中用于记录资金往来时,数据记录的业务属性可能是各种报表的型号、收据、发票或者收入/支出表等等。
S503,当达到预设的成块条件时,确定待写入数据块中的各数据记录,生成包含数据块的哈希值和数据记录的第N个数据块。
所述预设的成块条件包括:待存储的数据记录数量达到数量阈值,例如,每接收到一千条数据记录时,生成一个新数据块,将一千条数据记录写入块中;或者,距离上一次成块时刻的时间间隔达到时间阈值,例如,每隔5分钟,生成一个新数据块,将在这5分钟内接收到的数据记录写入块中。
此处的N指的是数据块的序号,换言之,在本说明书实施例中,数据块是以块链的形式,基于成块时间的顺序先后排列,具有很强的时序特征。其中,数据块的块高基于成块时间的先后顺序单调递增。块高可以是序号,此时第N个数据块的块高即为N;块高也可以其它方式生成。
当N=1时,即此时的数据块为为初始数据块。初始数据块的哈希值和块高基于预设方式给定。例如,初始数据块中不包含数据记录,哈希值则为任一给定的哈希值,块高blknum=0;又例如,初始数据块的生成触发条件与其它数据块的触发条件一致,但是初始数据块的哈希值由对初始数据块中的所有内容取哈希确定。
当N>1时,由于前一数据块的内容和哈希值已经确定,则此时,可以基于前一数据块(即第N-1个数据块)的哈希值生成当前数据块(第N个数据块)的哈希值,例如,一种可行的方式为,确定每一条将要写入第N个块中的数据记录的哈希值,按照在块中的排列顺序,生成一个默克尔树,将默克尔树的根哈希值和前一数据块的哈希值拼接在一起,再次采用哈希算法,生成当前块的哈希值。又例如,还可以按照块中数据记录的顺序进行拼接并取哈希得到整体数据记录的哈希值,拼接前一数据块的哈希值和整体数据记录的哈希值,并对拼接得到的字串进行哈希运算,生成数据块的哈希值。
用户在上传数据成功后,即可以得到对应的数据记录的哈希值以及所处的数据块的哈希值,并保存,并且可以基于该哈希值发起完整性验证。具体的验证方式包括重新计算数据记录自身的哈希值以及所处的数据块的哈希值,与本地所保存的进行对比。
上述方式生成的数据块,可以包括块头和块体两个部分。块体中可以用于存储拼接数据的明文,或者拼接数据的哈希值等等;块头中可以用于存储有关本数据块的元数据,例如,账本的版本号,前一数据块的哈希值,自身数据块中的拼接数据所组成的默克尔树的根哈希值,自身数据块的哈希值,用于记录拼接数据的被操作状态的状态数组等等。如图6所示,图6为本说明书实施例所提供的一种数据块的块头的示意图。
通过前述的数据块的生成方式,每一个数据块通过哈希值确定,数据块的哈希值由数据块中的数据记录的内容、顺序以及前一数据块的哈希值决定。用户可以随时基于数据块的哈希值发起完整性验证,对于数据块中任何内容(包括对于数据块中数据记录内容或者顺序的修改)的修改都会造成在验证时计算得到的数据块的哈希值和数据块生成时的哈希值不一致,而导致验证失败,从而实现了中心化下的不可篡改。
完整性验证包括对于一个数据块的完整性验证,即,根据数据块中数据记录的哈希值重新组成默克尔树,计算默克尔树的根哈希值,并且根据默克尔树的根哈希值与前一数据块的哈希值重新计算该数据块的哈希值,与事先保存的数据块的哈希值进行一致性对比。
完整性验证还可以包括对于若干连续数据块的完整性验证,即根据数据块的块头中所保存的默克尔树的根哈希值与前一数据块的哈希值重新计算该数据块的哈希值,并与事先保存的数据块的哈希值进行对比。
完整性验证还可以包括对某条数据记录进行的完整性验证。在块链式账本中,对于数据记录的完整性进行验证时,一种方式可以是:确定数据记录所处的数据块,并且根据该数据块中的数据记录构建默克尔树,并计算当前的默克尔树的根哈希值,从而可以与块头中所存储的默克尔树的根哈希值进行一致性对比,若不一致,则说明该数据记录已经被篡改。
另一种方式则可以是,在用户或者对接机构将数据记录上传服务端时,自己本地保存有数据记录的备用副本或者备用副本的哈希值,从而可以计算该数据记录的当前哈希值,并且与备用副本的哈希值进行一致性对比,以实现完整性验证。
对应的,本说明书实施例还提供一种块链式账本中全局状态的哈希的生成装置,应用于以块链式账本存储数据记录的中心化的数据库服务端中,如图7所示,图7是本说明书实施例提供的一种块链式账本中全局状态的哈希的生成装置的结构示意图,包括:
获取模块701,获取已经确定需要写入账本的多个新交易,其中,所述新交易的哈希还没有写入全局状态树;
生成模块703,根据所述多个新交易的哈希生成对应所述多个新交易的临时默克尔树;
合并模块705,合并所述临时默克尔树和当前的全局状态树,生成以所述多个新交易的哈希为叶子节点的新的全局状态树;
写入模块707,获取所述新的全局状态树的根哈希,将所述新的全局状态树的根哈希写入所述账本中的数据块的块头中。
进一步地,在所述装置中,所述生成模块703, 确定每个新交易在账本中的排序信息,所述排序信息包括写入时间或者位置信息;根据所述排序信息的先后对所述多个新交易排序,根据排序后的多个新交易的哈希生成所述临时默克尔树。
进一步地,在所述装置中,所述生成模块703, 对所述多个新交易进行排序,将排序后的所述多个新交易划分为K个有序的集合;针对第i集合,创建与该集合对应的第i个线程,根据第i集合中所包含的新交易的顺序,生成以第i集合中所包含的新交易为叶子节点的第i个子树,
;依序拼接生成得到的K个子树,生成以所述多个新交易为叶子节点的临时默克尔树。
进一步地,在所述装置中,所述合并模块705,确定所述临时默克尔树的根节点的高度;保持所述临时默克尔树的根节点的高度不变,拼接所述临时默克尔树至当前的全局状态树中最晚的叶子节点的右侧,生成以所述多个新交易的哈希为叶子节点的新的全局状态树。
进一步地,在所述装置中,所述写入模块707,生成包含所述多个新交易的新数据块,将所述新的全局状态树的根哈希写入新数据块的块头中。
进一步地,在所述装置中,还包括删除模块709,删除所述临时默克尔树。
进一步地,在所述装置中,还包括数据块生成模块711,在所述块链式账本中,数据块通过如下方式生成:接收待存储的数据记录,确定各数据记录的哈希值;当达到预设的成块条件时,确定待写入数据块中的各数据记录,生成包含数据块的哈希值和数据记录的第N个数据块,具体包括:
当N=1时,初始数据块的哈希值和块高基于预设方式给定;
当N>1时,根据待写入数据块中的各数据记录和第N-1个数据块的哈希值确定第N个数据块的哈希值,生成包含第N个数据块的哈希值和各数据记录的第N个数据块。
本说明书实施例还提供一种计算机设备,其至少包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行所述程序时实现图2所示的块链式账本中全局状态的哈希的生成方法。
图8示出了本说明书实施例所提供的一种更为具体的计算设备硬件结构示意图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。
处理器1010可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
存储器1020可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,并由处理器1010来调用执行。
输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现图2所示的块链式账本中全局状态的哈希的生成方法。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本说明书实施例可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本说明书实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本说明书实施例各个实施例或者实施例的某些部分所述的方法。
上述实施例阐明的系统、方法、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于方法实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的方法实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本说明书实施例方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本说明书实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本说明书实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本说明书实施例的保护范围。