Vchain:可验证的查询

这篇具有很好参考价值的文章主要介绍了Vchain:可验证的查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

总体概述

本文于2019年7月发表在顶会SIGMOD,题目为《vChain: Enabling Verifiable Boolean Range Queries over Blockchain Databases》,来自香港浸会大学。2020年本团队在SIGMOD再投一篇vchain会议论文,展示了他们的研究进展并确定了vchain的实用性。

本文希望设计出一个能够满足各种类型的查询,且保证查询结果正确、查询效率高的新型框架;行业内的数据库巨头公司也在纷纷致力于开发研究基于区块链的数据库,并设计成比较综合的关键字查询模式。

论文核心内容

现在查询区块链中数据的需求越来越大,论文提出vChain框架,减轻用户查询的存储、计算成本,并保证查询结果的完整性。主要是提出了摘要数据结构AttDigest、块内块间索引和IP树索引结构。

全文内容概述

密码学名词解释

想比较通透的读懂本论文,需要了解一点密码学的基础知识,包括非对称加密技术,双线性配对(Bilinear Pairing),多重集(Multiset),密码学累加器。接下来简单介绍一下。

  1. 密码学累加器
    累加器可利用哈希函数的性质生成一个短的承诺,利用承诺可以验证一些证明。累加器的重要性质是,它可以用来证明集合不相交。Merkle tree就是一个最简单的累加器。累加器分为动态的和静态的:
  • 动态累加器:当有元素加入或者移除时,commitment和membership proofs可以进行有效更新(所谓有效更新,是指更新的代价应与已累加的元素数量无关。)
  • 静态累加器:当有元素加入或者移除时,commitment和membership proofs需总体重新生成,无法进行有效更新。

另外,vector commitment(VC)具有与累加器完全相同的功能,但是对应的元素是有序的。

  1. 多重集
    多重集是数学中的一个概念,是集合概念的推广。在一个集合中,相同的元素只能出现一次,因此只能显示出有或无的属性。在多重集之中,同一个元素可以出现多次。
    举例来说,{1,2,3}是一个集合,而{1,1,1,2,2,3}是一个多重集。其中元素1的重数是3,2的重数是2,3的重数是1。{1,1,1,2,2,3}的元素个数是6。多重集中的元素是没有顺序分别的。

  2. 双线性配对:Bilinear Pairing
    定义:一个双线性映射是由两个向量空间上的元素,生成第三个向量空间上一个元素之函数,并且该函数对每个参数都是线性的。

    理解:若B:V×W→X是一个双线性映射,则V固定,W可变时,W到X的映射是线性的,W固定,V可变时,V到X的映射也是线性的,也就是说保持双线性映射中的任意一个参数固定,另一个参数对X的映射都是线性的。
    双线性配对是多集累加器的基本操作,用于生成一对公私钥对。

  3. 非对称加密
    非对称加密是使用公钥/私钥对中的公钥来加密明文,然后使用对应的私钥来解密密文的过程。 非对称加密也称为公钥加密。 与此相对的,对称加密使用相同一组密钥来加密和解密数据。

  4. 密码学函数
    全文的使用的函数的安全性是由密码学保证的。如下所示:

  • KeyGen(1λ) → (sk, pk),产生公钥pk和密钥sk。
  • Setup(X, pk) → acc(X),输入多重集X和公钥pk,计算出累加器的值- acc(X)。具体怎么计算的可以暂时放下。
  • ProveDisjoint(X1,X2, pk) → π,输入两个多重集(这两个多重集中的元素是没有交集的)和一个公钥,输出证明π。顾名思义,这个函数是用来生成两个多重集没有交集的证明
  • VerifyDisjoint(acc(X1), acc(X2), π, pk) → {0, 1},这个函数用来验证两个多重集X1和X2是否有交集,如果输出为1,表示没有交集。

传统的区块链模型

vchain,硕士学习,区块链
上图表示区块链的网络模型,其中有三种类型的节点:全节点、矿工和轻节点(矿工是一种具有强大算力的全节点)。全节点和矿工保存着区块链的完整数据集;轻节点只保存区块链的头部数据(包含共识证明和加密哈希值),而不存储具体的各种数据记录。轻节点想查询数据时,向全节点发送查询Q,全节点向用户返回R和VO,R表示查询Q的结果,VO(verifiable object)是由服务提供者(Service Provider,SP)构造的,用于让轻节点验证查询结果是否被是否漏查。

基础版本的方案存在三个主要缺点,一是轻节点查询的keys需要在建立Merkle Tree的时候建立好。如果想让它支持任意的属性查询的功能,需要很大的构建成本;二是Merkle Tree不支持属性集合的验证;三是在区块和区块之间,使用Merkle Tree不能做到聚集批量验证,无法做到效率优化。

现行的模型下轻节点想要确保数据库上查询的完整性,就需要完全下载整个网络的交易数据集。巨大的存储、计算、带宽开销使得这个做法不现实。为了让轻节点能够仅仅只做查询就可以返回可信的数据,Vchain采用了验证查询处理来确保结果的完整性。

Vchain模型

vchain,硕士学习,区块链
整个模型有三种成员:(i)矿工,(ii)服务提供商(SP)和(iii)普通查询用户。矿工和SP维护整个区块链数据库的完整节点。查询用户是一个仅保存块头的轻节点。矿工负责构建共识证明,并向区块链添加新区块。SP为轻量级用户提供查询服务。
存储在区块链中的数据按时间顺序建立对象块序列{ o1,o2,····,on }。每个对象Oi 的格式定义为 ⟨ ti,Vi,Wi ⟩,可以理解成为链上的一笔一笔交易。t 表示时间戳,V 表示一个多维向量,保存一个或多个数字类型的属性,W表示存储多个属性的集合。图示中,q1是时间窗口查询,q2q3是订阅查询。

从三大方向研读本文

研究区块链的可验证查询方向,无非是通过优化验证来保证查询的效率和可靠性。从大的角度来说,大致可三类:要求查询正确、要求查询的效率高、要求查询的开销低。以下为将本文从这三个方向分类后得到的结论:

  1. 查询正确
  2. 查询效率高
    ①支持Boolean range查询(具体分为时间窗口和订阅查询)
    Ⅰ时间窗口查询 q:< [ t1,t2 ],[ 1,2 ],a >
    Ⅱ订阅查询 q:< —,[ 1,2 ],a∨b >
    ②支持批量验证
  3. 查询成本低

一、查询的正确性

  1. 借助密码学原理保证查询正确(非对称加密、双线性配对、多重集等),使用密码学函数加密。
  2. 在查询过程中,SP会检查区块链中的ADS,并构建一个验证对象(VO),其中包含结果的验证信息,并将VO与结果一起返回给用户。用户可以根据VO确定查询结果的可靠性和完整性。
  3. 轻节点用户查询的完整性可以借助存储在块头中的ObjectHash进行身份验证。
    轻节点接收到查询结果之后,首先需要非篡改验证:自己根据所接收到的数据构建并计算出一个hash值,并与区块头的Merkle Tree的根节点的hash值对比,如果结果相等表示验证通过。对于与查询条件不匹配的数据对象,轻节点调用函数VerifyDisjoint()来验证查询结果。
    为什么轻节点调用了VerifyDisjoint函数就能够验证数据对象确实是不匹配的呢?需要注意,轻节点本地就拥有AttDigesti这个字段,不需要向服务提供者查询,因为他保存在区块头中。AttDigest是由矿工在打包区块的时候调用函数AttDigesti = acc({ })生成的。
    从上面我们可以看出,SP都向轻节点发送了哪些数据:(1)匹配查询条件的数据对象(2)不匹配查询条件的证明π值和不匹配的某一个属性W,目的是告诉用户正是这个字段跟数据对象没有交集。

二、查询效率高——Boolean range查询

在区块中添加额外的ADS

Vchain提出在区块头中额外增在一份基于累加器的可验证的数据结构(ADS),这个ADS可以在轻节点用户查询后返回一个VO,供用户认证结果的完整。新的ADS也支持对任意查询属性(包括数字属性和集值属性)进行动态聚合。
vchain,硕士学习,区块链
图示中,ConsProof的生成通常基于计算PreBkHash和MerkleRoot,也可以说ConsProof是矿工需要计算的nonce,使得hash(PreBkHash | T S | MerkleRoot | nonce) ≤ Z。Z代表挖矿的难度,一旦矿工找到nonce,则可以广播至全网,发布到区块链上。
在区块头增加字段AttDigest(摘要),有三点用处:第一,能够概括一个数据对象的属性W,证明一个对象是否满足轻节点所提交的查询。如果对象不满足查询条件,只需要返回这个AttDigest字段,而不需要返回整个数据对象给用户。第二,AttDigest字段的大小都是固定的。第三,AttDigest支持不同区块、不同对象的聚合操作,从而实现批量验证。
AttDigest字段的构造方法为:
vchain,硕士学习,区块链
他所支持的密码学函数ProveDisjoint(·)和VerifyDisjoint(·)可以快速构造一个查询不匹配的证明,这样仅仅返回一个AttDigest摘要和一份证明就可以向用户返回查询不匹配结果,并向用户确保这个查询是真实可信的。

Ⅰ 时间窗口查询

  1. 时间窗口查询
    举例q=〈[2018-05, 2018-06], [10, +∞], send:1FFYc ∧ receive:2DAAf〉,表示查询时间范围为[2018-05, 2018-06],数字在[10, +∞]之间,且在W集合中满足谓语表达式send:1FFYc ∧ receive:2DAAf的数据。其中send:1FFYc ∧ receive:2DAAf 字段表示既存在发送地址中有1FFYc字节的也存在接收地址有2DAAf字节的。

从Boolean类型查询拓展到Range查询

保存在区块链中的对象数据表示形式为<ti, Vi, Wi>,V中存储的是多个数字类型的属性,W中存储的是多个非数字类型的属性。上述针对的是集值属性W的Boolean查询,现在拓展到针对V的Range查询。论文的思路是将数字类型的属性转换成非数字类型的集值属性,这样Range查询可以相应地映射到Boolean查询。 转换方法为:

  • 将数字转化成二进制的形式
  • 将一个数字转化成二进制前缀元素,函数表示为trans(·),比如4可以表示为二进制100,所以trans(4) = {1∗, 10∗, 100}. 星号表示通配符。对于数组,比如(4,2)的二进制为(100, 010),前缀转化为:
    vchain,硕士学习,区块链
    其中下标1和2表示数据维度。
    按照上述方法,[0,7]范围内一个维度的二进制前缀树为下图所示:
    vchain,硕士学习,区块链

所以对于q查询的数组范围(0,6),可以在这棵树上的叶子节点上红色区间表示出来。然后,我们确定{0∗, 10∗, 110}这三个灰色的点,使之恰好能够覆盖这些叶子节点,这三个灰色的节点就是我们想要的。(0,6)转换成Boolean查询的公式则为:0 ∗ ∨10 ∗ ∨110。

再举个例子,对于数字4,trans(4) = {1∗, 10∗, 100},很容易确定它是在[0, 6]范围内的。这个是一维的,二维的呢?比如Range查询 [(0, 3), (6, 4)],第一维度的区间是【0,6】;第二维度的区间是【3,4】。所以很明显的,对于某一个查询q=(4,2),分别表示查询的第一维度为4,第二维度为2,是不在查询范围[(0, 3), (6, 4)] 内的,因为2不在第二维度【3,4】范围中。

这样子就将数字类型的Range查询拓展到了非数字类型的Boolean查询。它有一个缺点,那就是,只有整数才能被转化。

Ⅱ 订阅查询

  • VChain系统提供了可以订阅的查询的功能。传统的数据库查询为,已经存在数据,我们提交查询,然后接收结果。这里面的可订阅查询服务的执行顺序相反,服务提供者先收集用户注册的查询语句,在未来如果有数据对象匹配这些查询条件,就将该数据对象发送给相应的用户。具体分为如下操作:
    (1)服务提供者收集用户的查询语句,建立索引
    (2)当有数据对象到来,就通过索引查找所有满足条件的查询。
    (3)将该数据对象发给对应的用户,同时发送那些不匹配的数据对象的不匹配证明。

  • 如何建立这样一个索引
    我们知道,查询处理的大部分开销来自于在SP上为不匹配的对象生成证明。但是我们可以通过设计索引节省这个开销。本文设计了反向前缀树(IP树)加速同时处理大量订阅查询。

在设计前缀树组件时,有两个重要的文件:Range条件反转文件(RCIF)和Boolean条件反转文件(BCIF)。RCIF其实就是一个表格,表格有查询的编号qi和其覆盖的类型(full表示全覆盖,partial表示部分覆盖)。我们会事先确定一个节点的数值空间S,比如图中N1的数值空间S是[(0,2),(1,3)],对应左上角的表格树的红色虚线框部分,x数轴对应的第一维的数据范围(在本例中第一维数据是0和1),y轴对应的是第二维的数据范围(本例中是2和3),N1的范围表示成红色虚线框的部分。下图中二维坐标系只是对右侧IP树(Inverted Prefix Tree)中每个节点RCIF确定的一个便于理解的补充。通过这个表格树,我们很清晰得知道查询的数值范围是否覆盖(全覆盖或部分覆盖)了该节点的数值空间。
在使用RCIF确定好是全覆盖q还是部分覆盖q后,BCIF对RCIF中的全覆盖的那些查询的属性集进行扩展(不包括部分覆盖的那些查询)。BCIF中的第一列是查询条件属性集,第二列是其对应的查询。当有新数据对象到来,只需要遍历四分树,查找RCIF表格所有full的查询,并且如果满足BCIF表格中的条件,就表示数据对象满足查询条件。
vchain,硕士学习,区块链
如下是一个例子:
vchain,硕士学习,区块链

二、查询效率高——批量验证

批量验证可以加快认证速度,本文开发了两个新索引来聚合块内(Intra)、块间(Inter)的数据记录,以实现高效的查询验证。块间采用跳表,块内则生成最大父节点。对于不符合查询条件的记录,则构造不匹配证明Π。

  • 块内(Intra)索引:块内索引可以聚合多个对象并提高性能。
    总体思想:父节点中的W集合是子节点集合的总和,所以当父节点的W集合不满足查询条件时,所有的子节点都不满足。这样子就可以节省了递归二叉树的时间。具体如下:(1)作者把交集最大的两个叶子节点生成一个父节点,然后一层层往上生长,直到根节点。(2)在非叶子节点的W匹配查询条件,还需要递归直到叶子节点,因为叶子节点才是一份份需要查到的数据。
    vchain,硕士学习,区块链
    图示中的MerkleRoot是二叉Merkle树的根哈希。每个树节点有三个字段:hash、聚合属性W和聚合属性摘要AttDigest。他们的定义如下所示(其中“ | ”是字符串串联运算符 ):
    vchain,硕士学习,区块链
    为了提高查询效率,本文采用Jaccard相似性系数最大化每个节点下对象的相似性。上图给的例子,作者将N1和N2聚类到一块,N3和N4聚类一起,然后对聚类中元素两两结合往上构造二叉树。另一方面,树的构建首选可以提高查询效率的平衡树。

  • 块间(Inter)索引
    块间索引用到了跳表这个数据结构,以指数形式跳过以前的块数。(例如跳过先前的2、4、8块)。跳表数据结构形如下图:
    vchain,硕士学习,区块链
    每个跳表维护三个数据:PreSkippedHashLk 、WLk、AttDigestLk。使用额外的字段SkipListRoot,其定义为:
    vchain,硕士学习,区块链
    总体思路:WLk存储了前面的所有W字段,跳跃步长为k(k取的是2的n次幂),存在包含关系。所以我们从右边所示的队列L的最下端开始,判断对应的W是否匹配查询条件,如果不匹配,就表示其所跳过的区块都不匹配查询条件,因此就不需要继续往上遍历了。图示中,先检索最长步长为4的块,如果匹配,则说明4之前的属性集合里面有符合的值,再对半跳转到步长为2的块,继续查询。

vchain,硕士学习,区块链
通俗的举例,假如有9个区块,按他2的n次幂跳表,会跳到8。第一种情况是8不匹配,也不能返回VO,因为9还没查,还得往上查完9才能确定。第二种情况是8查到了,就跳到4,4查到了,再跳到2。如果4 匹配,2不匹配,说明这个数据在4号或者3号区块里面,再往上逐个查。知道确定到某个准确的区块位置。文章来源地址https://www.toymoban.com/news/detail-806128.html

三、查询成本低

  1. 设计固定大小的AttDigest摘要字段,返回用户的数据更小,开销更低。
  2. 采用特殊的订阅查询索引(IP树)减小返回不匹配结果验证的成本。

到了这里,关于Vchain:可验证的查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【电网异物检测硕士论文摘抄记录】电力巡检图像中基于深度学习的异物检测方法研究

    根据国家电力行业发展报告统计,截止到 2018 年,全国电网 35 千伏及以上的输电线路回路长度达到 189 万千米,220 千伏及以上输电线路回路长度达73 万千米。截止到 2015年,根据国家电网公司的统计 330 千伏及以上输电线路故障跳闸总数中外力破坏作为主要原因的事故占到了

    2024年02月15日
    浏览(57)
  • golang 区块链:验证签名

    1.遍历交易集合txs获取全部的消费记录inputMap 2.从区块链获取inputMap的消费记录input对应的output 3.传入output的集合,逐笔验证签名 验证: 1.复制一份新的交易对象(input的签名和公钥置空) 2.对复制的交易进行hash,获取签名需要的hash ( 获取input的output所在的交易 设置vin的公钥

    2024年02月12日
    浏览(47)
  • 区块链记账流程,广播如何验证?区块链共识机制之POA

    目录 区块链记账流程,广播如何验证? 细说区块链共识机制之POA 利用区块链技术实现不记密码加密存

    2024年02月11日
    浏览(47)
  • 数据验证技术:保护区块链系统的关键

    区块链技术作为一种去中心化的分布式账本,具有高度的安全性、可靠性和透明度。然而,区块链系统也面临着诸如51%攻击、双花攻击等严重安全风险。为了保护区块链系统的安全,数据验证技术成为了区块链系统的关键。 数据验证技术是一种在区块链系统中用于验证交易和

    2024年04月28日
    浏览(35)
  • 以太坊区块链网络部署及验证实验

    国科大2023秋季学期计算机网络实验,简单记录一下实验流程 在 Ubuntu 上安装 Go 1.19 版本可以通过以下步骤进行: 1.1 下载 Go 1.19 首先,打开终端。从 Go 语言的官方网站下载最新版本。使用 wget 或 curl 命令下载 Go 1.19 的 tarball。 确保下载链接是最新的,可以在 Go 语言官方下载

    2024年02月04日
    浏览(76)
  • 安全区块链(区块链合约安全查询)

    区块链中的安全性来自一些属性。 1.挖掘块需要使用资源。 2.每个块包含之前块的哈希值。 想象一下,如果攻击者想要通过改变5个街区之前的交易来改变链条。如果他们篡改了块,则块的哈希值会发生变化。然后攻击者必须将指针从下一个块更改为更改的块,然后更改下一

    2024年02月11日
    浏览(41)
  • 《NFT区块链进阶指南二》Etherscan验证Solidity智能合约(Remix插件验证)

    前置参考文档:https://blog.csdn.net/sinat_34104446/article/details/130557703 合约验证是上传合约源代码到etherscan过程,在智能合约项目中,通常都是提供源码验证,增加项目信任度 验证合约后可以直接在etherscan上执行获取和设置方法,方便日常的管理员维护 以下使用remix进行验证并使用

    2024年02月05日
    浏览(76)
  • 区块链跨链是如何进行验证的?

    跨链是区块链生态中一个十分重要的环节,它将不同的区块链连接成一个整体,使得数据信息能够更好的流动。 未来区块链的发展必然是一个多链并存的状态,这一趋势从以太坊由去年年初将近100%的市场占有率下降到目前约60%的市占率,就可以很直观地看出多链生态正在逐

    2024年02月11日
    浏览(44)
  • 区块链中如何验证交易存在? 如何验证交易不存在?Merkel Proof和Merkel Tree的应用——中山大学软件工程学院专选课《区块链》课堂小测

    Merkle Proof 是一种用于验证区块链中某一特定交易确实存在于某一区块内的机制。这一机制是基于 Merkle Tree(默克尔树)的结构来进行的。 默克尔树是一种二叉树,其中每个叶节点是某个交易的哈希值,每个非叶节点是其子节点哈希值合并后再哈希的结果。 验证步骤: 找到交

    2024年02月08日
    浏览(50)
  • 【区块链 | Merkle】使用Merkle Tree空投,白名单验证

      Merkle Tree在高效验证数据的同时减少了链上计算和存储,因为非常适合基于区块链的白名单验证,空投,IDO等需要验证数据的业务。 默克尔树,在区块链出现前,曾广泛用于文件系统和P2P系统中。 在区块链中,默克尔树常用于高效验证数据,如,实现空投,白名单,IDO,混

    2024年02月04日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包