System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind()
【技术实现步骤摘要】
本申请涉及区块链,尤其涉及一种状态树数据缓存方法、装置、电子设备和计算机程序产品。
技术介绍
1、目前,区块链系统通常会使用状态树作为存储账户和合约状态的数据结构,例如mpt(merkle patricia tree)状态树和jmt(jellyfish merkle tree)状态树等,执行区块交易获得的状态变更数据最终会应用到状态树的结构中,并持久化存储在区块链账本,这个过程需要从账本读取上一个区块对应的状态树中的大量节点数据,对磁盘的读写压力很大。针对该问题,现有技术一般使用通用的本地缓存将部分状态树的节点数据缓存到内存里,这样不必每次读取节点数据都直接从磁盘读取,既能缓解磁盘的读写压力,也能提高状态树数据的读取速度。然而,通用缓存大多是基于哈希分桶配合环形数组的底层数据结构来构造的,其寻址复杂度较高,在读取状态树数据时需要执行较多次数的寻址操作。
技术实现思路
1、有鉴于此,本申请实施例提供了一种状态树数据缓存方法、装置、电子设备和计算机程序产品,通过提出一种新的状态树缓存数据结构,能够降低寻址复杂度,减少读取状态树数据的寻址次数。
2、本申请实施例的第一方面提供了一种状态树数据缓存方法,包括:
3、获取待缓存的状态树数据,状态树数据包括若干个中间节点和若干个叶子节点;
4、将每个中间节点的头部信息缓存至第一缓存数组,头部信息包括对应中间节点的父节点索引和对应中间节点的每个子节点的第一子节点索引;
5、将每个中间节点的每个子节点
6、将每个叶子节点的状态数据信息缓存至第三缓存数组;
7、其中,父节点索引用于表示对应中间节点为根节点,或者用于表示对应中间节点的父节点的头部信息在第一缓存数组中的存储位置;第一子节点索引用于表示对应中间节点的对应子节点的孩子信息在第二缓存数组中的存储位置;第二子节点索引用于表示类型为叶子节点的对应子节点的状态数据信息在第三缓存数组中的存储位置,或者用于表示类型为中间节点的对应子节点的头部信息在第一缓存数组中的存储位置。
8、本申请实施例提出一种新的状态树缓存数据结构,该状态树缓存数据结构主要包括3个缓存数组,其中的第一缓存数组用于缓存中间节点的头部信息,第二缓存数组用于缓存中间节点的孩子信息,第三缓存数组用于缓存叶子节点的状态数据信息。在获取到待缓存的状态树数据后,会将状态树数据的每个中间节点的头部信息缓存至第一缓存数组,将状态树数据的每个中间节点的每个子节点的孩子信息缓存至第二缓存数组,以及将状态树数据的每个叶子节点的状态数据信息缓存至第三缓存数组。针对每个中间节点,利用其头部信息中的父节点索引和每个子节点的第一子节点索引,以及利用其每个子节点的孩子信息中的元信息和第二子节点索引,可以方便地通过各个缓存数组查找到与该中间节点连接的父节点和各个子节点的信息,从而准确地构建出状态树各个节点之间的逻辑关系。对于使用基于哈希分桶配合环形数组的通用缓存来说,假设状态树的节点数量为n,分桶数量为m,则其读取数据所需寻址次数的时间复杂度是o(n/m)。而如果使用本申请实施例提供的上述状态树缓存数据结构,其寻址方式与在状态树中遍历的方式一致,寻址复杂度大大降低,读取数据所需寻址次数的时间复杂度是o(logn),可见与通用缓存相比能够显著减少读取状态树数据的寻址次数。另外,上述状态树缓存数据结构使用长数组的方式做缓存,能够有效减少golang程序运行时的gc开销。
9、在本申请实施例的一种实现方式中,该方法还包括:
10、当接收到读取若干个叶子节点中的目标叶子节点的状态数据信息的请求时,从第一缓存数组中,读取根节点的头部信息作为当前头部信息;
11、根据前缀树的寻址原理和目标叶子节点的寻址路径,确定当前寻址位置;
12、从当前头部信息中,查找与当前寻址位置对应的目标子节点的第一子节点索引;
13、若查找到目标子节点的第一子节点索引,则根据目标子节点的第一子节点索引,从第二缓存数组中读取目标子节点的孩子信息;
14、若目标子节点为中间节点,则根据目标子节点的孩子信息的第二子节点索引,从第一缓存数组中读取目标子节点的头部信息,使用目标子节点的头部信息更新当前头部信息,并返回执行根据前缀树的寻址原理和目标叶子节点的寻址路径,确定当前寻址位置的步骤;
15、若目标子节点为叶子节点,则根据目标子节点的孩子信息的第二子节点索引,从第三缓存数组中读取目标子节点的状态数据信息,作为目标叶子节点的状态数据信息。
16、在本申请实施例的一种实现方式中,在从当前头部信息中,查找与当前寻址位置对应的目标子节点的第一子节点索引之后,还包括:
17、若查找不到目标子节点的第一子节点索引,则根据目标叶子节点的寻址路径,从磁盘中读取目标叶子节点的状态数据信息。
18、在本申请实施例的一种实现方式中,该方法还包括:
19、当接收到针对状态树数据的剪枝请求时,确定待删除节点;
20、若待删除节点为中间节点,则将第一缓存数组中缓存待删除节点的头部信息的存储位置标记为空闲;从待删除节点的头部信息中查找待删除节点的所有子节点的第一子节点索引,将第二缓存数组中与该所有子节点的第一子节点索引对应的存储位置均标记为空闲;从第一缓存数组中查找待删除节点的父节点的头部信息,从待删除节点的父节点的头部信息中查找待删除节点的第一子节点索引,将第二缓存数组中与待删除节点的第一子节点索引对应的存储位置标记为空闲,并将待删除节点的父节点的头部信息中待删除节点的第一子节点索引设置为指定数值;
21、若待删除节点为叶子节点,则将第三缓存数组中缓存待删除节点的状态数据信息的存储位置标记为空闲;从第一缓存数组中查找待删除节点的父节点的头部信息,从待删除节点的父节点的头部信息中查找待删除节点的第一子节点索引,将第二缓存数组中与待删除节点的第一子节点索引对应的存储位置标记为空闲,并将待删除节点的父节点的头部信息中待删除节点的第一子节点索引设置为指定数值。
22、在本申请实施例的一种实现方式中,该方法还包括:
23、当接收到针对状态树数据的更新请求时,确定待更新节点;
24、从状态树数据中查找与待更新节点的寻址路径相同的状态树节点;
25、若查找到状态树节点且待更新节点为中间节点,则根据待更新节点的头部信息,更新第一缓存数组中缓存的状态树节点的头部信息;根据待更新节点的所有子节点的孩子信息,确定各个待更新孩子信息和各个待新增孩子信息;根据各个待更新孩子信息,更新第二缓存数组已缓存的孩子信息,并将每个待新增孩子信息分别写入第二缓存数组的一个空闲存储位置;若待更新节点不是根节点,则从第一缓存数组中查找待更新节点的父节点的头部信息,并根据待更新节点的父节点的头部信息,从第二缓存数组中查找并更新与待更新节点对应的孩本文档来自技高网...
【技术保护点】
1.一种状态树数据缓存方法,其特征在于,包括:
2.如权利要求1所述的方法,其特征在于,还包括:
3.如权利要求2所述的方法,其特征在于,在所述从所述当前头部信息中,查找与所述当前寻址位置对应的目标子节点的第一子节点索引之后,还包括:
4.如权利要求1所述的方法,其特征在于,还包括:
5.如权利要求1所述的方法,其特征在于,还包括:
6.如权利要求5所述的方法,其特征在于,在所述从所述状态树数据中查找与所述待更新节点的寻址路径相同的状态树节点之后,还包括:
7.如权利要求1至6任一项所述的方法,其特征在于,所述第一缓存数组的各个存储位置的大小相同,所述第二缓存数组的各个存储位置的大小相同。
8.一种状态树数据缓存装置,其特征在于,包括:
9.一种电子设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至7任一项所述的状态树数据缓存方法。
10.一种计算机程序产品,其特征在于,当所述计算机
...【技术特征摘要】
1.一种状态树数据缓存方法,其特征在于,包括:
2.如权利要求1所述的方法,其特征在于,还包括:
3.如权利要求2所述的方法,其特征在于,在所述从所述当前头部信息中,查找与所述当前寻址位置对应的目标子节点的第一子节点索引之后,还包括:
4.如权利要求1所述的方法,其特征在于,还包括:
5.如权利要求1所述的方法,其特征在于,还包括:
6.如权利要求5所述的方法,其特征在于,在所述从所述状态树数据中查找与所述待更新节点的寻址路径相同的状态树节点之后,还包括:
7.如权利...
【专利技术属性】
技术研发人员:张启锐,黄伟,李若欣,姚文豪,韦懿杰,汪小益,
申请(专利权)人:杭州高新区滨江区块链与数据安全研究院,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。