本项目是笔者在学习Fabric过程中做的一个集成了前后端以及Fabric的Demo——基于区块链的医疗信息共享。
代码中难免有拙陋之处,部署的流程、前后端、后端与Fabric网络的交互均已经过测试,如部署中出现问题或者有哪部分写的不够详细的,都可以提Issue与我联系,下面的搭建流程中仅演示了关于区块链的部分,其他的并未演示(也未尽完善,以后有时间再补充)
项目中上链的过程采用非对称密钥RSA进行加密,通过本地IPFS来模拟文件的存储,区块链采用的Fabric。
SDK采用的是Node SDK;Fabric版本是1.4.4;链码是用Go编写,后端是用的Node的Express框架
第一部分主要是环境的预安装(所有需要的工具包,笔者均已经放在MedRec文件中,无需其他的下载,至于其他的一些Node,mysql的一些环境,可以自行网上教程安装,只要版本对即可)
第二部分是项目的演示
一.准备
(1)系统为Ubuntu16.04(我是搭建的虚拟机)
(2)在ubuntu上安装Mysql,版本是5.7.31,按照网上教程安装即可。
(3)在MedRec的目录中找到database目录中的MedRecord.sql文件(这是项目中需要使用的本地数据库的文件)。将该文件导入到Ubuntu中的mysql数据库中。(我此处新建的数据库名是MedRec)
如果你是在Windows上搭建的虚拟机环境,可以像我下面一样,使用Navicat远程连接到虚拟机,将上面sql文件导入虚拟机的Mysql数据库中
下面是导入之后的数据库MedRec的表:
导入表后,查看hospital与user表中有没有记录,有的话删除!!!!一定要删除!!
导入之后两个表中各有两条记录,删除即可
(3)可选:安装nvm版本为0.33.10(版本不限制,nvm是用来管理node版本的一个工具,可以很方便地安装node,轻松地切换node和npm版本),当然也可以不用nvm安装,主要是为了安装Node。你可以选择自己的方式安装Node
(4)使用nvm安装Node.js版本为v10.19.0(npm和cnpm都是下载node依赖的管理工具,类似于java中的maven,注意npm一定要配置国内镜像源,不然会下载很长时间卡死)
(5)安装go语言环境,版本为>=1.11及以上均可,此处是用的1.11版本
以上的基本环境安装使用网上教程安装即可,这里不做赘述
(6)安装go-ipfs,用来搭建本地IPFS,这里使用go-ipfs\v0.4.23\linux-amd64.tar.gz,这个在github上下载比较慢,在MedRecord目录的IPFSInstall文件夹中已经提供了
将文件中的压缩包拷贝至虚拟机中的“home” 目录下,比如这里我的是
解压:
tar -xzvf go-ipfs_v0.4.23_linux-amd64.tar.gz
此时会看到在同级目录下生成了go-ipfs文件夹
配置全局使用IPFS的环境:
sudo mv go-ipfs/ipfs /usr/local/bin/ipfs
如果此时在终端中运行:
ipfs
出现以下,就说明安装成功
初始化本地的IPFS环境:
ipfs init
这样就初始化成功了,执行上面的这个ipfs cat /ipfs/xxxxxxxxxxxxxxxxxxxx(这个hash每个人不一样,执行自己机器上面的即可)
ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
出现下面:
启动本地的IPFS 守护进程(只有启动这个才能使用IPFS上传文件并访问IPFS上的文件):
ipfs daemon
至此,IPFS的环境已经搭建完毕,下面来试试IPFS简单的文件上传使用,这个进程在项目中不要关闭,后台一直运行
上传一个文件试试,在同级目录下创建一个文件 a.txt,文件内容如下:
将该文件上传(在a.txt目录下执行):
ipfs add a.txt
看到added后面有一串hash,这个就是标识a.txt文件在IPFS上的hash地址,通过该地址就可以通过ipfs特定的网关(ipfs daemon启动后可以看到本地网关以及端口是127.0.0.1:8080/ipfs)拿到a.txt文件
所以通过127.0.0.1:8080/ipfs+hash地址即可访问文件,打开浏览器:
http://127.0.0.1:8080/ipfs/QmWcNW1SSeYzYzHhVXHaXrZaTnRVce1BEoffQqWUHsr4Fu
即可看到我们上传到IPFS的文件。
此处是用的本地网关访问的,也可以使用其他的IPFS网关进行访问,即使可以访问外网,也需要等一段时间才能拿到文件。此处是为了方便测试和使用,使用了本地的网关,IPFS有好多备用的网关可以访问,网上可以搜索到很多
到这里,IPFS的本地节点部署就结束了,之后的病例文件也是通过这种方式上传访问(只是用了特定语言的IPFS API进行上传,底层还是一样的,都是通过这种 ipfs add的方式)
注意:MedRec文件夹所在的目录要放置正确,最好上图的目录一致,不然可能会出现路径错误,因为项目中有部分写死了。
(1)保证数据库的表hospital和user表中没有任何记录,有的话删除
(2)保证/home/用户名/go/src/github.com/hyperledger/MedRec/App/server/Identity/wallet目录下面没有任何文件,有的话删除!
(3)启动IPFS本地进程,即运行ipfs daemon 启动即可
(4)如果是第一次将项目复制进虚拟机,需要下载相关的依赖(也可以用cnpm下载的依赖,当然用npm下载依赖会比较慢,因为墙的原因,使用npm下载时需要配备淘宝镜像源下载地址)
在以上的三个目录中下载相应的依赖。
进入以下目录:
启动网络,执行:
./start.sh up
启动网络需要一会时间,取决于你机器的配置..........................................(启动过程中启动了三个通道,三个链码,但是我们只用到一个通道commonchannel,两个链码information和recordpa)
出现以下即表示网络启动成功
<<<<<<< HEAD 注:(1)如果在启动网络时出现了超时错误,不会影响网络的启动,系统会自动尝试10次,但是如果出现了明显的比较严重的error,此时停止网络的启动,然后执行 ./start.sh down 再重新执行 ./start.sh up 启动网络,一般这种情况不多,但是出现过,网络启动过程中出现比较严重的timeout错误,只要把网络down掉重启即可
(2)在每次网络启动之前,需要执行 ./start.sh down 将网络环境清理干净启动,避免出现报错!!!
启动后端之前请修改server目录中的config.json文件中的database和dbpassword字段为自己的数据库和密码(我这里新建的数据库名是MedRec,密码是csj123zxc,所以只需要修改为你自己的数据库名和密码即可)
(3)启动IPFS本地节点:
所以,本项目的部署启动,需要四个终端:两个后端程序node(分别模拟医院和患者),一个启动IPFS,一个启动Fabric网络
演示顺序严格按照以下的顺序执行!!!
点击注册,显示页面即可,但此时不要真的进行注册,因为我们还没有医院
这里之所以先访问这个注册页面是因为,之前在写页面的时候,把Fabric管理员用户生成放在了这个页面(后序会把这个改一下,这里不影响使用,只需要注意演示的顺序即可),跳转到注册页面之后,管理员admin才会生成,后面的普通用户注册时需要用到管理员
此时,进入目录
/home/用户名/go/src/github.com/hyperledger/MedRec/App/server/Identity
可以看到多出了一个文件/wallet/admin
点击注册(注意密码要6位!!!!)
(注意:医院为第一人民医院的时候,用户名必须写h1;医院为第二人民医院的时候,用户名必须写h2,因为这个在后端中写死了,并没有做更改,以后有机会再做优化,这里并不影响使用,因为本项目就只是做的两个医院)
我们可以在/home/用户名/go/src/github.com/hyperledger/MedRec/App/server/Identity可以看到wallet文件夹中看到hospital1文件夹,其中出现这样几个文件即可代表注册hospital1成功(前两个文件是RSA公私钥,后三个是fabric网络通信的身份文件以及私钥):
点击sumit之后,进入后台,可以看到(第一次注册的时候,期间可能要等待一会,注意观察后端终端情况......直到后台终端出现下面的 has been submit的时候才算上链成功)
此时就是上链成功!!!
然后注册医院2(和医院1的注册方式一样)
同样是上面的步骤,检查是否成功注册,并上链。
http://192.168.162.139:8081/goRegister
注册之后不要着急做操作!!!!,注意后台还没有操作完成,正在进行患者公钥上链操作,等上链完成再操作
并且注册之后页面会直接跳转到登陆(咱们选择相应的医院直接进行登陆即可)
点击登录之后,跳转到以下页面
完善患者个人信息,点击保存
后台信息如下:
查看数据库中patient表中会有一条记录
此时病人信息登记成功,然后就是问诊,点击左边栏问诊,然后点击心内科
填写自己的病情信息,保存即可
用户名填h1,此时就代表咱们登入的是医院1 (因为刚刚病人波多野在医院1进行了病情描述,我们现在就是在医院1下面看下情况,从而进行问诊)
登录之后,点击医生工作站中的诊断病人
可以看到患者波多野之前在医院1的就诊记录(病情描述),点击这条记录
选择症状
点击保存,此时就会出现该病的处方。
然后导出病例
此时咱们可以在/home/用户名/go/src/github.com/hyperledger/MedRec/App/server/hospital-management-system-master/file目录中看到生成了病例 文件9.txt
打开可以看到是患者的病情和医院诊断的信息还有其他一些详细信息,待会咱们就把这个文件上传至IPFS
选择上传病历
注意:qqq是波多野的用户名
点击上链,可以看到后台正在将病历上传至IPFS,然后将返回的hash上链,稍等一会!!!出现下面才是成功了
此时,医院就将病人被诊断的病例信息上传IPFS和Fabric了,病人可以登录之后看到病例
如果出现了这种错误,说明身份失效了,需要重新登陆医院1.
登陆之后点击左侧的链上就诊信息(注意医院名是hospital1而不是h1)
点击查看历史,可以看到,病人有一个历史病例,就是刚刚医院上传的,这里可以查看病例,并且授权其他医院访问(此处就是病人的病史查询功能和授权功能)
点击hash地址查看如下:(注意:这里查看的时候,要在虚拟机里面打开浏览器访问这个hash地址链接)
然后病人点击授权病例(此处授权医院2即hospital2)
点击授权,查看后台终端:
授权成功!!!
点击医生工作站中的查看第三方病例
查看到病历
点击hash地址链接
可以看到被授权的病例,到此,病例共享的过程就结束了!!!