一种基于增量桶的世界状态分片存储方法及装置与流程

文档序号:29360651发布日期:2022-03-23 01:21阅读:120来源:国知局
一种基于增量桶的世界状态分片存储方法及装置与流程

1.本发明属于计算机系统领域,涉及区块链技术,尤其涉及一种基于增量桶的世界状态分片存储方法及装置。


背景技术:

2.区块链技术,也被称之为分布式账本技术,区块链系统能安全地储存数据,其储存的信息不可伪造和篡改,区块链上的交易确认由区块链上的所有节点共同完成,并由共识算法保证其一致性。
3.世界状态是基于账户模型的区块链系统在交易执行完成后产生的状态信息总和,包含了区块链上所有账户以及智能合约的状态信息。因而,几乎所有的交易请求均会改变当前的世界状态。而每一个区块的交易执行后产生的世界状态又是下一区块的执行基础,即每个区块执行过程中均包含对当前世界状态的修改过程。
4.在基于账户模型的区块链系统中,节点之间除了保证交易内容和顺序的一致性之外,也要保证世界状态信息的一致性,以确保全部共识节点均已正确执行交易。将各节点同区块高度的世界状态哈希进行比对是目前一种较为高效的确保一致的方式。但由于世界状态树多是由默克尔桶树构成,而其具有计算代价高的缺点,因此,针对默克尔桶树进行的频繁哈希计算会极大地影响区块链系统的处理性能,同时 会带来严重的数据写放大现象。


技术实现要素:

5.本发明的目的在于针对现有技术的不足,提供一种基于增量桶的世界状态分片存储方法及装置,具有低单位存储量和高性能的优点。
6.本发明的目的是通过以下技术方案实现的:根据本说明书的第一方面,提供一种基于增量桶的世界状态分片存储方法,该方法包括:(1)设置世代划分方式,将链上区块数据根据所述世代划分方式分片成若干世代;每个世代均拥有一个布隆过滤器、一棵世界状态树以及对应的增量桶,每个世代采用增量存储方式存储数据;(2)当创建新世代时,区块链系统将当前世代的世界状态树全量复制到新世代,并创建对应的空增量桶及布隆过滤器,新世代中存储前一世代的世代编号作为索引依据,世代的遍历仅能从最新世代向前进行,将所创建的新世代设置为当前世代,完成世代更迭;(3)当存储新数据时,区块链系统根据已设置的世代划分方式判断是否更迭世代;之后计算新数据在当前世代中的增量桶位置,以及所述增量桶中的存储地址,将新数据存储至对应存储地址中,并同步更新该新数据所在增量桶的桶哈希值及整个世界状态树,同时更新当前世代的布隆过滤器;(4)当查询数据时,在当前世代中使用布隆过滤器进行数据过滤,若查询数据包含在当前世代内,则在当前世代内进行数据查询,并返回查询结果,若查询数据不包含在当前
世代内,则依次向前遍历各世代,直到检索到查询数据或所有世代均被遍历。
7.进一步地,所述世代划分方式包括:按照固定的区块间隔进行划分、按照固定的数据条数进行划分或者按照固定的数据容量进行划分。
8.进一步地,各世代仅存储其自身世代内接收的数据以及自创世以来至其自身世代结束时的世界状态树。
9.进一步地,各世代的布隆过滤器相互独立,且均能够持久化存储,通过布隆过滤器的设置,实现对其对应世代内数据的高效查询,提高世代间数据查询速度。
10.进一步地,当接收到新数据后,计算该新数据的哈希值,并与该新数据所在增量桶的桶哈希值进行异或计算,得到新的桶哈希值,之后同步更新整个世界状态树,保证全局状态的一致性。利用这种增量存储方式做到世代间数据的隔离,最大程度减小读写放大现象。同时,由于该存储方式,当前世代仅能读取到自身存储的数据,故本方法不支持数据的直接删除,仅支持通过更新实现的软删除操作。
11.进一步地,每个世代均完整存储了世界状态树以及增量桶的桶哈希值,并不存储完整的键值对。因此,本方法可在数据分离的情况下保证世界状态的易读性,同时存储了历史状态,方便日后维护时进行回滚。
12.进一步地,每个世代均拥有一个全局唯一的世代编号,并存储有前一世代的世代编号;遍历世代时,当前世代仅能访问到自身的前一世代,通过这种方式可确保遍历世代数据时能够获得最新的数据。
13.进一步地,若已根据世代划分方式计算得到查询数据所在世代的世代编号,则通过该世代编号可直接访问对应世代进行查询,同时兼顾性能与时效性。
14.进一步地,设置各世代的存储方式,使得不同世代能够存储至不同的存储介质中,并通过存储介质寻址算法访问对应的世代,实现世代间数据的物理隔离。例如,可设置最新的10个世代存储至高速存储介质中,之前的所有世代存储至高容量存储介质中,兼顾热点数据的查询速度以及存储的经济性。
15.进一步地,当查询某一数据时,本方法会优先选择当前世代进行查询,若发现查询数据且满足检索条件,则返回查询结果;若未发现查询数据或不满足检索条件,则根据当前世代内存储的前一世代的世代编号切换至前一世代;若仍未找到查询数据,则持续向前遍历,直到检索到满足检索条件的查询数据或遍历完所有世代;通过逐级向前的搜索方式优先检索热点数据。
16.进一步地,根据世代内数据总量上限,通过调整布隆过滤器校验哈希值的位数,将布隆过滤器的误报率控制在0.5%以下。
17.根据本说明书的第二方面,提供一种基于增量桶的世界状态分片存储装置,该装置包括以下模块:世代管理模块:该模块包括世代的设置及世代的更迭;所述世代的设置具体为:设置世代划分方式,将链上区块数据根据所述世代划分方式分片成若干世代;每个世代均拥有一个布隆过滤器、一棵世界状态树以及对应的增量桶,每个世代采用增量存储方式存储数据;所述世代的更迭具体为:当创建新世代时,区块链系统将当前世代的世界状态树全量复制到新世代,并创建对应的空增量桶及布隆过滤器,新世代中存储前一世代的世代
编号,世代的遍历仅能从最新世代向前进行,将所创建的新世代设置为当前世代,完成世代更迭;数据存储模块:该模块负责将数据以增量方式进行存储;当存储新数据时,区块链系统根据已设置的世代划分方式判断是否更迭世代;之后计算新数据在当前世代中的增量桶位置,以及所述增量桶中的存储地址,将新数据存储至对应存储地址中,并同步更新该新数据所在增量桶的桶哈希值及整个世界状态树,同时更新当前世代的布隆过滤器;数据查询模块:该模块负责对数据进行高效查询;当查询数据时,在当前世代中使用布隆过滤器进行数据过滤,若查询数据包含在当前世代内,则在当前世代内进行数据查询,并返回查询结果,若查询数据不包含在当前世代内,则依次向前遍历各世代,直到检索到查询数据或所有世代均被遍历。
18.根据本说明书的第三方面,提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现如第一方面所述的基于增量桶的世界状态分片存储方法的步骤。
19.根据本说明书的第四方面,提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现如第一方面所述的基于增量桶的世界状态分片存储方法的步骤。
20.本发明的有益效果是:本发明将链上区块数据分片成若干世代,每个世代均完整存储了世界状态树以及增量桶的桶哈希值,并不存储完整的键值对,因此本发明可在数据分离的情况下保证世界状态的易读性,同时存储了历史状态,方便日后维护时进行回滚。本发明中各世代的布隆过滤器相互独立,且均能够持久化存储,通过布隆过滤器的设置,实现对其对应世代内数据的高效查询,提高世代间数据查询速度。本发明通过增量存储方式可以有效分散存储压力,还可以将热点数据富集至较新的世代中,在降低数据检索压力的同时,提高热点数据的查询效率。
附图说明
21.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
22.图1是一示例性实施例提供的基于增量桶的世界状态分片存储方法流程图;图2是一示例性实施例提供的数据存储及数据查询流程图;图3是一示例性实施例提供的世代内结构示意图;图4是一示例性实施例提供的各世代连接方式示意图;图5是一示例性实施例提供的数据查询流程图;图6是一示例性实施例提供的基于增量桶的世界状态分片存储装置结构图。
23.图7是一示例性实施例提供的世代存储示意图;图8是一示例性实施例提供的世代更迭流程图。
具体实施方式
24.为了更好的理解本技术的技术方案,下面结合附图对本技术实施例进行详细描述。
25.应当明确,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本技术保护的范围。
26.在本技术实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本技术。在本技术实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。
27.本发明提供一种基于增量桶的世界状态分片存储方法,该方法将链上区块数据根据世代划分方式分片成若干世代,如图1所示,该方法主要包括世代管理、数据存储及数据查询三部分;世代管理部分主要负责世代的设置及世代的更迭、分发世代编号以及达到数据物理分隔的效果;数据存储部分主要负责世代内数据的增量存储,以及世界状态的实时更新;数据查询部分主要负责当前世代以及历史世代间的数据查询,利用世代内的独立布隆过滤器,可以达到快速检索数据的目的。以下详细描述各部分的详细实现流程。
28.一、世代管理(1)世代的设置:设置世代划分方式,将链上区块数据根据所述世代划分方式分片成若干世代;每个世代均拥有一个布隆过滤器、一棵世界状态树以及对应的增量桶,每个世代采用增量存储方式存储数据。
29.更为具体地,当区块链系统第一次启动时,可以通过区块链管理工具对世代的更迭依据即世代划分方式进行设置,该设置会被写入区块链系统的创世块中,在后续运行过程中不可更改。
30.世代划分方式可以采用但不限于以下三种方式:按照固定的区块间隔进行划分、按照固定的数据条数例如交易数量进行划分、按照固定的数据容量进行划分。
31.(2)世代的更迭:当创建新世代时,区块链系统将当前世代的世界状态树全量复制到新世代,并创建对应的空增量桶及布隆过滤器,新世代中存储前一世代的世代编号作为索引依据,世代的遍历仅能从最新世代向前进行,将所创建的新世代设置为当前世代,完成世代更迭。
32.更为具体地,当前使用的世代被称作当前世代,在区块链系统运行过程中,有且仅有一个当前世代,且当前世代必定为最新世代。当当前世代满足世代更迭条件时,生成一个新世代。
33.二、数据存储,如图2所示,包括:(1)当存储新数据时,例如区块链系统的共识模块提交区块数据时,区块链系统根据已设置的世代划分方式判断是否更迭世代;具体地,若需创建新世代,则先停止当前世代的数据接收,完成世代更迭后在新世代中继续接收数据。
34.(2)计算新数据在当前世代中的增量桶位置,以及所在增量桶中的存储地址,将新数据存储至对应存储地址中。世代内结构及存储原理如图3所示。
35.(3)同步更新该新数据所在增量桶的桶哈希值及整个世界状态树,同时更新当前世代的布隆过滤器;更新过程具体为:计算新数据的哈希值,并与该新数据所在增量桶的桶
哈希值进行异或计算,得到新的桶哈希值,之后同步更新整个世界状态树,保证全局状态的一致性。利用这种增量存储方式做到世代间数据的隔离,最大程度减小读写放大现象。同时,由于该存储方式,当前世代仅能读取到自身存储的数据,故本方法不支持数据的直接删除,仅支持通过更新实现的软删除操作。
36.更为具体地,各世代仅存储其自身世代内接收的数据以及自创世以来至其自身世代结束时的世界状态树。世代间可以通过一个front标识进行连接,该front标识存储前一世代的世代编号。世代间连接方式如图4所示。
37.更为具体地,每个世代均完整存储了世界状态树以及增量桶的桶哈希值,并不存储完整的键值对。因此,本方法可在数据分离的情况下保证世界状态的易读性,同时存储了历史状态,方便日后维护时进行回滚。
38.三、数据查询,如图2、5所示,包括:(1)当查询数据时,优先在当前世代中使用布隆过滤器进行数据过滤,若查询数据包含在当前世代内,则在当前世代内进行数据查询,并返回查询结果,若查询数据不包含在当前世代内,则依次向前遍历各世代,当前世代之前的各世代均为历史世代,在遍历的世代中,重新进行布隆过滤器的数据过滤流程,直到检索到查询数据或所有世代均被遍历。
39.更为具体地,每个世代均拥有一个全局唯一的世代编号,并存储有前一世代的世代编号;遍历世代时,当前世代仅能访问到自身的前一世代,通过这种方式可确保遍历世代数据时能够获得最新的数据。
40.(2)各世代的布隆过滤器相互独立,且均能够持久化存储,通过布隆过滤器的设置,实现对其对应世代内数据的高效查询,提高世代间数据查询速度。
41.在一个实施例中,世界状态树为默克尔树,世代更迭时,新世代会复制旧世代的完整默克尔树,为减少存储数据量,仅复制前一世代的桶哈希值作为历史数据,不复制增量桶内数据,当新世代接收到新数据时,其会存储新数据,并在前一世代的桶哈希基础上进行桶哈希更新,最后对默克尔树进行更新。
42.在至少一个实施例中,若已根据世代划分方式计算得到查询数据所在世代的世代编号,则通过该世代编号可直接访问对应世代进行查询。若用户不能提供世代相关信息,则优先选择当前世代进行查询,若发现查询数据且满足检索条件,则返回查询结果;若未发现查询数据或不满足检索条件,则根据当前世代内存储的前一世代的世代编号切换至前一世代;若仍未找到查询数据,则持续向前遍历,直到检索到满足检索条件的查询数据或遍历完所有世代;通过逐级向前的搜索方式优先检索热点数据。
43.在至少一个实施例中,设置各世代的存储方式,使得不同世代能够存储至不同的存储介质中,并通过存储介质寻址算法访问对应的世代,实现世代间数据的物理隔离,保证整个世代数据库的独立性与可扩展性。例如,可设置最新的10个世代存储至高速存储介质中,之前的所有世代存储至高容量存储介质中,兼顾热点数据的查询速度以及存储的经济性。
44.在至少一个实施例中,每个世代均拥有一个独立的可持久化布隆过滤器,当检索该世代内数据时,优先使用布隆过滤器进行数据过滤。又由于世代内数据总量存在理论上限,故可事先通过调整布隆过滤器校验哈希值的位数,将布隆过滤器的误报率控制在一个较低的水平,例如0.5%以下,进一步提高检索效率。
45.与前述基于增量桶的世界状态分片存储方法的实施例相对应,本发明还提供了基于增量桶的世界状态分片存储装置的实施例。如图6所示,基于增量桶的世界状态分片存储装置包括以下模块:世代管理模块:该模块包括世代的设置及世代的更迭;所述世代的设置具体为:设置世代划分方式,将链上区块数据根据所述世代划分方式分片成若干世代;每个世代均拥有一个布隆过滤器、一棵世界状态树以及对应的增量桶,每个世代采用增量存储方式存储数据;所述世代的更迭具体为:当创建新世代时,区块链系统将当前世代的世界状态树全量复制到新世代,并创建对应的空增量桶及布隆过滤器,新世代中存储前一世代的世代编号作为索引依据,世代的遍历仅能从最新世代向前进行,将所创建的新世代设置为当前世代,完成世代更迭;数据存储模块:该模块负责将数据以增量方式进行存储;当存储新数据时,区块链系统根据已设置的世代划分方式判断是否更迭世代;之后计算新数据在当前世代中的增量桶位置,以及所述增量桶中的存储地址,将新数据存储至对应存储地址中,并同步更新该新数据所在增量桶的桶哈希值及整个世界状态树;数据查询模块:该模块负责对数据进行高效查询;当查询数据时,在当前世代中使用布隆过滤器进行数据过滤,若查询数据包含在当前世代内,则在当前世代内进行数据查询,并返回查询结果,若查询数据不包含在当前世代内,则依次向前遍历各世代,直到检索到查询数据或所有世代均被遍历。通过布隆过滤器加速世代内的查询速度,通过逐级向前的搜索方式优先检索热点数据在一个实施例中,世代管理模块还负责世代编号的控制,当世代内容量到达极限时,生成一个全局唯一的世代编号并新建世代。进一步地,世代管理模块还会记录每个世代的存储位置以及对应存储介质的访问方式,故可实现各世代数据的物理隔离,甚至可实现世代数据在不同物理机上的存储,如图7所示。又由于各世代间不存在直接的联系,仅通过各自世代编号进行连接,故可非常方便地实现存储介质的动态调整。
46.以用户上传一笔交易为例,按照固定的区块间隔进行世代划分,交易上传后触发世代更迭机制,并在上传完成后查询一笔历史交易信息,其具体运作方式如下:(1)如图8所示,世代管理模块比对当前世代容量cn以及预定义的容量上限c,若当前世代容量cn超过容量上限c,则进入世代更迭模式。在该模式下,世代管理模块首先暂停当前世代的数据写入,并获取当前世代的世代编号kn,再根据令牌生成算法,由kn得到新世代的全局唯一世代编号k
n+1
,并创建新世代。新世代创建完成后,将当前世代中的世界状态树全量复制到新世代中;记录当前世代的区块范围;在新世代中创建布隆过滤器;并将当前世代的世代编号由kn转变为k
n+1
以完成世代的更迭。
47.(2)当前世代接收到一笔新交易时,首先将该交易进行哈希散列计算,得到其对应的增量桶p以及增量桶p中的存储地址,之后将该交易的键值对存储至增量桶p的对应存储地址中;交易入桶后,数据存储模块重新计算该交易的哈希值h1,之后将哈希值h1与该增量桶的桶哈希值h`进行异或计算,得到最新的桶哈希值h并更新,之后从该增量桶所在的子节点开始逐级向上更新整个世界状态树,世界状态树更新完成后,更新当前世代的布隆过滤器。
48.(3)当用户需要查询某一数据时,若已根据世代划分方式计算得到查询数据所在世代的世代编号kf,则通过世代编号kf可直接访问对应世代进行查询;若用户不能提供世代相关信息,则直接访问世代管理模块获取当前世代的世代编号kn,之后进入该世代进行查询,若未查询到相关信息,则由当前世代获取前一世代的世代编号k
n-1
,并重复以上过程直到检索到查询数据或所有世代均被遍历。
49.由于布隆过滤器的存在,查询数据的速度大大提升,又由于世代内数据总量存在理论上限,故可事先通过调整布隆过滤器校验哈希值的位数,将布隆过滤器的误报率控制在一个较低的水平,进一步提高检索效率。同时,由于本方法单个世代仅能访问本世代数据,因此无法完成对之前世代数据的删除操作,仅支持对数据的软删除。故无论对数据做出何种操作,数据均会出现在当前世代。这就间接导致在本方法中,热点数据会自然富集至较新世代,冷数据自然沉淀至较旧世代,在提高访问效率的同时还可节省一般存储模式区分冷热数据的额外开销。
50.特别地,若世代管理模块设置了存储均衡机制,则在世代更迭时,除生成新世代n外,还会将n-x(x为预先设置的热点世代阈值)号世代从区块链系统所在文件夹(或盘符)移动至预定义的存储介质中,作为冷世代被存储,冷世代依旧可以被区块链系统访问。当存储空间不足时,仅需要增加冷世代存储空间即可,该过程并不会影响整个区块链系统的运行状态,该过程之后生成的冷世代将存储至新增的存储空间当中。
51.在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述实施例中基于增量桶的世界状态分片存储方法的步骤。
52.所述处理器可以是中央处理单元(central processing unit,cpu),还可以是其他通用处理器、数字信号处理器 (digital signal processor,dsp)、专用集成电路 (application specific integrated circuit,asic)、现成可编程门阵列 (field-programmable gate array,fpga) 或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述计算机装置的控制中心,利用各种接口和线路连接整个计算机装置的各个部分。
53.所述存储器可用于存储所述计算机程序和/或模块,所述处理器通过运行或执行存储在所述存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现所述计算机装置的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、视频数据等)等。
54.所述存储器可以集成在所述处理器中,也可以与所述处理器分开设置。
55.在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述实施例中基于增量桶的世界状态分片存储方法的步骤。
56.本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本技术所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可
包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink) dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。
57.还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
58.上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
59.在本说明书一个或多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
60.应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
61.以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1