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

一种面向联盟链交易数据的无索引分片存储方法

文献发布时间:2024-04-18 19:52:40


一种面向联盟链交易数据的无索引分片存储方法

技术领域

本发明属于区块链技术领域,涉及一种交易数据无索引分片存储方法,具体涉及一种面向联盟链交易数据的无索引快速读写分片存储方法。

背景技术

区块链是一种分布式数字账本,具有去中心化、可追溯、不可篡改等特性。为了保证其可追溯、不可篡改的特性,区块链中的每个节点都需要记录所有的交易数据和其交易验证MPT树。联盟链环境下,系统的吞吐量更大,每秒产生的交易量更大,庞大的交易量以及交易数据的全复制存储,导致交易数据的总量非常庞大,也使得整个系统的存储可扩展性受到限制。

对交易数据进行分片存储是解决交易数据存储开销高这一问题的有效思路。同时,区块链系统中通常通过交易的哈希对交易进行查询,目前通过交易哈希查询交易的方法主要分为以下两种;(1)按照区块编号从大到小的顺序对区块内的交易进行查询,为了提高查询的速度,为每个区块设置一个布隆过滤器来加速查找;(2)额外设置一个<交易哈希,区块号>的映射表来快速定位交易哈希对应的交易所在的区块编号。上述两种解决方法都存在缺陷。使用第一种方法,在查找编号较小的区块中的交易时读延迟较高,这是因为节点需要按区块号从大到小遍历所有的区块直到找到存储该交易的区块,如果布隆过滤器存在假阳性,读延迟会更高。使用第二种方法,需要存储每一笔交易的哈希值到其所在区块的编号的映射,随着交易数量的增加,这种方法带来的索引存储开销线性增长。而获取到交易对应的区块编号后,实际读取交易数据时,需要读取交易MPT树的节点来生成交易数据的验证信息,这也将带来多次额外的磁盘读取开销。

发明内容

为了解决现有技术存在的问题,本发明提供了一种面向联盟链的交易数据无索引快速读写分片存储方法,能够缓解联盟链中节点的存储压力、提升交易数据读取的效率。通过将交易树的验证功能和数据索引功能解耦,实现了交易的无索引快速读取和交易数据的存储分片,提高了交易的读取效率。其中,提供了一种适用于交易数据存储分片的可验证数据结构,降低了交易数据、交易索引的存储开销和验证信息的大小。

本发明以降低联盟链交易数据和交易索引的存储开销以及提高交易查询速度为目标,针对现有技术的缺陷,提出一种面向联盟链的交易数据无索引快速读写分片存储方法。其中提出的适用于交易数据存储分片的可验证数据结构——无索引交易树(ITT,Indexless Transaction Tree)。ITT是一个向量承诺(VC)和哈希混合的可验证交易树,其中包含以下4种节点。

VC节点:VC节点逻辑上是一个特定大小的VC数组,当VC节点作为ITT的根节点时,VC数组大小与存储编码数据块的节点数量一致,当VC节点为ITT的中间节点时,VC数组大小由ITT的构造参数指定。在整个ITT数据结构中,至少会有一个VC节点,即ITT的根节点。VC节点数组的每个位置可以映射到一个数据节点或空节点或默克尔节点。VC是一个和累加器很相似的密码学原语,它提供了和累加器类似的功能,但是VC除了能够证明一个元素在一个集合中,还提供了位置绑定的功能,即它能证明一个元素存在于一个有序集合中且存在于有序集合中某一个确定位置。关于VC的操作,如生成承诺、生成位置证明、更新证明等,都可以在多项式时间复杂度内完成。

默克尔节点:子默克尔树中的节点,可以容纳m个数据,m的大小可以通过实际分配大盘的交易大小动态调整,其中默克尔节点的每一个数据可以映射为VC节点或默克尔节点或数据节点或空节点。

数据节点:保存交易哈希以及交易对应的数据内容,其中的数据内容编码为h|d,h为该交易所在区块的高度,d为交易的实际数据。

空节点:没有存储任何数据的节点,当VC数组或默克尔节点的某一位置没有对应的映射数据时,被默认指向一个空节点。

本发明中ITT的结构示例如图1所示,ITT的根节点是一个VC节点,VC根节点数组的大小取决于参与当前区块中交易数据分片的节点个数,VC根节点数组的每个位置映射到一棵子默克尔树,如图1中默克尔节点1及其孩子节点(例如默克尔节点4、默克尔节点5)组成一棵子默克尔树。由VC根节点数组构造的承诺C会被写入区块头的交易根中,作为当前区块所有交易的验证承诺。VC根节点数组映射到的每个子默克尔树包含分片后存储在同一个节点上的交易数据的集合。子默克尔树中包含四种节点,默克尔节点,VC节点,数据节点和空节点,其中VC节点和默克尔节点在逻辑上用于验证数据节点的正确性,可以根据区块中实际的交易规模将默克尔节点替换为VC节点。当一个区块中交易的规模过大时,分配到每个子默克尔树上的交易数量也会增加,如果全部采用默克尔节点作为子默克尔树的节点,会导致子默克尔树的高度过高,进而导致交易的验证信息过大。此时,可以将多个默克尔节点合并为一个VC节点,降低交易验证信息的大小。

本发明提出了一种面向联盟链交易数据的无索引分片存储方法,该方法可细分为交易编码存储方法和交易读取和验证方法,其中交易编码存储方法具体包括以下步骤:

为了保证分片存储后数据的可用性,需要对ITT中的每个默克尔子树进行纠删码编码存储,纠删码目前主流的编码结构有里德所罗门(RS)编码,局部可恢复编码(LRC)和可再生编码(RC)等。本发明使用里德所罗门编码对默克尔子树中的交易数据进行编码存储分片,采用的编码模式为RS(n,k),其中k为数据块的数量,也是ITT中默克尔子树的数量,n为编码后的编码块的数量,其中(n-k)个为编生成的冗余块,编码块中任意(n-k)个块丢失都可以通过幸存的k个块恢复。k个默克尔子树的交易数据构成的k个数据块作为RS编码的输入,通过伽罗瓦有限域(Galois finite field)的线性计算生成额外的(n-k)个冗余块。编码完成后,将n个编码块分别存储到n个节点上,保证在系统中不多于(n-k)个节点发生故障时不会影响数据的可用性。

步骤1:将VC根节点RootNode的大小设置为k,参与当前区块共识的n个节点中的k个节点将存储编码后的数据块,剩余的n-k个将存储编码生成的校验块;

步骤2:将一个区块共识后的交易根据一定的划分规则(划分规则可以按实际情况进行选择设定,如按照交易哈希的前四位)划分到不同的交易集合s

步骤3:对于划分好的每个交易集合,并行地构造子默克尔树集合T

步骤4:将子默克尔树的根哈希合并到RootNode中;

步骤5:计算以RootNode为根的整棵交易树的VC证明,将其作为区块头中的交易根;

步骤6:对子默克尔树集合T

其中步骤3中构造子默克尔树的过程进一步包括以下步骤:

步骤3-1:根据每个默克尔节点所能容纳数据量、子交易集合,计算完全由默克尔节点构成的子默克尔树的高度;

步骤3-2:根据VC承诺、证明的大小,计算转换阈值H的大小;

步骤3-3:如果子默克尔树高度小于转换阈值,则采用默克尔节点作为ITT叶子节点的父节点,否则将VC节点作为ITT叶子节点的父节点;

步骤3-4:根据上述步骤得出的中间节点,根据默克尔节点所能容纳的数据量自底向上地创建默克尔节点,构建子默克尔树。

步骤3-2中转换阈值H的计算方法如下:

对于容量为m的默克尔节点和承诺大小为z

本发明交易读取和验证方法具体包括以下步骤:

步骤a:任何节点收到对某笔交易的请求,根据交易的哈希得到存储该交易的区块链节点地址,向对应节点请求该交易;

步骤b:存储此笔交易的节点将交易哈希作为键从数据库中读取对应存储的数据内容;

步骤c:根据读取到的交易所在区块号,读取对应区块的子默克尔树下所有交易的哈希;

步骤d:自底向上迭代计算,得到目标交易的证明路径,构造完整的交易验证信息发送给请求者;

步骤e:请求者得到交易数据及其验证信息后,按照交易的证明路径,自底向上地迭代计算,用本地存储的区块头中的交易根对计算得到的子默克尔树根进行VC验证,如果成功返回交易内容,否则返回空值。

由于设计了的分层结构,因此在对交易数据进行存储分片时,属于某一个子默克尔树的交易会被划分给一个区块链节点,从而使得区块链节点可以在本地生成子默克尔树中的交易验证所需的验证信息,相比于MPT中划分在同一节点中的交易可能不在同一默克尔子树中随机交易划分方法,可以减少多次网络通信,从而减少交易信息构造的时间,降低交易读取的延迟。

本发明有益的效果包括:本发明通过建立无索引交易树降低了验证信息的大小,一次查询返回的MPT索引大小是ITT索引大小的1.5-1.8倍,减少了数据分片场景下交易数据读取所需的节点交互次数,通过对交易数据内容的编码,实现了交易的无索引读取,提高了交易的访问效率,减少了索引的存储开销,ITT相比MPT减少了10%-20%的存储开销。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图做简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明无索引交易树的结构示意图。

图2为本发明实施例1区块中的交易集合示意图。

图3为本发明实施例1交易编码存储的过程示意图

图4为本发明实施例2交易的读取和验证过程示意图

图5为本发明实施例2交易验证详细过程示意图

具体实施方法

结合以下具体实施例和附图,对本发明进一步详细说明。实施本发明的过程、条件、实验方法等,除以下专门提及的内容之外,均为本领域的普遍知识和公知常识,本发明没有特别限制内容。

本发明公开了一种面向联盟链的交易数据无索引快速读写分片存储方法。本发明通过将交易树的验证功能和数据索引功能解耦,实现了交易的无索引快速读取和交易数据的存储分片,提高了交易的读取效率。对于交易验证功能,本发明提出了适用于交易数据存储分片的可验证数据结构——无索引交易树,降低了验证信息的大小,减少了数据分片场景下交易数据读取所需的节点交互次数。对于交易索引功能,本发明提出了一种新型的交易数据内容编码方法,实现了交易的无索引读取,提高了交易的访问效率,减少了索引的存储开销。

本发明提出的面向联盟链的交易数据无索引快速读写分片存储方法中的交易编码存储方法如下方算法1所示:

包括以下具体步骤:

步骤1:将VC根节点RootNode的大小设置为k,参与当前区块共识的|N|个节点中的k个节点将存储编码后的数据块,剩余的|N|-k个将存储编码生成的校验块(算法1第1行);

步骤2:将一个区块共识后的交易集合T根据一定的划分规则(如按照交易哈希的前四位)划分到不同的子交易集合s

步骤3:对于划分好的每个交易集合s

步骤4:将子默克尔树的根哈希合并到RootNode中(算法1第7行);

步骤5:计算以RootNode为根的整棵交易树的VC证明(算法1第8行);

步骤6:对子默克尔树集合subMT

步骤7:返回交易树的VC证明作为区块头中的交易根(算法1第14行)。

步骤3中,构造子默克尔树的方法如下述算法2所示:

包括以下具体步骤:

步骤3-1:根据每个默克尔节点所能容纳数据量m、子交易集合s,计算完全由默克尔节点构成的子默克尔树的高度

步骤3-2:根据承诺大小z

步骤3-3:如果h

步骤3-4:将merkleNodeSet中的节点作为底层节点,为merkleNodeSet中的每m个节点构造一个上层默克尔节点,放入一个newmerkleNodeSet中,直到该层的merkleNodeSet为空,把newmerkleNodeSet作为新的merkleNodeSet,继续为其构造上层节点,直到merkleNodeSet中只剩一个节点(算法2第20-28行);

步骤3-5:merkleNodeSet中最后剩下的一个节点即为子默克尔树的数根(算法2第29行)。

本发明提出的面向联盟链的交易数据无索引快速读写分片存储方法中的交易读取和验证方法包含多个节点的交互,下方代码将节点间的交互省去,只考虑计算过程如下方算法3所示:

包括以下具体步骤:

步骤1:节点收到对某笔交易的请求hash,根据交易的哈希得到存储该交易的区块链节点地址addr(算法3第1行),向对应节点请求该交易;

步骤2:存储此笔交易的节点将交易哈希作为key从数据库中读取对应存储的数据内容h|c,其中c为交易内容,h为交易所在的区块号(算法3第2行);

步骤3:根据读取到的交易所在区块号h,读取对应的子默克尔树下所有交易的哈希HashSet(算法3第3行);

步骤4:自底向上迭代计算,得到目标交易的证明路径proofPath(算法3第5-10行),构造完整的交易验证信息发送给请求者;

步骤5:请求者得到交易数据及其验证信息后,按照交易的证明路径,自底向上地迭代计算,用本地存储的区块头中的交易根txRoot对计算得到的子默克尔树根r进行VC验证,如果成功返回交易内容c,否则返回一个空值NULL(算法3第12-17行)。

实施例1

本实施例是对交易编码存储的方法。

给定当前区块高度h=64,交易集合T={t1,t2,…,t6},参与当前区块共识的节点列表N={n1,n2,n3,n4},编码后数据块数量k=2,每个默克尔节点可以容纳的数据量m=2,VC节点证明、承诺的大小z=64。

如图2所示,为交易的集合T。

如图3所示。①创建大小为k的VC节点RootNode;②将交易列表按照一定的划分规则划分为k=2份;③对于划分好的交易集合,并行地自底向上地构造子默克尔树集合;④将子默克尔树的根哈希合并到RootNode中;⑤对子默克尔树的集合进行纠删码编码并存储;⑥计算RootNode的证明,作为区块头中的交易根。

实施例2

本实施例是对交易读取和验证的方法。

如图4所示。①节点1收到对交易哈希为a92445的交易的请求req:a92445;②节点1根据交易哈希a92445获取存储该交易的区块链节点地址addr,对应于节点0;③节点1将交易读取请求req:a92445转发给节点0;④节点0根据交易哈希a92445获取存储该交易的区块链节点地址addr,发现addr对应本节点地址;⑤节点0从本地数据库中读取交易哈希a92445对应的数据内容64|b82c…,其中64为交易所在的区块的高度,b82c…为交易内容;⑥节点0获取高度为64的所有交易的哈希,并自底向上计算证明路径;⑦节点0将证明路径和交易内容发送给节点1;⑧节点1按照证明路径计算得到子默克尔树的根r,并用本地存储的交易根对r进行验证;⑨将交易内容返回给请求用户。

上述步骤⑧中节点1验证证明路径的具体步骤如图5所示。①节点1根据节点0返回的交易哈希a92445和相关叶子节点交易哈希h0计算ITT中这些交易叶子节点的父节点哈希h1;②用节点0返回的证明路径中与h1同层的中间节点哈希h2计算父节点的哈希h3;③利用RootNode的VC特性,验证节点0返回的证明路径计算出的子默克尔树的根哈希h3与本地存储的对应默克尔根哈希相符。

本发明的保护内容不局限于以上实施例。在不背离发明构思的精神和范围下,本领域技术人员能够想到的变化和优点都被包括在本发明中,并且以所附的权利要求书为保护范围。

相关技术
  • 内爆增压环境下爆炸物威力场的仿真验证方法和装置
  • SOC仿真验证及SOC的仿真验证设备验证环境搭建方法
技术分类

06120116331382