论文部分内容阅读
作为一种由互不信任的多方共同维护的分布式账本,区块链系统向外提供的数据查询服务必须满足查询结果集未被篡改且完整性可验证的要求。区块链系统中的查询主要分为两类:面向全节点的查询和面向轻节点的查询。其中,面向全节点的查询需要全节点维护一份完整的区块链数据、参与共识且同步数据,存储、计算和网络代价高昂;而在执行面向轻节点的查询时,查询方仅需维护区块的头部信息来验证从其它全节点返回的查询结果集,成本显著降低。现有区块链系统大多将区块数据存储在语义描述简单的Key-Value数据库或文件系统中,如LevelDB等。然而,这类系统的查询接口单一,其能支持的面向全节点的查询类型有限。现有工作大多通过将区块数据复制到链下数据库的方式提供更多查询服务,但区块数据进行追加存储的方式极大增加了存储成本。对于面向轻节点的查询,查询方需要验证来自不可信全节点的查询结果集的完整性。但是,传统区块链系统仅支持简单的交易或状态的存在性证明,无法验证其他类型。而在外包数据库中广泛采用的基于MB树的可验证查询方案,难以适配区块数据的更新特征,导致写入性能低下,因而无法直接应用于面向轻节点的查询之中。鉴于现有区块链系统在查询处理方面存在以上问题,本文主要完成以下工作:1.针对传统面向全节点的查询类型有限、处理性能低下的问题,本文为区块数据添加关系语义,使其支持由选择、投影与连接等基本关系算子复合而成的复杂查询。系统只存储一份区块数据,因而不增加额外的存储成本。此外,由于同属一张表的交易按照其发生的时间线分布到多个区块,这显著增加了I/O开销,本文设计了表级位图索引和层次索引来加速数据访问,优化了查询处理,并最终显著降低了查询的响应时间;2.由于面向轻节点的查询无法同时支持对范围和连接查询结果集的完整性的验证,且传统验证结构例如MB树由于难以适配区块链以区块为单位的更新机制,而面临写入性能低下的问题,本文设计了一种写入高效的验证索引结构AC树(Authenticated Compacted Tree),来支持可验证范围和连接查询。在AC树中,数据更新都写入内存,当写入的数据量达到设定阈值之后再批量刷入磁盘,从而减小索引更新对系统写入带来的影响。在AC树的基础上,本文还设计了 AC*树来优化基于时间窗口的数据访问,基于AC树、AC*树还能够高效地支持可验证连接查询;3.针对现有的面向轻节点的查询难以支持高效的可验证多维聚集查询的问题,本文提出了基于密码学累加器的验证结构GCA2树(Generic Capacity-efficient Authenticated Aggregate Tree),其存储代价与查询维度线性相关,从而解决了传统类似MB树的外包数据库中的验证结构随着查询维度的增大而表现出的性能急速衰减、存储代价急剧增加的问题。基于该结构,本文设计了可验证多维聚集查询算法,单个验证结构可以支持一张关系表上任意维度组合的多维聚集查询。本文还进一步提出多区块批量处理与验证结构合并两种优化策略,极大地降低轻节点的网络与验证开销;4.综合已有区块链系统查询功能和性能不足的问题,本文设计实现了一款面向丰富查询的区块链数据库系统——StarChain,并集成了本文提出的关键技术,包括:全节点查询优化,高效的面向轻节点的可验证范围、连接和聚集查询。本文在评测基准BChainBench上进行了广泛的实验,实验结果表明本文提出的方法是有效与可行的。综上所述,本文主要针对已有区块链系统在查询处理方面的功能和性能上的不足,为区块数据添加了关系语义使其能支持多种类型的查询,从而克服了区块链采用Key-Value数据库作为存储引擎所带来的查询功能单一、查询优化机制不足的问题。在此基础上,我们为全节点和轻节点分别设计了新颖的索引结构和验证结构提升了全节点和轻节点的查询性能。最终,我们将以上理论成果集成到自主可控的区块链数据库——StarChain上进行了实验验证,其结果表明了本文所提方法是有效的。