简介
VQL(Verifiable Query Layer)可验证查询层,提供面向查询的云服务
中间件层负责从底层区块链系统中提取数据,并在数据库中高效重组
为了防止伪造中间件中的数据,根据构建的每个数据库计算一个指纹
系统
三层:底层区块链层,中间件层(云查询服务),上层应用层
中间件层
负责对区块、交易、账户额度等所有信息进行抽取和重组,构建数据库以支持高效的数据查询和数据分析。
如图所示,中间件由一个微型数据库列表组成,其中包含指定时间点后的每个时间间隔(例如,在每一天)内产生的数据。
每个数据库有一个头部数据,保存着该数据库对应的哈希值,以用于验证数据的完整性
设置更新时间(如一天、一小时),每到更新时间,就从已经确认了的区块中获得数据,重组记录在数据库中,并生成相应的指纹,该指纹会由矿工进行验证并且保存上链,以保证其不被篡改
中间层数据库可验证
矿工:验证中间件层中数据库的指纹,并将其上链
用户:可以选择信任矿工验证后的指纹,或者可以从信任的矿工处获取指纹后自行验证(验证过程同矿工)
数据库指纹
由两个部分决定:数据库中的数据内容以及构建的数据库的属性(数据库名称、构建时间、大小、软件版本等)
指纹具有平台无关性,保证了矿工只要在数据库中存储的数据相同,就可以获得相同的指纹。
生成过程:
- 首先将数据格式统一化
- 使用哈希函数计算签名
- 矿工使用该指纹确认数据库中保存的数据是否与链上的数据一致
数据库验证(矿工验证指纹并上链)
由于矿工本地存有链上数据,因此可以自己生成一个指纹,和中间件层中数据库的指纹相比较,即可进行验证
应用程序可以在检查存储在区块链中的数据库指纹后,信任来自中间件层的数据
验证流程:
- 对比中间件层的数据库的指纹和本地生成的数据库的指纹
- 一致的话,就将这个指纹插入到MPT中,将这个MPT的根以及数据库指纹上链,并将MPT同步到中间件层
数据库验证失败(矿工验证失败)
若发现不一致,矿工发送错误报告给中间件层
中间件层收到一定数量的错误报告后,会启动错误诊断以及修正,直到没有错误报告出现为止
出现分叉,就重新构建数据库和对应的指纹
用户验证
需要下载全部区块数据进行验证
使用MPT保存数据库指纹
该MPT会保存在矿工处和中间件层中
每次矿工完成验证数据库有效性并将数据库指纹写入区块链时都会更新
可验证查询过程
用户需要:
从中间件层的云查询服务获得
- 查询包含的所有子数据库
- 查询结果
- 所有子数据库指纹以及对应的merkle proof
从矿工处获得
- 链上保存的MPT的根
用户验证流程:
- 先验证merkle proof生成的根与链上保存的MPT的根是否一致
- 验证指纹是否真实存在
- 在子数据库中进行查询,与云端查询结果进行对比
数据可靠性分析
矿工的激励机制
由于区块链系统的需求和场景不同,我们的查询模型中对矿工的奖励方案可能不同。
在私有链中,矿工和中间件层都是私有的,所以不需要给予奖励
联盟链中取决于各方的协议,可以选择让中间件层付一些费用
公链中,中间件层需要对验证数据库成功的矿工给予奖励
在实际应用中,可以这样做:
- 验证过程、奖励机制和指纹的管理都在区块链对等节点中进行硬编码
- 借助智能合约,用于矿工对数据库的验证,也可以用智能合约来保存MPT的根
- 给验证成功的节点奖励
查询结果的可验证性
当用户向矿工请求数据用于验证时,需要该矿工是绝对可靠的