
面向信誉
‑
行为关联双区块链的可验证查询优化方法
技术领域
1.本发明涉及数据溯源和区块链技术领域,具体而言,本发明涉及一种面向信誉
‑
行为关联双区块链的可验证查询优化方法。
背景技术:2.区块链是所有区块单向连接的链表结构,在查询历史交易时需要对整个链表进行遍历,导致了查询时间偏高,具有较高的时间复杂度,仅支持以交易哈希为关键字等少数查询,在这种情况下,追踪溯源难以实现快速高效的查询,完全无法满足基本的查询需求。为了解决由于区块链链表结构造成的查询效率较低的问题,现有提高区块链系统查询性能的大多数是通过将区块数据复制到链下数据库的方式以提供更多查询服务,但区块数据追加存储方式极大增加了存储成本,必须在保证存储成本的基础上使查询服务满足应用中通过信誉索引用户行为轨迹等数据溯源需求。
3.信誉
‑
行为关联双区块链系统作为一个由互不信任的多方共同维护的分布式账本,该系统向外提供的数据查询服务必须满足查询结果集未被篡改且完整性可验证的要求,以保证查询数据真实可用。然而现有区块链仅支持简单的交易存在性证明,无法验证查询结果集的完整性。为了确保区块链数据库上查询的完整性,查询用户可以作为完整节点加入区块链网络。然后用户可以下载并验证整个数据,并在本地处理查询,而不影响查询的完整性。但是,维护整个数据的完整拷贝对普通用户来说可能是太昂贵的,因为它需要相当多的存储、计算和带宽资源。为了满足资源有限的查询用户,一个更吸引人的选择是将存储和查询服务委托给一个强大的完整节点,而查询用户只作为一个轻节点来接收结果。然而,如何确保查询结果的完整性仍然是一个挑战,因为完整的节点是不可信任的,而且这是区块链的一个内在假设。
4.因此,亟需一种基于信誉
‑
行为双区块链的高效率交易可验证查询优化技术,以提高关联双区块链系统的查询效率和验证效率。
技术实现要素:5.针对现有技术的不足,本发明提出一种面向信誉
‑
行为关联双区块链的可验证查询优化方法,该方法设计了基于跳转列表的块间索引结构、信誉链块内索引结构和验证索引结构、行为数据链块内索引结构和验证索引结构,同时引入树骨架方法形成写入高效的索引构建方法,以尽可能降低索引更新对双区块链写入性能的影响,和采用多关键字多样化查询方式,使关联双区块链具有丰富的查询类型、提高双区块链的查询效率和验证查询结果集完整性的效率。
6.为此,本发明提供了以下技术方案:
7.本发明提供了一种面向信誉
‑
行为关联双区块链的可验证查询优化方法,包括:
8.普通节点对边缘节点发出查询请求;所述边缘节点中构建有索引结构和验证索引结构,将所述索引结构的根结点哈希值和验证索引结构根存储在区块头中,随区块在全网
达成共识;其中,所述索引结构包括块间索引结构、信誉链块内索引结构和行为数据链块内索引结构,所述验证索引结构包括信誉链验证索引结构和行为数据链验证索引结构,所述块间索引是一个基于树骨架和跳转列表的mberkle树山脉索引结构;所述信誉链块内索引是一个面向多关键字查询的两层hmfberkle树;所述行为数据链块内索引是一个hmberkle树;
9.在收到查询请求后,边缘节点基于索引结构进行查询,得到查询结果集;并基于验证索引结构构造验证对象,将查询结果集和验证对象返回给普通节点;其中,基于块间索引结构进行查询包括:根据查询关键字判断是哪一种搜索码,与跳转列表根结点相比较,若大于,在当前最新mberkle树中查询;否则按照插值查询方法在跳转列表叶子结点中查询,找到指向对应mberkle树的指针,再在该索引中查询;以mberkle树根结点为起始点,顺次判断结点左右子树是否符合查询条件,若符合则往下查询,直至叶子结点,得到指向所查询区块的指针并获取相应区块,否则查询结束;基于信誉链块内索引进行查询包括:在该索引的顶层索引中查询时,以顶层索引根结点为起始结点,按照第一预定查询顺序从结点左右子树往下查询,直至查询到对应的底层索引根结点;在底层索引中查询时,以底层索引根结点为起始结点,按照第一预定查询顺序或第二预定查询顺序从结点左右子树往下查询;基于行为链块内索引进行查询包括:以根结点为起始结点,按照第一预定查询顺序或第三预定查询顺序从结点左右子树进行查询;
10.若查询的是行为数据交易且行为显示的是其哈希值,则向ipfs网络发送请求下载真实行为数据并验证是否一致;
11.普通节点根据验证对象以及存储在区块头中的验证索引结构根验证查询结果集的完整性。
12.进一步地,所述块间索引结构的构建包括:
13.预设分组大小n
block
,计算对应的叶子结点个数n
leaf
=n
block
和非叶子结点个数其中表示树骨架的高度,n
b
表示非叶子结点包含子结点的个数,根据树骨架中所有结点的数量,批量申请对应大小的结点数组,构建树骨架,为分组块间索引预分配一定的空间,构建树骨架的顺序为自左向右、自下而上;
14.当产生新区块且区块号为1时,触发块间索引更新,在第一个空闲叶子结点处存储搜索码值信息,即区块号、块内最后一个交易号和时间戳,及指向区块存储位置的指针和该结点的哈希值,并且树根结点存储指向该结点的指针;
15.再产生一个新区块时,将搜索码值等信息依次放置在非空闲叶子结点的右边结点,并向上递归更新,若将目前已装载的最高层结点不是根结点,树根结点存储指向最高层结点的指针;
16.当新区块的区块号为n
block
+1时,预设的块间索引已装载满,跳转列表需更新,即跳转列表的叶子结点中追加存储前一区块的搜索码值信息和指向分组块间索引的指针、更新根结点中最大搜索码值,并且重复上述步骤,创建新的分组块间索引和当该索引装载满时跳转列表更新。
17.进一步地,信誉链块内索引结构的构建包括:
18.在接收信誉交易的过程中,以某时间窗口进行切分,形成一个个连续的分片;当接
收到一个完整分片信誉交易后,在接收下一个分片信誉交易的同时,并行的对上一个分片按照被评价者进行分类,并使用一个线程对已分类的分片进行归并,等最后一个分片分类完成后,作最后一次归并使得信誉交易全部分类,并按分类进行排序;
19.使用多线程并行的对所有分类采用桶排序方法进行交易排序;
20.每当产生新区块,构建一个新的块内索引结构,其中块内索引结构是两层索引结构,分为底层结构和顶层结构;
21.根据上述分类排序后信誉交易子集个数,计算相应底层结构中所需的叶子结点个数和非叶子结点个数,根据所有结点的个数,批量申请对应大小的结点数组,构建树骨架,为底层索引预分配空间,树骨架构建顺序为自左向右、自下而上;
22.选取信誉值和评价方为搜索码值,使用多线程和以自下而上方式批量向各个底层索引装载,其中非叶子结点中存储lminrep和rmaxrep,lminrep表示左子树中信誉值最小值和rmaxrep表示右子树中信誉值最大值,并用二进制位代替直接存储评价方;初始化所有叶子结点的父结点的shbf有m位且都为0,并将hash1(eva)%m,...,hash
k/2
(eva)%m,hash1(eva)%m+o(eva),...,hash
k/2
(eva)%m+o(eva)置于1,其中eva表示该结点所含的任一评价方,k表示哈希函数个数,o(eva)表示偏移量,且其中和ω表示机器字节位数,索引中其他层结点的shbf大小依次2倍递增;
23.根据分类后的信誉交易集分类的个数,计算顶层结构中所需的叶子结点个数和非叶子结点个数,根据所有结点的个数,批量申请对应大小的结点数组,构建树骨架,为顶层索引预分配空间,树骨架构建顺序为自左向右、自下而上;
24.选取被评价方为搜索码值,每当一个底层索引构建完,向顶层树骨架的叶子结点中装载指向该索引的指针和被评价方,若出现两个高度相同山峰的峰顶结点则进行合并,直至顶层树骨架所有空间装满,即信誉链块内索引构建完,并将顶层索引根结点的哈希值放入区块头中。
25.进一步地,行为数据链块内索引结构的构建包括:
26.在接收行为数据交易的过程中,以某时间窗口进行切分,形成一个个连续的分片;当接收到一个完整分片行为数据交易后,在接收下一个分片数据交易的同时,并行的对上一个分片按照发送者进行分类,并使用一个线程对已分类的分片进行归并,等最后一个分片分类完成后,作最后一次归并使得行为数据交易全部分类,并按分类进行排序;
27.每当产生新行为数据区块,需构建一个新的块内索引结构;
28.根据分类后的行为数据交易集个数,计算树骨架中所需的叶子结点个数和非叶子结点个数,根据所有结点的个数,批量申请对应大小的结点数组,构建树骨架,为块内索引预分配空间,树骨架构建顺序为自左向右、自下而上;
29.选取行为数据交易号、发送者和接收者为搜索码值,采用自下而上方式向树骨架中装载,所述结构的非叶子结点中用二进制位替代直接存储发送者和接收者,且存放左右子树交易号最大值。
30.进一步地,信誉链验证索引结构的构建包括:
31.根据信誉交易集分类的个数n,初始化ohbf有mm位且都为0,其中,mm=10
·
n;
32.将ohbf分为k份,且使(mm
i
,mm
j
)=1,1≤i<j≤k,其中(mm
i
,mm
j
)表示mm
i
和mm
j
的最
大公约数,或mm
i
和mm
j
互为素数,并且
33.将所有底层结构的根结点哈希值分别通过以mm
i
为模进行取模运算,将ohbf上对应位置的二进制位置为1,全部完毕后将其放入区块头中。
34.进一步地,行为数据链验证索引结构的构建包括:
35.在行为数据链块内索引中选取中间层作为验证层,根据该验证层的结点个数,初始化ohbf有mm位且都为0;
36.将ohbf分为k份,且使(mm
i
,mm
j
)=1,1≤i<j≤k,其中(mm
i
,mm
j
)表示mm
i
和mm
j
的最大公约数,或mm
i
和mm
j
互为素数,并且
37.将验证层各结点哈希值分别通过以mm
i
为模进行取模运算,将ohbf的对应位置的二进制位置为1,全部完毕后将其放入区块头中。
38.进一步地,基于验证索引结构构造验证对象,包括:
39.将在块内索引中所查询到的叶子结点信息和其同一父结点的兄弟结点信息添加到验证对象中,再获取该结点的父结点,若该结点不处于验证层,则继续和其同一父结点的兄弟结点一起添加到验证对象中;若处于验证层,添加到验证对象中,验证对象构建完成。
40.进一步地,普通节点根据验证对象以及存储在区块头中的验证索引结构根验证查询结果集的完整性,包括:
41.根据验证对象重构到验证层的结点,将该结点的哈希值转换为二进制位,与区块头中的ohbf比较,若存在,则查询结果集完整,否则说明不完整,查询存在错误。
42.进一步地,所述索引结构还包括:跨链索引结构。
43.进一步地,所述跨链索引结构的构建包括:
44.在产生信誉新区块时使其记录当前最新行为区块的哈希值,基于哈希指针形成可追溯到行为区块的跨链结构。
45.本发明的优点和积极效果:
46.本发明提供了一种面向信誉
‑
行为关联双区块链的可验证查询优化办法,首先,因为普通用户的计算、存储等资源有限,所以引入边缘节点,双区块链完整信息存储在边缘节点层,普通用户只存储区块头信息。其次,为提高双区块链的查询性能和验证性能以满足在双区块链上数据溯源的需求,设计了基于跳转列表的块间索引结构、信誉链块内索引结构及验证数据结构、行为数据链块内索引结构及验证数据结构,以及基于树骨架的写入高效的索引构建方法和具备多关键字的查询方法。上述技术方案与现有技术相比,尽可能降低索引更新对双区块链写入性能的干扰、使双区块链具有丰富多样化的查询类型、提高双链的查询效率和验证查询结果集完整性的效率。
附图说明
47.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图做以简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
48.图1为本发明实施例中的一种基于关联双区块链的可验证查询优化的系统模型
图;
49.图2为本发明实施例中信誉链或行为数据链的块间索引结构示意图;
50.图3为本发明实施例中信誉链块内索引结构及验证索引结构的示意图;
51.图4为本发明实施例中行为数据链块内索引结构及验证索引结构的示意图;
52.图5为本发明实施例中以信誉值为关键字的单值查询性能和查询完整率随信誉相同个数变化的关系曲线图;
53.图6为本发明实施例中以信誉值为关键字的范围查询性能和查询完整率随信誉相同个数变化的关系曲线图;
54.图7为本发明实施例中单区块下离散属性的查询性能随区块内交易个数变化的关系曲线图;
55.图8为本发明实施例中以离散属性为关键字的块内索引中假阳性率随信誉交易个数或块内索引中叶子结点个数变化的关系曲线图;
56.图9为本发明实施例中以离散属性为关键字的索引中假阳性率随索引大小变化的关系曲线图;
57.图10为本发明实施例中索引所占用的存储大小随信誉区块内交易个数或索引叶子结点个数变化的关系曲线图;
58.图11为本发明实施例中区块查询时间随区块个数变化的关系曲线图;
59.图12为本发明实施例中追溯查询的查询时间随信誉区块个数变化的关系曲线图;
60.图13为本发明实施例中追溯查询的查询时间随查询结果规模变化的关系曲线图;
61.图14为本发明实施例中时间窗口查询的查询时间随时间窗口变化的关系曲线图;
62.图15为本发明实施例中在行为数据链中块内索引下多查询结果集的验证时间随查询结果集规模变化的关系曲线图。
具体实施方式
63.为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
64.参见图1,其示出了本发明实施例中一种关联双区块链系统中的可验证查询的系统模型。由于iiot(industrial internet of things,工业物联网)设备的存储资源和计算资源有限,本发明引入边缘节点层,以支持关联双区块链系统的存储、计算、查询等操作,构造出基于“用户
‑
边缘”两层关联双区块链模型,iiot设备都视为普通节点,只能将交易发送到边缘节点中,无权记录交易,可记录双区块链的区块头;边缘节点因为不同时期的不同职责,分为排序节点和全节点,具有查询功能,其中全节点存储所有区块数据,而排序节点负责打包交易和存储所有区块数据。在图1中,该系统模型中主要包括ipfs网络(interplanetary file system,星际文件系统)100、普通节点200以及全节点300,其中,全节点300可能不可信,构建写入高效的块间索引结构、块内索引结构和验证索引结构以提供高效可验证查询服务,将块内索引的根结点哈希值和验证索引结构根存储在区块头中,随
区块在全网达成共识。由于区块头已在全网达成共识,普通节点200可以根据存储在其中的可验证索引结构根验证查询结果。查询处理的流程为:首先,普通节点200对边缘节点300发出查询请求;其次,在收到查询请求后,边缘节点300基于索引结构进行查询,得到查询结果集,和基于可验证索引结构构造验证对象,将查询结果集和验证对象返回给普通节点200;接着,若查询的是行为数据交易且行为显示的是其哈希值,则向ipfs网络100发送请求下载真实行为数据并验证是否一致;最后,普通节点200根据验证对象以及存储在区块头中的可验证索引结构根来验证查询结果集的完整性。
65.面向信誉
‑
行为关联双区块链的可验证查询优化方法,分为以下步骤:
66.1.1查询语义添加
67.缺失查询语义会使得关联双区块链系统难以支持复杂查询,为了支持区块数据上的丰富查询,首先要添加查询语义。可从交易中选择具有辨识度的属性,如在信誉交易中的评价者、被评价者和信誉值,在行为数据交易中的发送者、接收者和交易序号。姓名字段的称为离散属性,数值字段的称为数值属性;也可从区块头中选取特定属性,如区块号,区块中最后一个交易号和区块的时间戳。
68.1.2查询定义
69.本发明实施例中存在三种查询方式:链上查询,即查询关联双区块链中存储的数据;链下查询,即查询存储在ipfs中的真实行为数据;链下链上联合查询,即需链上、链下查询。由于链下查询只需向ipfs网络请求即可下载行为数据,本发明主要面向链上查询。
70.链上查询分为三类,第一类是跨链查询,用于通过信誉回放行为,查看并验证存在异常的行为或信誉评估机制和尽可能阻止威胁发生;第二类是信誉链单链查询,用于根据历史信誉预测用户信誉等;第三类是行为数据链单链查询,用于根据历史行为进行价值分析等。
71.跨链查询,顾名思义,是指先在信誉链上查询,查询到某信誉区块或交易,获取区块或交易中的关联信息,基于哈希指针的跨链索引跨到行为数据链上,找相对应的行为区块或交易,分为以下查询类型:1.交易查询,用于交易存在性证明及关联性证明和通过信誉值查看对应行为;2.区块查询,用于补全区块或区块头和索引不可篡改验证;3.追溯查询,用于通过信誉值回放所有行为轨迹;4.时间窗口查询,用于查询特定时间段内行为轨迹。单链查询是在单条链上查询,所支持的查询类型和跨链查询一样,只是作用上略有不同,其区别在于它仅仅查看历史信誉交易或行为交易。
72.1.3块间索引结构设计
73.块间索引是一个基于树骨架和跳转列表的mberkle树山脉索引结构,mberkle树(简称mb树)可以像b+树那样工作,由普通b+树扩展节点组成,节点用一个哈希值扩展,每个哈希值与每个指针条目相关联。节点上的哈希值的计算与m
‑
tree相似。如图2所示,简单的说是通过跳转列表连接多个等高mberkle树形成的,其搜索码为一个三元组(bid,tid,ts),其中bid为区块号,tid为区块中的最后一个交易号,ts表示区块的时间戳,叶子结点存储了指向区块存储位置的指针。对于任意单区块链上两个的不同区块b
i
和b
j
,如果b
i
比b
j
打包的早,那么(b
i
.bid<b
j
.bid)∩(b
i
.tid<b
j
.tid)∩(b
i
.ts<b
j
.ts)总是成立的。对于块间索引中的结点,做出如下定义。
74.令hash(
·
)为哈希函数;'|'为运算连接符;bhash为区块的哈希值。对于等高
mberkle树中每一个叶子结点,对其做出如下定义:
75.hash
i
=hash(bid|tid|ts|bhash)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(1)
76.令hash(
·
)为哈希函数;'|'为运算连接符;l和r分为结点的左子结点和右子结点;bid
l
为左子树存储的区块号最大值,bid
r
为右子树存储的区块号最大值;tid
l
为左子树存储的交易号最大值,tid
r
为右子树存储的交易号最大值;ts
l
为左子树存储的时间戳最大值,ts
r
为右子树存储的时间戳最大值。对于等高mberkle树中每一个非叶子结点,对其做出如下定义:
77.hash
i
=hash(hash(hash
l
|hash
r
)bid
l
|bid
r
|tid
l
|tid
r
|ts
l
|ts
r
)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(2)
78.令hash(
·
)为哈希函数;'|'为运算连接符;为跳转区块的哈希值;l
k
为跳转区块。对于跳转列表中每一个叶子结点,对其做出如下定义:
[0079][0080]
令hash(
·
)为哈希函数;'|'为运算连接符;为右子树存储的区块号最大值;为右子树存储的交易号最大值;为右子树存储的时间戳最大值;l
last
为最新mberkle树的最后一个区块。对于跳转列表中每一个非叶子结点,对其做出如下定义:
[0081][0082]
构建块间索引结构的具体步骤如下:
[0083]
s3.1、预设分组区块大小n
block
,计算对应的叶子结点个数n
leaf
=n
block
和非叶子结点个数其中表示为树骨架的高度,n
b
表示非叶子结点包含子结点的个数,根据树骨架中所有结点的数量,批量申请对应大小的结点数组,构建树骨架,为块间索引结构预分配一定的空间,树骨架构建顺序为自左向右、自下而上;
[0084]
s3.2、当产生新区块且其区块号为1时,触发块间索引更新,在第一个空闲叶子结点处存储搜索码值信息,即区块号、块内最后一个交易号和时间戳,及指向区块存储位置的指针和该结点的哈希值,并且树根结点存储指向该结点的指针;
[0085]
s3.3、再每产生一个新区块时,将搜索码值等信息依次放置在非空闲叶子结点的右边结点,并向上递归更新,若将目前已装载的最高层结点不是根结点,树根结点存储指向该结点的指针;
[0086]
s3.4、当新区块的区块号为n
block
+1时,预设的块间索引已装载满,跳转列表需更新,即叶结点中追加存储前一区块的搜索码值信息和指向该索引的指针、根结点中最大搜索码值更新,并且重复上述步骤,创建新的块间索引结构和及时进行跳转列表更新。
[0087]
块间索引查询步骤为:输入查询关键字,判断是哪一种搜索码,与跳转列表根结点的相比较,若大于,在当前最新mberkle树中查询;否则按照插值查询方法在跳转列表叶子结点中查询,找到指向对应mberkle树的指针,再在该索引中查询;以mberkle树根结点为起始点,顺次判断结点左右子树是否符合查询条件,若符合则往下查询,直至叶子结点,得到指向所查询区块的指针并获取相应区块,否则查询结束。
[0088]
1.4信誉链块内索引设计
[0089]
信誉链块内索引是一个面向多关键字查询的两层hmfberkle树,hybrid
‑
merkle
‑
fb+tree(简称hmfberkle树)由普通fb+树扩展节点和shbf树扩展节点相结合组成,同时节点用一个哈希值扩展,每个哈希值与每个指针条目相关联。节点上的哈希值的计算与merkle树相似。可以像fb+树那样工作,也可以像shbf树那样工作。shifting bloom filter
‑
based indexing(基于移位布鲁姆过滤器索引,简称shbf树)可以像基于布鲁姆过滤器索引(bloom filter
‑
based indexing)那样工作,只将索引中非叶子节点的布鲁姆过滤器(bf)替换为移动布鲁姆过滤器(shbf)。如图3所示,其搜索码为(beeva,eva,rep),其中beeva为信誉交易中的被评价方;eva为评价方;rep为信誉值。由于信誉区块内各个信誉交易中的信誉值可能相同,存在查询结果出错或遗漏,因此设计两层索引结构和索引中父结点保存左右子树的信誉值范围。两层索引结构分为:顶层索引,查询关键字为beeva;底层索引,查询关键字为eva和rep。同时离散属性以二进制位的形式存储并存在shbf(shifting bloom filter,移动布鲁姆过滤器)中,可以高效地检索所查询元素是在在集合中。对于信誉链块内索引中的结点,做出如下定义。
[0090]
令hash(
·
)为哈希函数;'|'为运算连接符;txhash为信誉交易哈希值。对于底层索引中每一个叶子结点,对其做出如下定义:
[0091]
hash
i
=hash(txhash|eva|rep)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(5)
[0092]
令hash(
·
)为哈希函数;'|'为运算连接符;l和r分为结点的左子结点和右子结点;rep
l
为左子树存储的信誉值最小值,rep
r
为右子树存储的信誉值最大值;shbf
i
为结点所存储的过滤器。对于底层索引中每一个非叶子结点,对其做出如下定义:
[0093]
hash
i
=hash(hash(hash
l
|hash
r
)|rep
l
|rep
r
|shbf
i
)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(6)
[0094]
令hash(
·
)为哈希函数;'|'为运算连接符;botroothash为交易的哈希值。对于顶层索引中每一个叶子结点,对其做出如下定义:
[0095]
hash
i
=hash(beeva|botroothash)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(7)
[0096]
令hash(
·
)为哈希函数;'|'为运算连接符;l和r分为结点的左子结点和右子结点;shbf
i
为结点所存储的过滤器。对于顶层索引中每一个非叶子结点,对其做出如下定义:
[0097]
hash
i
=hash(hash(hash
l
|hash
r
)|shbf
i
)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(8)
[0098]
构建信誉链块内索引结构的具体步骤如下:
[0099]
s4.1、在接收信誉交易的过程中,以某时间窗口进行切分,形成一个个连续的分片。当接收到一个完整分片信誉交易后,在接收下一个分片信誉交易的同时,并行的对上一个分片按照被评价者进行分类,并使用一个线程对已分类的分片进行归并,等最后一个分片分类完成后,作最后一次归并使得信誉交易全部分类,并按分类进行排序;
[0100]
s4.2、使用多线程并行的对所有分类采用桶排序方法进行交易排序;
[0101]
s4.3、每当产生新区块,构建一个新的块内索引结构,其中所述的索引结构是两层索引结构,即底层结构和顶层结构;
[0102]
s4.4、根据每个被评价方下的信誉交易子集个数,计算相应底层结构中所需的叶子结点个数和非叶子结点个数,根据所有结点的个数,批量申请对应大小的结点数组,构建树骨架,为底层索引预分配一定的空间,树骨架构建顺序为自左向右、自下而上;
[0103]
s4.5、选取信誉值和评价方为搜索码值,使用多线程和采用自下而上方式批量向各个底层中装载,其中非叶子结点中存储lminrep和rmaxrep,lminrep表示左子树中最小信誉值和rmaxrep表示右子树中最大信誉值,并用二进制位替代直接存储评价方。初始化所有
叶子结点的父结点的shbf有m位且都为0,并将hash1(eva)%m,...,hash
k/2
(eva)%m,hash1(eva)%m+o(eva),...,hash
k/2
(eva)%m+o(eva)置于1,其中eva表示该结点所含的任一评价方,k表示哈希函数个数,o(eva)表示偏移量,且其中和ω表示机器字节位数,索引中其他层结点的shbf大小依次2倍递增;
[0104]
s4.6、根据信誉交易集分类的个数,计算顶层结构中所需的叶子结点个数和非叶子结点个数,根据所有结点的个数,批量申请对应大小的结点数组,构建树骨架,为顶层索引预分配一定的空间,树骨架构建顺序为自左向右、自下而上;
[0105]
s4.7、选取被评价方为搜索码值,每当一个底层结构构建完,向顶层树骨架的叶子结点中装载指向该结构的指针和被评价方,若出现两个高度相同山峰的峰顶结点则进行合并,直至顶层所有空间装满,并将顶层根结点的哈希值放入区块头。
[0106]
信誉链块内索引的查询过程:在该索引的顶层索引中查询离散属性时,以顶层索引根结点为起始结点,顺次判断结点左右子树是否存在所查找的离散属性,若存在则往下查询(第一预定查询顺序),直至查询到对应的底层索引根结点,否则显示不存在;在底层索引中查询离散属性时,以底层索引根结点为起始结点,顺次判断结点左右子树是否存在所查找的离散属性,若存在则往下查询,否则查询结束(第一预定查询顺序);在底层索引中查询数值属性时,以根结点为起始结点,判断是否在该结点中,若存在则顺次判断是否存在于结点左右子树中,若存在则往下查询,否则查询结束(第二预定查询顺序)。
[0107]
1.5行为数据链块内索引设计
[0108]
行为数据链块内索引是一个hmberkle树,hybrid
‑
merkle
‑
b+tree(简称hmberkle树)由普通b+树扩展节点和shbf树扩展节点相结合组成,同时节点用一个哈希值扩展,每个哈希值与每个指针条目相关联。节点上的哈希值的计算与merkle树相似。可以像b+树那样工作,也可以像shbf树那样工作。如图4所示,其搜索码为(sen,rec,seqnum),其中sen为交易中的发送者;rec为接收者;seqnum为交易号。索引中父结点保存左右子树数值属性的最大值,同时离散属性会以二进制位形式的存储并存储至shbf中,可以高效地检索所查询元素是在在集合中。对于信誉链块内索引中的结点,做出如下定义。
[0109]
令hash(
·
)为哈希函数;'|'为运算连接符;txhash为行为数据交易的哈希值。对于底层索引中每一个叶子结点,对其做出如下定义:
[0110]
hash
i
=hash(txhash|sen|rec|seqnum)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(9)
[0111]
令hash(
·
)为哈希函数;'|'为运算连接符;l和r分为结点的左子结点和右子结点;sqenum
l
为左子树存储的交易号最大值,seqnum
r
为右子树存储的交易号最大值;shbf
i
为结点所存储发送者的过滤器;shbf
i
'为结点所存储接收者的过滤器。对于底层索引中每一个非叶子结点,对其做出如下定义:
[0112]
hash
i
=hash(hash(hash
l
|hash
r
)|seqnum
l
|seqnum
r
|shbf
i
|shbf
i
')
ꢀꢀꢀꢀꢀꢀ
(10)
[0113]
构建行为数据链块内索引结构的具体步骤如下:
[0114]
s5.1、在接收行为数据交易的过程中,以某时间窗口进行切分,形成一个个连续的分片。当接收到一个完整分片行为数据交易后,在接收下一个分片数据交易的同时,并行的对上一个分片按照发送者进行分类,并使用一个线程对已分类的分片进行归并,等最后一个分片分类完成后,作最后一次归并使得行为数据交易全部分类,并按分类进行排序;
[0115]
s5.2、每当产生新行为数据区块,构建一个新的块内索引结构;
[0116]
s5.3、根据检测后行为数据交易集个数,计算树骨架中所需的叶子结点个数和非叶子结点个数,根据所有结点的个数,批量申请对应大小的结点数组,构建树骨架,为块内索引预分配一定的空间,树骨架构建顺序为自左向右、自下而上;
[0117]
s5.4、选取行为数据交易号、发送者和接收者为搜索码值,采用自下而上方式向树骨架中装载,所述结构的非叶子结点中用二进制位替代直接存储发送者和接收者,也存放左右子树的交易号最大值。
[0118]
行为数据链块内索引的查询过程:在查询离散属性时,以根结点为起始结点,顺次判断结点左右子树是否存在所查找的离散属性,若存在则往下查询,否则显示不存在(第一预定查询顺序);在查询数值属性时,以根结点为起始结点,判断存在于结点左子树中还是右子树中,若存在于左子树中,则往结点左子树查询,否则,往结点右子树查询,直至查询到叶子结点(第三预定查询顺序)。
[0119]
1.6跨链索引设计
[0120]
基于哈希指针和区块间的链式结构,设计跨链索引结构,即在产生信誉新区块时使其记录当前最新行为区块的哈希值,继而基于哈希指针形成可追溯到行为区块的跨链结构,以提高跨链时查找行为数据区块的效率。
[0121]
1.7验证索引结构设计
[0122]
构建信誉链上验证索引结构,具体以下步骤:
[0123]
s7.1、根据信誉交易集分类的个数n,初始化mm位且都为0的ohbf(one
‑
hashing bloom filter,单哈希布鲁姆过滤器),其中,mm=10
·
n;
[0124]
s7.2、将ohbf分为k份,且使(mm
i
,mm
j
)=1,1≤i<j≤k,其中(mm
i
,mm
j
)表示mm
i
和mm
j
的最大公约数,或mm
i
和mm
j
互为素数,并且
[0125]
s7.3、将所有底层结构的根结点哈希值分别通过以mm
i
为模进行取模运算,将ohbf的对应位置为1,全部完毕后将其放入区块头中。
[0126]
构建行为数据链上验证索引结构,具体以下步骤:
[0127]
s8.1、在行为数据链块内索引结构中选取中间层作为验证层,根据该验证层的结点个数,初始化mm位且都为0的ohbf;
[0128]
s8.2、将ohbf分为k份,且使(mm
i
,mm
j
)=1,1≤i<j≤k,其中(mm
i
,mm
j
)表示mm
i
和mm
j
的最大公约数,或mm
i
和mm
j
互为素数,并且
[0129]
s8.3、将验证层各结点哈希值分别通过以mm
i
为模进行取模运算,将ohbf的对应位置为1,全部完毕后将其放入区块头中。
[0130]
以行为数据链为例,当查询结束时,需构建验证对象和需验证验证对象,以判定查询结果集的完整性。
[0131]
下面先介绍验证对象构建过程,然后介绍查询结果集的验证过程,输入验证对象,如果验证通过则查询结果集完整。
[0132]
验证对象构建过程。将在块内索引中所查询到的叶子结点信息和其同一父结点的兄弟结点信息添加到验证对象中,再获取该结点的父结点,若该结点不处于验证层,则继续和其同一父结点的兄弟结点一起添加到验证对象中;若处于验证层,添加到验证对象中,验证对象构建完成,之后返回给普通节点。
[0133]
验证对象验证过程。根据验证对象重构到验证层的结点,将该结点的哈希值转换为二进制位,与区块头中的ohbf比较,若存在,则查询结果集完整,否则说明不完整,查询存在错误。
[0134]
综上,由于引入各种索引结构且将索引根结点哈希值放入区块头中,因此区块头结构发生了改变,行为数据链的区块头结构如下所示:
[0135][0136]
其中,prehash
data
表示前一行为数据区块的区块头哈希值;index
data
表示行为数据区块号;ts
data
表示打包行为数据区块的时间;skiproot
data
表示跳转列表的根结点哈希值,跳转列表记录指向多个分组块间索引的指针;intraindroot
data
为块内索引根结点哈希值;randnum
data
为打包行为区块所选取的随机数;adsroot为验证索引结构根。
[0137]
信誉链的区块头结构为:
[0138][0139]
其中,prehash
rep
表示前一信誉区块的区块头哈希值;index
rep
为信誉区块号;ts
rep
为信誉区块打包的时间;skiproo
r
t
ep
为跳转列表的根结点哈希值;intraindexro
r
o
ep
t为块内索引的根结点哈希值;randnum
rep
为打包信誉区块所选取的随机数;adsroot为验证索引结构的根;curhash
data
为当前行为数据链最新区块的区块头哈希值;index
data
为与之关联的行为数据区块的区块号。
[0140]
下面是本发明实施例中的方法与现有技术中的方法的对比说明:
[0141]
遍历查询:对于单区块查询,遍历所有块内交易,查找符合查询条件的交易,对于多区块查询,循环调用每一个区块,基于单区块查询方式查询每个区块;
[0142]
sebdb方法中块间索引在索引更新时不断向最右叶子结点追加,没有考虑到当区块比较多时会对区块链系统写入性能和查询性能造成急剧变差影响,块内索引中没有考虑到查询关键字存在相同的情况,以及查询关键字存在易被篡改缺陷;
[0143]
vchain方法中索引节点直接存储离散属性,没有考虑到索引大小和块内交易个数较多时对查询性能的劣势影响;
[0144]
基于bf索引办法中用二进制位代替直接存储离散属性,但没有兼备查询性能和索引大小。
[0145]
面向信誉
‑
行为关联双区块链的可验证查询优化分析,如下所示:
[0146]
(1)信誉链中以信誉值为关键字的查询性能和查询完整率分析
[0147]
图5
‑
图6为本发明与sebdb方法对比,选择相同信誉交易个数时,以信誉值为关键字的查询性能和查询完整率对比:
[0148]
(1.1)以信誉值为关键字的单值查询性能和查询完整率分析
[0149]
假设块内索引和信誉区块内的所有交易都已加载到内存中,图5给出了单区块下多个交易中信誉值存在相同时单值查询性能和查询完整率随相同个数变化的趋势,其中区
块内共有1024个信誉交易。图5(a)示出了单值查询的查询性能比较,其中,rep_intra方法的查询时间随着相同个数的增加而增加,刚开始的略差于sebdb+trav方法,之后转变为优于该方法,因为不管相同个数如何变化,rep_intra方法只存在最左查询和最右查询,而sebdb+trav方法由于遍历次数不断增加,查询时间也开始明显的增加;虽然sebdb方法的查询时间始终保持不变,可该方法只能查找到一个查询结果。图5(b)示出了单值查询的查询完整率比较,正如图5(b)中所示,该方法随着相同个数变化,查询完整率一直下降,但其他两种方法始终有完整、不遗漏的查询结果。因此,从兼备单值查询性能和查询完整率两方面上考虑,rep_intra方法在一定程度上优于其他两种方法。
[0150]
(1.2)以信誉值为关键字的范围查询性能和查询完整率分析
[0151]
假设块内索引和信誉区块内的所有交易都已加载到内存中,图6给出了单区块下信誉值存在相同时范围查询性能和查询完整率随信誉值相同个数变化的趋势,其中所要查询的交易量范围为4
×
x,其中x为相同个数,以及区块内共有1024个信誉交易。图6(a)示出了范围查询的查询性能比较,其中,rep_intra方法的查询时间不论相同个数如何变化,始终优于sebdb+trav方法的,但略差于sebdb方法的,由于rep_intra方法的单次查询时间略差于sebdb方法的,因此本文的范围查询性能略逊于sebdb方法,而sebdb+trav方法由于遍历次数的不断增加,查询时间也在增加,其查询性能最差。但是,在图6(b)中所示的范围查询的查询完整率比较中,使用sebdb方法查询总会遗漏部分查询结果,并且随着信誉值相同个数的变化,其查询完整率一直降低,而其他两种方法始终有完整、不遗漏的查询结果。因此,总的来讲,rep_intra方法是优于其他方法的。
[0152]
(2)以离散属性为关键字的查询性能和所占存储空间分析
[0153]
图7
‑
图10为本方面与对比方法的比较,对比以离散属性为关键字的查询性能和所占存储空间:
[0154]
以信誉链为例,测试块内索引结构的性能。假设块内索引和信誉区块内的所有交易都已加载到内存中,图7给出了单区块下离散属性的查询性能随区块内交易个数变化的趋势。可以看出,bf_based indexing方法和vchain方法的查询时间明显的呈现指数形式增长,而rep_intra方法的查询时间只以较低斜率线性增长。当信誉交易规模较小时,本文方法的查询性能会略差两种对比方法的,但从信誉交易规模较大开始,即信誉交易个数大于等于4096后,本文方法的查询性能始终优于bf_based indexing方法的,并且两者之间的差异还在逐渐变大;在信誉交易个数大于等于32768后,开始优于vchain方法的,同时两者之间的查询性能差异也出现逐渐变大的趋势。分析实验结果可知,由于bf_based indexing方法采用非叶子结点的bf大小是相同的方式,在交易个数不断增加时会导致难以通过非叶子结点的左、右子结点判断出是向左查询还是向右查询,使之会查询判断更多的结点;由于vchain方法采用非叶子结点直接存放离散属性的方式,当交易个数不断增加时非叶子结点中包含了越来越多的离散属性关键字,导致在查询时消耗更多时间判断结点中是否含有查询关键字;而rep_intra方法则不受上述两种影响查询性能因素的影响。
[0155]
图8显示了以离散属性为关键字的块内索引中假阳性率随信誉交易个数或块内索引中叶子结点个数变化的趋势,其中在同一交易数下两种方法的所占用存储空间是相同的。可以看出,bf_based indexing方法的假阳性率呈现快速增长趋势,且在交易个数为256时假阳性率已达到百分之百,此时对于任何一个查询关键字,该方法都认为该关键字存在
于索引中,不具有甄别无效查询关键字的能力;而rep_intra方法的假阳性率只是轻微的增长。这是因为:两种索引方法的索引大小虽相同,可bf_based indexing方法采用非叶子结点的bf大小是相同的方式,当交易数不断增加时bf_based indexing方法中紧靠根结点的非叶子结点里的bf所有位被置为1,而rep_intra方法不会出现这种情况,其假阳性率有轻微增长的原因是随着交易个数增加,索引层数也随之增加导致的。
[0156]
图9显示了以离散属性为关键字的索引中假阳性率随索引大小变化的趋势,其中信誉交易个数为1024。在图中,当索引大小较小时,rep_intra方法的假阳性率已几乎为0,而bf_based indexing方法的假阳性率只有当索引大小特别大时,才能达到为一个较小的值,并且在索引大小较小时该方法不具有甄别无效查询关键字的能力或者甄别无效关键字的能力很差;当索引大小较大时,该方法具备了辨别无效关键字能力,但所消耗的存储空间是巨大的。再结合图7、8和9的实验结果,当区块内信誉交易规模较大或大时,若bf_based indexing方法想保持较低的查询响应时间,其假阳性率就必须低,然而此时索引占用的存储空间大,相反,若所占用的存储空间要较小,则其查询时间较大,甚至将会指数递增;但rep_intra方法可以很好的兼顾查询响应时间、假阳性率和索引大小。
[0157]
图10显示了索引所占用的存储大小随信誉区块内交易个数或索引叶子结点个数变化的趋势。可以看出,rep_intra方法所占用的存储空间始终小于vchain方法的,并且两者所占用的存储空间之差渐渐扩大。vchain方法所占用的存储空间增长趋势更明显,若将其索引结构存于内存,将占用更多内存空间;若存于磁盘,查询时磁盘i/o开销增加。这是因为:vchain方法中非叶子结点直接存储离散属性,而rep_intra方法使用二进制位代替直接存储。结合图7和10的实验结果,可以看出,当块内信誉交易规模大时,rep_intra方法很好地兼顾了查询响应时间和索引大小,且都优于vchain方法的。
[0158]
(3)块间索引下查询区块的查询性能对比
[0159]
图12
‑
图14为本发明跨链查询响应时间与遍历查询方法的对比:
[0160]
假设块间索引和区块都已加载到内存中,以信誉链为例,本实验测试四种实现方法下区块查询的查询性能,通过变更信誉区块规模测试其查询性能,其中rep_interi(i=1,2,3)是分别以1024、2048、4096个区块大小划分的分组。本次实验中以区块号为查询关键字进行区块查询。图11给出了执行区块查询的查询性能。实验结果显示,rep_intrei方法的查询性能明显优于sebdb方法的,由于rep_intrei方法将块间索引结构分解为多个等高的分组块间索引结构,降低了索引高度,减轻内存存储块间索引的压力或磁盘存储时磁盘的i/o开销,特别是当区块数规模从4096增加到4194304这个过程中,不同方法之间的查询性能差异正发生不断的变化。
[0161]
(4)跨链查询时追溯查询和基于时间窗口查询的查询性能对比
[0162]
首先,测试追溯查询的查询性能。图12和13给出了追溯查询的查询性能。在图12中,给出了不同信誉区块个数下追溯查询的查询性能,进行以区块号和被评价方为关键字的追溯查询,假设信誉区块和行为数据区块一一对应关联,则行为数据区块数与信誉区块数一样,并且区块内的交易个数都为2048。在图中,查询结果集规模固定为16384个行为数据交易,本文索引的查询处理性能在所有情况下都明显优于遍历索引办法。这是因为本文索引只需要直接从磁盘读取所查询到的行为数据交易,而遍历索引需要读取关联双区块链内的所有交易,导致查询开销较大。
[0163]
图13给出了不同查询结果规模下追溯查询的查询性能,进行以区块号、被评价方和单个信誉值为关键字的追溯查询,假设信誉区块和行为数据区块一一对应关联,两条链的区块个数都为1024和区块内的交易个数为1024。在图中,测试了查询结果集规模从2048变化到10240的查询性能。实验结果表明,本文索引的查询处理性能在所有情况下都明显优于遍历索引办法,因为本文索引只需要直接从磁盘读取所查询到的交易即可,而遍历索引需要读取关联双区块链的所有交易。但是,随着查询结果集规模的不断增大,本文方法与遍历索引方法之间的性能差异正减小,这是由于本文方法读取磁盘的i/o开销在不断增加,使得本文方法的查询性能下降、查询响应时间增加;而遍历索引不受查询结果规模大小影响,因为该方法已扫描了所有的交易。
[0164]
接着,测试不同时间窗口下时间窗口查询的查询性能,结合块间索引和块内索引进行以时间戳、被评价方和范围信誉值为关键字的查询,假设信誉区块和行为数据区块一一对应关联,每条链的区块个数为1024和区块内的交易个数为1024。tw
i
=[1024
‑
1024/2
i
‑1,1024],其中i=1,2,3,4,5,为一个时间窗口,表示从第(1024
‑
1024/2
i
‑1)个区块的时间戳到第1024个区块的时间戳的查询范围。图14给出了时间窗口查询的查询性能。可以看出,本文索引的查询处理性能在所有情况下都明显优于遍历索引办法,因为本文索引可以直接查询到对应的行为数据交易,并且只需要直接从磁盘读取所查询到的行为数据交易即可,而遍历索引则需要读取关联双区块链内的所有交易。当时间窗口减小时,查询性能都随着提升,因为查询结果规模大小与需要查询的区块数量都在减小。
[0165]
(5)查询结果的验证对象大小和验证时间对比
[0166]
以行为数据链为例,测试多查询结果集的验证性能。图15给出了在行为数据链中块内索引下多查询结果集的验证性能。在图中,区块内的行为数据交易个数为1024,验证层选取在块内索引中从根结点层开始数的第5层。图15(a)示出了多查询结果下验证时间比较情况,其中显示了多查询结果集的验证时间随着查询结果集规模变化的趋势,其中查询结果规模由1.5625%变化到100%。可以看出,相比较于sebdb方法,本文方法的多查询结果集的验证时间总优于对比方法的,并且验证时间的优势逐步趋于明显,这是因为本文所采用的方法逐渐减少了更多的哈希计算次数。图15(b)示出了多查询结果下验证大小比较情况,其中显示了多查询结果集的验证对象大小随着查询结果集规模变化的趋势,其中查询结果规模由1.5625%变化到100%。相比较于sebdb方法,本文方法的多查询结果集的验证对象大小始终都小于对比方法的,并且验证对象大小的差异在逐渐变大,这是因为本文所采用的方法节省装入块内索引结构中的部分非叶子结点。
[0167]
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。