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

2020年9月7日14:44:17212,5283
摘要

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

更多区块链技术与应用分类:

区块链应用    区块链开发

以太坊 | Fabric | BCOS | 密码技术 | 共识算法 | 比特币其他链

通证经济传统金融场景 | 去中心化金融 | 防伪溯源 | 数据共享 | 可信存证

 

 

基于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文件存储地址以及文件指纹)返回。例如如下信息:

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


原文链接:基于Fabric+IPFS大规模数据上链方案

  • 本文由 发表于 2020年9月7日14:44:17
  • 转载请注明:https://www.wanghaoyi.com/fabric-ipfs-technical-solution.html
WeIdentity Sample案例演示记录 BCOS

WeIdentity Sample案例演示记录

WeIdentity是一套分布式多中心身份认证的技术解决方案(去中心化身份),由微众银行开发。本文对官方WeIdentity Sample 开发样例进行测试记录。 WeIdentity Sample ...
安全多方计算与证券业数据生态 传统金融场景

安全多方计算与证券业数据生态

区块链技术的出现,使得各方事务在去中心化的方式下协调执行,数据在不可篡改、公开验证的方式下共享,这种特性天然适合用以解决证券行业信息共享的问题。但是,在传统区块链系统中,事务涉及数...
区块链电子签名技术及方案 可信存证

区块链电子签名技术及方案

数字签名技术是电子签名的底层核心技术,由非对称密钥加密技术和数字摘要技术构成。首先发送方利用Hash函数对文件内容进行加密并生成数字摘要,然后利用私钥对数字摘要加密形成数字签名;接收方利用发送方提供的...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:21   其中:访客  13   博主  8
    • 是爱笑的小姐姐呀 是爱笑的小姐姐呀 2

      博主 我可以在论文中引用你这篇文章嘛

      • if_not if_not 0

        大佬,配置文件太难写了,总是compose不起来 :cry:

          • Harry Wong Harry Wong

            @ if_not 是版本太老了吗 :eek: ,自己先随便启个链再结合新的api试试?~

          • 区块链菜鸟 区块链菜鸟 1

            大佬,github地址打不开啊

            • 粟 1

              博主好,请问我可以在论文中引用你这篇文章吗?谢谢! :oops:

                • Harry Wong Harry Wong

                  @ 你好,可以的哈~

                  • 是爱笑的小姐姐呀 是爱笑的小姐姐呀 2

                    @ 你好,请问一下你想用在什么领域啊,我也打算在论文中引用一下博主的这个方案,会不会重复啊

                  • yangyangaa yangyangaa 2

                    您好,请问var tempdir = “./caconfig/nodejs/fabric_sdk_node/fabric-client-kvs”;该目录下存放的文件是什么?我在网上找了好久没有找到相关内容,需要替换成自己的吗?

                      • Harry Wong Harry Wong

                        @ yangyangaa 这里面存放的是sdk证书,用于发起交易者的身份验证,比如里面这个文件名称为“Admin”,内容是:{“name”:”Admin”,”mspid”:”Org1MSP”,”roles”:null,”affiliation”:””,”enrollmentSecret”:””,”enrollment”:{“signingIdentity”:”9edbf3ff227c9efe9cc36febff379d0d1e1fec30787a1edd0dbbfe1fb65c04d8″,”identity”:{“certificate”:”—–BEGIN CERTIFICATE—–\nMIICEzCCAbqgAwIBAgIRAN1+ehQKsifIdcQrUeEPmxwwCgYIKoZIzj0EAwIwbzEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xFzAVBgNVBAoTDm9yZzEudHJhY2UuY29tMRowGAYDVQQDExFjYS5v\ncmcxLnRyYWNlLmNvbTAeFw0xOTAzMDYwODExNTFaFw0yOTAzMDMwODExNTFaMFkx\nCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4g\nRnJhbmNpc2NvMR0wGwYDVQQDDBRBZG1pbkBvcmcxLnRyYWNlLmNvbTBZMBMGByqG\nSM49AgEGCCqGSM49AwEHA0IABGOcgkhXYeVU5v9ofV/O29bjQCu8hYecz9ClCDwy\nuPrdKAM+1dIO0ppstnsgNIJOjxo8zn4e54cGXBlwkKQLqP2jTTBLMA4GA1UdDwEB\n/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIJcCDKTW/wM4aS+f7zhy\nuVLkECa2Vt8MMAdsHPRQ3LP2MAoGCCqGSM49BAMCA0cAMEQCIHM0t03R7TGlT9Gc\nbUdOhfCSkFriI9fjDo2fmvYfSoueAiAtyDGyHylrJXeUFCA1ywsjPbuQRaXoTPd5\nXR8WW9AxZw==\n—–END CERTIFICATE—–\n”}}}

                      • yangyangaa yangyangaa 2

                        大神您好!请问可以分享一下文章中使用的智能合约代码吗?我想要复现一下,可以发我邮箱吗?谢谢您!祝您生活愉快,2021心想事成~

                          • Harry Wong Harry Wong

                            @ yangyangaa fabric上的合约代码非常简单,只需要get/set功能。因为存的“键”是一个id,“值”是Json字符串。看fabric合约示例,几行代码就搞定了 :oops:

                            • 是爱笑的小姐姐呀 是爱笑的小姐姐呀 2

                              @ yangyangaa 您好 请问您复现出来了吗,我也打算复现一下

                            • sousou sousou 0

                              keystore 和 signcerts 中的内容从哪获得

                                • harrywong harrywong

                                  @ sousou 代码中确实有,这是你在向Fabric发送交易时需要用到的用户证书及私钥,需要你自己在搭建Fabric网络时生成,可以由Fabric自带工具生成(如cryptogen generate –config=crypto-config.yaml –output ./caconfig),也可以由Fabric-ca生成。总之,是Fabric区块链认可的、交易发起者的证书。

                                    • yangyangaa yangyangaa 2

                                      @ harrywong 您好,请问是把生成的证书放到这两个目录下面吗?

                                        • Harry Wong Harry Wong

                                          @ yangyangaa 在代码里fabricServer.js,getOrgUser4Local方法中,keyPath和certPath定义

                                            • yangyangaa yangyangaa 2

                                              @ Harry Wong 是的,我想在本机中该如何配置,是把证书放到keyPath和certPath的路径中去吗?

                                                • Harry Wong Harry Wong

                                                  @ yangyangaa keyPath目录下存放的是私钥,certPath下放的是证书。先看下fabric官方的demo了解下基本的结构和流程