一种基于索引的面向区块链轻客户端的范围查询可验证查询方法与流程

文档序号:17926367发布日期:2019-06-15 00:26阅读:311来源:国知局
一种基于索引的面向区块链轻客户端的范围查询可验证查询方法与流程

本发明属于区块链数据库技术领域,尤其涉及基于索引的面向区块链轻客户端的范围查询可验证查询方法。



背景技术:

全节点是拥有完整区块链账本的节点,负责验证以及转发网络上的交易和区块。由于无需信任的环境(开放的网络)以及区块链本身的性质,每个全节点都需要下载并验证所有的区块,因此所有区块中的所有交易信息都需要经过全节点的验证。然后,下载并验证所有区块信息会消耗大量的时间和资源。例如,完全同步以太坊区块链至少需要ssd(固态硬盘),因为hdd(机械硬盘)跟不上每秒的输入输出需求。轻客户端或者轻节点是一种连接全节点以实现与区块链的交互的软件,与全节点不同的是,轻客户端不需要不停的运行,也不需要向区块链中读取写入大量的信息,如用户所使用的手持设备,轻客户端通常只存储了区块头。实际上,轻客户端不需要直接与区块链交互,它们使用全节点作为中介,依赖全节点来实现许多操作。为了执行查询,轻客户端就需要查询存储了所有区块数据的不可信的节点。然而,这种查询下的结果可能并不正确,因此轻客户端就必须能够验证查询结果。

为了处理这种情况,比特币使用merkle哈希树(mht)提出了简单支付验证(spv),spv支持轻客户端的交易验证,可以确定某个特定的交易是否在区块中,spv节点只需下载区块头,而不用下载包含在每个区块中的交易信息。如果通过扫描所有的区块来查询数据,则重建被访问区块的mb-tree根可以方便地验证数据的正确性。但是,扫描的方法效率太低,例如,对于范围查询,所有的区块都要返回给轻客户端,以保证查询结果的完整性和完备性。而且,若一次范围查询涉及到的区块数量较多,则会造成很大的通信开销,导致查询效率低下,同时目前已有的区块链系统并不能实现丰富的可验证查询。所以为了支持区块链中的可验证索引,验证索引结构的提出是非常有必要的。以太坊提出了merklepatriciatree(mpt),其中每个区块都存储了一个可验证结构的快照。然而,树是非常大的,因为树中的每一个节点的变化都被记录下来了。而且,mpt仅支持账户状态的可验证查询。因此,有必要基于验证结构重新实现各种可验证查询。



技术实现要素:

本发明的目的是为了克服现有技术下全节点扫描区块效率低,全节点与轻客户端通信开销大的缺陷,以及解决在不可信的区块链网络中数据查询验证困难的问题,提出了一种基于索引的面向区块链轻客户端的范围查询可验证查询方法。

实现本发明目的的具体技术方案是:

一种基于索引的面向区块链轻客户端的范围查询可验证查询方法,根据全节点返回验证对象的不同本发明将全节点分为全节点和全节点,其特征在于,该方法包括以下具体步骤:

步骤s1:区块索引和层次索引结构生成

此步骤在关键字区块时间戳上构造一个区块层b+-tree索引结构,获取给定查询时间范围内包含有查询交易类型的区块范围;并对不同交易类型构造位图索引并对每一个区块在关键字交易id上构造merkleb-tree(mb-tree)索引,构造出一个由位图索引和mb-tree索引组成的层次索引结构;具体包括:

步骤a1:全节点在关键字区块时间戳上构造一个区块层b+-tree索引结构,用来获取给定查询时间范围内的区块id;

步骤a2:全节点首先对所有的交易数据按照交易类型划分,得到多个分类;然后为每一个分类创建一个位向量,即一行二进制串数据,每一行中的第i位二进制数据代表区块i中是否包含这种交易类型的数据,1代表包含,0代表不包含;若出现一种新的交易类型,则添加新的一行二进制串数据来记录此类型交易,所有交易类型的二进制数据共同组成了层次索引的第一层索引结构——位图索引;

步骤a3:全节点对每一个区块在关键字交易id上构造了一个mb-tree,mb-tree是b+树和merklehashtree(mht)的结合体,其中每一个叶子节点都含有本身的哈希值,每一个非叶子节点中都含有其孩子节点级联的哈希值,构成了层次索引的第二层索引结构——mb-tree索引;当一个新的区块生成后,全节点需要为该区块构建一个在关键字交易id上的mb-tree。

步骤s2:全节点进行数据可验证查询

此步骤中全节点根据区块层b+-tree索引结构和层次索引结构来处理轻客户端发送来的查询请求,并将表示当前区块链版本的区块高度h和查询生成的验证对象(verificationobject,vo)返回给轻客户端;具体包括:

步骤b1:全节点获取来自轻客户端的查询请求,获取表示当前区块链版本的区块高度h,并根据区块层b+-tree索引结构使用范围搜索获取给定查询时间范围内包内的区块范围;

步骤b2:全节点根据步骤b1中获取到的区块范围查询层次索引的第一层索引结构——位图索引;全节点根据查询请求中的交易类型查询位图索引中的对应行,并按位扫描该行中在区块范围内的所有二进制数据,若为0则跳过,若为1则将对应的区块id加入包含查询结果的一个区块集合;

步骤b3:全节点根据步骤b2中获取到的区块集合查询层次索引的第二层索引结构——mb-tree索引;对于在区块集合内的任意区块i,全节点将在该区块i的mb-tree上执行范围搜索来生成验证对象,并将其添加到vo中;

步骤b4:全节点将当前的区块高度h和查询生成的验证对象vo返回给轻客户端。

步骤s3:全节点进行辅助可验证查询

此步骤中全节点首先会根据接收到的区块高度h来判断自己当前区块链版本是否与全节点一致,若一致则会根据区块层b+-tree索引结构和层次索引结构来处理轻客户端发送来的查询请求,并将查询生成的辅助验证对象(auxiliaryverificationobject,avo)返回给轻客户端;否则,不进行操作而将返回给轻客户端;具体包括:

步骤c1:全节点获取来自轻客户端的查询请求和区块高度h,并根据接收到的区块高度h来判断自己当前区块链版本是否与全节点一致,若一致则进行步骤c2,否则进行步骤c6;

步骤c2:全节点根据区块层b+-tree索引结构使用范围搜索获取给定查询范围内包含有查询交易类型的区块范围;

步骤c3:全节点根据步骤c2中获取到的区块范围查询层次索引的第一层索引结构——位图索引;全节点根据查询请求中的交易类型查询位图索引中的对应行,并按位扫描该行中在区块范围内的所有二进制数据,若为0则跳过,若为1则将对应的区块id加入包含查询结果的一个区块集合;

步骤c4:全节点根据步骤c3中获取到的区块集合查询层次索引的第二层索引结构——mb-tree索引;对于在区块集合内的任意区块i,全节点将获取该区块i的mb-tree根rooti,并将区块idi和对应的rooti将添加到avo中;

步骤c5:全节点将查询生成的辅助验证对象avo返回给轻客户端;

步骤c6:全节点不进行操作而将返回给轻客户端。

步骤s4:轻客户端进行可验证查询

此步骤中轻客户端将根据vo和avo来验证查询结果的完备性和完整性,得到最终正确的查询结果;具体包括:

步骤d1:轻客户端获取步骤b4中返回的验证对象vo,以及步骤c5中返回的辅助验证对象avos;

步骤d2:对vo中的每一个区块i,轻客户端通过vo中的每一个区块的voi重新构建相应的mb-tree根,并将其与avo中包含的区块i对应的索引根进行对比来验证;

步骤d3:如果vo中所有的区块的验证结果都是正确的,则查询结果是正确的。

本发明克服了现有技术下全节点扫描区块效率低,全节点与轻客户端通信开销大的缺陷,以及解决了在不可信的区块链网络中数据查询验证困难的问题,实现了轻客户端的可信数据查询验证。

附图说明

图1显示的是本发明流程图;

图2显示的是一个区块结构示例图;

图3显示的是可验证查询的层次索引结构示例图;

图4显示的是全节点进性数据可验证查询示例图;

图5显示的是全节点进行辅助可验证查询示例图;

图6显示的是轻客户端进行可验证查询示例图。

具体实施方式

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

参阅图1,显示的是本方明的总体流程图。本发明包括区块索引和层次索引结构生成步骤、全节点进行数据可验证查询步骤、全节点进行辅助可验证查询步骤和轻客户端进行可验证查询步骤四个步骤。四个步骤的功能描述如下:

区块链系统中的数据都是存储在区块中的,随着时间的推移,区块数量会越来越多。如何快速的在所有区块中筛选出包含有特定交易数据的区块是一个迫切的需求,并且由于区块链网络中存在恶意节点,如何验证查询结果的正确性和完整性也是一个亟需解决的问题。

步骤s1实现了一个在关键字区块时间戳上的区块层b+-tree索引结构,可以获取给定查询时间范围内的区块范围;以及一个由位图索引和mb-tree索引组成的层次索引结构,实现了区块扫描时快速筛选所需区块的功能,并能快速获取某个区块中包含的指定查询条件的交易信息。

步骤s2全节点进行数据可验证查询实现了对轻客户端发送来的查询请求的处理,通过区块层b+-tree索引结构和层次索引结构快速扫描得到需要被查询的所有交易,并将表示当前区块链版本的区块高度h和查询生成的验证对象vo返回给轻客户端。

步骤s3全节点进行辅助可验证查询实现了对轻客户端发送来的查询请求的处理,首先全节点获取表示当前区块链版本的区块高度h,并判断其是否与接收到的区块高度h一致,若一致则通过区块层b+-tree索引结构和层次索引结构快速扫描得到需要被查询的所有交易,并将查询生成的辅助验证对象avo返回给轻客户端;否则,不进行操作而将返回给轻客户端。

步骤s4轻客户端进行可验证查询是根据收到的vo和avo来验证查询结果的完备性和完整性,并得到最终正确的查询结果。

本发明是基于上述构思提出的,关于上述步骤的具体实施过程做如下描述:

参阅图2,显示的是一个区块结构,区块链中的每一个区块都是由一个区块头和区块体组成。区块头中记录了一些有用的信息,其中包括记录了前一个区块的哈希值的prevhash,表示该区块的区块高度的blockheight,记录了区块打包时候的时间戳timestamp,指向该区块中所有交易的merkle树根的transroot,该区块打包的时候的签名signature,表示当前区块哈希值的blockhash。

区块体中包含了打包在此区块中的所有交易。每一个交易中都包含有多个条目,包括tid,ts,sig,id,tname和列。其中,tid是递增的整数,ts记录了交易发生的时间,sig保证了交易的补课篡改性,id记录了交易者的身份,即公钥,tname表示交易的一个类别的名称。图1中tid=2的交易就是一个有关交易的示例,这意味着org1在时间22:21,8-6-2018的时候将资金从教育项目转移到苍山学校。

为了更好地阐述本发明,以下所有具体实施方式都是以图2中的区块结构进行举例说明。

参阅图3,显示的是可验证查询的层次索引结构。为了获取给定时间范围内指定交易类型的全部区块,本发明构造了一个层次索引结构。层次索引结构的第一层是一个位图索引,全节点首先对所有的交易数据按照交易类型划分,得到多个分类;然后为每一个分类创建一个位向量,即一行二进制串数据,每一行中的第i位二进制数据代表区块i中是否包含这种交易类型的数据,1代表包含,0代表不包含;若出现一种新的交易类型,则添加新的一行二进制串数据来记录此类型交易。层次索引结构的第二层是一个在区块关键字交易id上构造的mb-tree,mb-tree是b+树和mht的结合体,其中每一个叶子节点都含有本身的哈希值,每一个非叶子节点中都含有其孩子节点级联的哈希值;当一个新的区块生成后,全节点需要为该区块构建一个在关键字交易id上的mb-tree。

参阅图4,显示的是全节点进行数据可验证查询。全节点利用区块层b+-tree索引结构获取查询时间范围内的区块id范围,首先获取来自轻客户端的在时间范围[6-7-2018,6-8-2018]中donate操作的所有交易的查询请求,然后利用区块层b+-tree索引结构使用范围搜索获取给定查询时间范围[6-7-2018,6-8-2018]内的所有区块范围(5,9)以及表示当前区块链版本信息的区块高度h。全节点利用层次索引结构获取验证对象vo,首先根据交易类型donate找到位图索引中对应的行,扫描该行中(5,9)位的二进制数据,若为0则跳过,若为1则将对应的区块id加入包含查询结果的一个区块集合,对于在区块集合内的任意区块i,全节点将在该区块i的mb-tree上执行范围搜索来生成验证对象,并将其添加到vo中。此处只有区块9满足条件,则查找区块9对应的mb-tree索引,并将区块id号9以及mb-tree查找满足条件的交易的过程中生成的验证信息加入验证对象vo中,即生成vo:(9,ha,t3,t1,t2,hc)。全节点将区块高度h和验证对象vo返回给轻客户端。具体过程如算法1所示。

参阅图5,显示的是全节点进行辅助可验证查询。全节点利用区块层b+-tree索引结构以及区块高度h获取查询时间范围内的区块id范围,首先获取来自轻客户端的在时间范围[6-7-2018,6-8-2018]中donate操作的所有交易的查询请求以及区块高度h:10,并根据h来判断自己当前区块链版本是否与全节点一致,若不一致则不进行操作而将返回给轻客户端,否则继续进行查询处理。然后利用区块层b+-tree索引结构使用范围搜索获取给定查询时间范围[6-7-2018,6-8-2018]内的所有区块范围(5,9)。全节点利用层次索引结构获取辅助验证对象avo,首先根据交易类型donate找到位图索引中对应的行,扫描该行中(5,9)位的二进制数据,若为0则跳过,若为1则将对应的区块id加入包含查询结果的一个区块集合,对于在区块集合内的任意区块i,全节点将获取该区块i的mb-tree根rooti,并将区块id号i和对应的rooti将添加到avo中。该处只有区块9满足条件,则查找区块9对应的mb-tree索引,并将区块id号9对应的root9将添加到avo中,即生成avo:(9,root9)。全节点将辅助验证对象avo返回给轻客户端。具体过程如算法2所示。

参阅图6,显示的是轻客户端进行可验证查询。为了执行一个可验证查询,轻客户端需要向一个随机选择的全节点发送查询请求并等待响应,获取区块高度h及验证对象vo。由于验证结构是保留在每一个区块上的,而查询结果是来自多个区块,轻客户端并不知道(a)查询结果中应该包含哪一个区块,以及(b)返回的结果是否正确和完整。因此,轻客户端需要查询另一个全节点以获得辅助验证对象(avo)。当在区块链网络中执行一致性共识算法时,由于网络延迟的不同每个节点上的数据状态也会不同,因此区块高度h的存在则是为了保证生成avo的数据集的版本与vo的版本一致。由于这个过程中并没有涉及到磁盘io,因此处理过程是轻量级的。当轻客户端收到avo的时候,它将会使用vo和avo来验证查询结果的完备性和完整性。

但是,全节点可能是不可信的,为了处理这种情况,轻客户端需要通过从多个全节点采样来降低风险。轻客户端把查询请求发送给一个全节点和另外的n-1个随机选择的全节点,并获取对应的vo和avos。查看获取到的avos,如果有多于m-1个响应中包含有相同的avo,并且每个avo中的区块id与vo中的相同,则将继续验证vo;否则,返回false。对于vo中每一个区块i的验证对象voi,轻客户端通过重新构建相应的mb-tree根并将其与avo中包含的索引根rooti进行对比来验证它。如果验证结果是正确的,轻客户端则将从block_set中将voi对应的区块移除。最后,如果即所有的验证对象voi都是正确的,则查询结果是正确的,返回true。具体过程如算法3所示。

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

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1