基于Fabric+IPFS大规模数据上链方案

数据共享214,917阅读模式
摘要

Fabric+IPFS哈希上链方式,无需全部数据上链即可产生信任,介绍整体项目设计软件架构以及操作验证方式。

 

基于Fabric+IPFS大规模数据上链方案

 

区块链是创造信任的机器,但是数据存储与读取的效率十分低下,两者不可兼得的情况下,一种新的方式,既弥补区块链的效率,又能利用其“信任”与“不可篡改”特性。该方案使用区块链+分布式存储。

Fabric简介、适用场景:Hyperledger Fabric的出现是对传统区块链模型的一种革新,在某种程度上允许创建授权和非授权的区块链,Hyperledger还通过提供一个针对身份识别,可审计、隐私安全和健壮的模型,使得缩短计算周期、提高规模效率和响应各个行业的应用需求成为可能。

IPFS简介、适用场景:分布式存储

Fabric+IPFS优点、适用场景:无需全部数据上链即可产生信任

一. 功能简介

本系统以后台服务开发为核心,作为链接客户端、IPFS及Fabric区块链的服务部件,如图1所示。当大量数据需要可靠实时地存储,并且在未来需要得到验证时,必须将数据以某种形式存入区块链。而传统区块链系统为了“安全”而牺牲“效率”,因此其数据存储的容量与速率非常低下,因此不能存放大规模数据。基于这种考虑,我们可以利用区块链+分布式存储的方式解决大规模数据上链的问题,将原始数据存于类似IPFS等分布式系统中,并将源文件的地址存储于区块链永久保存,用户可以通过区块链上文件的地址信息随时去获取这些数据。同时为了保证IPFS上数据不被篡改,必须将文件的指纹(Hash算法结果)也一并存入区块链,这样用户可以将得到的链上数据进行验证,以确定数据的完整性与可靠性。

基于Fabric+IPFS大规模数据上链方案

图1 后台服务架构

后台服务采用nodejs编写,总体功能可分为两部分:

数据存储:后台可将数据打包成块并向IPFS发送,所有数据存储在IPFS上,然后将IPFS上文件存储地址以及文件指纹存在Fabric区块链网络上,这样可公开验证数据。

数据查询:客户端可以通过查询内容的方式,即基于内容检索得到Fabric以及IPFS上具体信息。

二. 运行环境

硬件支持

  • 本后台服务需要Fabric区块链网络以及IPFS节点的支持。
  • Fabric若以伪集群的方式运行,则推荐配置为四核cpu内存8G,操作系统centos7 /Windows10配置或以上。
  • IPFS运行单节点,推荐配置为单核cpu内存2G操作系统centos7 /Windows10配置或以上。
  • Nodejs服务推荐配置为双核cpu内存2G操作系统centos7 /Windows10配置或以上。

软件支持

  • go-ipfs version: 0.4.18
  • nodejs version: 8.1.0
  • go version :go1.9.2 windows/amd64
  • docke version: 18.09.2
  • docker-compose version: 1.23.2
  • Hyperledger Fabric version: 1.1.0
  • ipfs version: 0.4.18

 

三. 功能概述

3.1 软件功能流程图

该后台软件主要处理大规模数据上链,因此重在数据存储和数据查询两部分逻辑,整个流程图如图2所示。当数据存储时,后台服务不断收到来自客户端的数据时,每接受一条数据需要先判断是否是正确的传输格式,并统计该客户端发送数据条数。每个不同的客户端有唯一ID,数据以ID作为索引键值,故以“天”为单位进行数据块打包,即一天的数据作为一个独立数据块,这样方便管理和查询。在达到预定义区块大小(一日的数据量)时对客户端数据进行分块打包,每次打包完块后立即存入IPFS,并获取IPFS存储块的地址。然后,将该数据块的IPFS地址以及文件指纹存入Fabric区块链进行保存。

当数据查询时,客户端发起请求获取原始数据,服务启动Fabric链,然后查询链码是否存在该ID、日期下的IPFS地址信息,若不存在,这说明不存在数据,否则继续查询IPFS。根据IPFS上对应数据块文件的Hash地址从IPFS上拿到原始数据,并可以利用Fabric上文件指纹与IPFS上原始数据进行比对验证,若两者一致则可以确定该数据块未被篡改。

基于Fabric+IPFS大规模数据上链方案

图2 软件流程图

3.2 功能设计详细描述

(1) 数据存储

数据存储功能实现流程图如图3所示,下面是详细步骤:

1) 客户端通过http-post方式以特定数据格式(Json)向后台服务发送数据

该后端服务会记录每一个连接的客户端处发来数据数目,并更新其数据文件指纹,当达到预设值时,进行打包操作,并使用流的方式向IPFS发送数据。

2) 数据块存储在IPFS上,然后返回存储地址

3) 后台服务将先前计算的文件指纹与IPFS文件存储地址组合且生成新的一条上链数据,然后通过调用Fabric链码将信息存储在Peer节点账本上。

4) Fabric向服务端返回本次存储交易的Hash值。

基于Fabric+IPFS大规模数据上链方案 图3 数据存储功能实现流程图

(2) 数据查询

数据查询功能实现流程图如图4所示,下面是详细步骤:

1) 客户端通过唯一ID值和日期等内容查询相关信息,通过http-get方式向服务后台请求数据。例如请求url:http://localhost:60003/querydata?obdid=X7777-S6665&date=2019-4-3,是用户查询的接口,意思是ID为X7777-S6665日期为2019-4-3这天的该日数据块。

2) 后台将会自动启动Fabric链码容器,执行链码中相应的查询方法。

3) Fabric将匹配正确的数据(包含IPFS文件存储地址以及文件指纹)返回。例如如下信息:

{"obdid":"X7777-S6665","dataDate":"2019-4-3","ipfsAddr":"QmfQJujeYWgX2Fn15nSLY7xApG7qQo3imz9S3UVxRcRiTi","fileFingerprint":"21358B2F61C5B5DDD515F7046765BA43E8B643DCE26985BFD45A1BD02E9201A8"}

4) 后台通过Fabric数据中的IPFS文件存储地址去查询IPFS网络,并返回匹配的整个数据块。

5) IPFS根据Hash地址返回对应的整个数据块的文件信息,随后在服务端可以进行对文件的验证,以检验存储数据是否被篡改。

基于Fabric+IPFS大规模数据上链方案

图4 数据查询功能实现流程图

 

3.3 存储结构

(1) Fabric账本结构

Fabric账本结构指的是Fabric网络中相应通道中Peer节点存储数据的格式,如图5所示。Fabric以<k,v>键值对的形式存储及查询数据,因此唯一ID作为主“键”,所有信息存于该键下(采用Json嵌套格式)。这样,每个ID下存储所有该ID相关的所有信息。当查询时,使用唯一ID值便可查出所有该ID下的值。

基于Fabric+IPFS大规模数据上链方案

图5 Fabric账本结构

(2) IPFS存储结构

IPFS中存储所有源数据的数据块,数据块存储没有顺序,只是每个数据块与hash地址的关系一一对应,如图6所示。而hash地址与具体信息的映射关系存储于Fabric区块链中。

基于Fabric+IPFS大规模数据上链方案

图6 IPFS存储结构

四. 操作说明

4.1 客户端上传数据

用户通过http-post方式向服务后台传输Json数据,新客户端向服务端不断发送数据,启动模拟数据服务(每秒向后台发送一次数据),以车辆obd数据上链为例,打印日志如图7所示:

基于Fabric+IPFS大规模数据上链方案

图7 模拟数据发送日志

4.2 后端接受数据并处理

后台系统网络全部启动完毕之后(Fabric网络启动,IPFS启动),使用命令运行nodejs后台程序:node server.js

当数据块打包完成时,后台日志如图8所示:

基于Fabric+IPFS大规模数据上链方案

图8 后台服务打包区块时日志

4.3 客户端查询/验证数据

查询fabric区块链网络上相关数据:通过唯一ID(obdid)以及日期来查询fabric上文件存储记录,可以得到IPFS上文件存储地址ipfsAddr,文件的指纹哈希fileFingerprint。http-get获取数据结果如图9所示:

基于Fabric+IPFS大规模数据上链方案

图9 用户通过内容获取Fabric数据

 

查询IPFS上相关数据:将ipfsAddr作为http-post的参数传给服务器,通过该ipfsAddr可以再次查询到IPFS上整个数据块,如图10所示。客户端可以对整个数据块进行指纹验证,计算数据块指纹与fileFingerprint参数比较,若一致,则证明数据完整未被篡改。

基于Fabric+IPFS大规模数据上链方案

图10 用户通过Hash获取IPFS数据

(完)

项目gihub地址(已更新):

https://github.com/newfin/dataCompressWithFabricAndIPFS.git