Hyperledger Fabric是Linux Foundation提供的开源区块链平台。借助它,您可以创建区块链应用程序并控制区块链中数据的访问和权限。如果您要创建私有区块链网络或对双方可以看到的交易设置限制,则应使用Hyperledger Fabric。在Hyperledger Fabric的文档中,使用Docker在一台机器上创建区块链网络是经过精心计划的,其中每个网络成员都是一个单独的容器。但是没有描述在多个物理或虚拟机上建立网络的过程。这将在本文中讨论。我们的区块链应用程序是用于存储学校和学龄前儿童的一些医疗数据的服务。数据必须保持不变。它们将以有关疫苗接种以及患者与特定医生的协议信息的形式呈现。该网络将包括父母(代表父母利益的组织),医院(父母可以与儿科医生签署一项照顾子女的协议的医院)和幼儿园(可以要求健康报告和疫苗接种的幼儿园)的成员。或医院的另一个孩子)。亚马逊管理的区块链
AWS提供了Amazon Managed Blockchain服务。它允许您使用AWS控制台用户界面部署区块链网络。但是,在积累了使用Amazon Managed Blockchain的经验之后,我们不得不放弃在商业项目中使用该服务的想法。有几个原因。主要的是:- Amazon Managed Blockchain中仅提供Hyperledger Fabric 1.2版本,在撰写本文时,版本1.4用于构建企业区块链网络。它还不允许使用现代版本的Node.js SDK工具;
- Amazon Managed Blockchain不支持CouchDB数据库,这使得创建索引已存储数据的应用程序变得困难。
因此,我们认为最好使用虚拟或物理服务器通过Hyperledger Fabric框架来构建网络。关于应用程式频道
Hyperledger Fabric具有“通道”的概念。通道是进行敏感交易的子网。我们的应用程序中将有两个渠道。- “家长医院”。它旨在用于父母与医院组织成员之间的交易:创建和修改病历,与儿科医生达成协议以及签署儿科医生协议。
- “家长学校幼儿园”。在此渠道中,家长和医院成员将与幼儿园成员互动。此外,将基于医疗记录中的数据生成报告。
工作环境
我们将使用Docker Swarm部署我们的区块链网络-这是用于部署主机集群的本地Docker系统。如果您从未使用过Docker(尤其是Docker Swarm),那么请首先查看此产品以及如何使用Docker Swarm编排容器。该文档很好地描述了使用这些工具的基础。我们的整个网络将位于AWS EC2服务器上。区块链网络中的信息将存储在CouchDB中。Hyperledger Fabric还支持LevelDB数据库,但与后者不同,CouchDB使得可以按文档集中的任何条件进行搜索。我们还将使用Fabric证书颁发机构,这是用于管理所有组织及其用户的网络标识符的模块化组件。它提供网络参与者的注册和证书的颁发。我们将有四台EC2服务器:- 订购者,MySQL DB(用于存储不适用于病历的应用程序信息)
- 家长组织(Peer0,Peer1),CouchDB,Fabric-CA,CLI
- 医院组织(Peer0,Peer1),CouchDB,Fabric-CA
- 幼儿园组织(Peer0,Peer1),CouchDB,Fabric-CA
在AWS上创建EC2服务器
我们需要t2.medium服务才能工作。这种EC2服务器具有足够的计算能力,可以安装所有必需的软件并与Hyperledger Fabric工具一起使用。在“配置安全组”中,设置“所有流量”,然后设置“源”-0.0.0.0/0,:: / 0。
图。1。在AWS面板中配置安全组。我们有四台EC2服务器:- ec2-18-232-164-119.compute-1.amazonaws.com
- ec2-54-145-203-186.compute-1.amazonaws.com
- ec2-54-80-241-117.compute-1.amazonaws.com
- ec2-52-87-193-235.compute-1.amazonaws.com
您自然会拥有通往EC2服务器的路径。
图2。为操作EC2服务器做准备。在EC2服务器上安装必备软件
现在,在每台EC2服务器上,我们需要安装Docker和Git。为了方便起见,请在终端中打开四个选项卡。让我们通过SSH进入每个EC2服务:终端1:HOST1=ec2-18-232-164-119.compute-1.amazonaws.com
ssh ec2-user@$HOST1 -i ./key-poc.pem
2号航站楼:HOST2=ec2-54-145-203-186.compute-1.amazonaws.com
ssh ec2-user@$HOST2 -i ./key-poc.pem
第三航站楼:HOST3=ec2-54-80-241-117.compute-1.amazonaws.com
ssh ec2-user@$HOST3 -i ./key-poc.pem
4号客运大楼:HOST4=ec2-52-87-193-235.compute-1.amazonaws.com
ssh ec2-user@$HOST4 -i ./key-poc.pem
在每个终端中,执行以下命令:sudo yum update -y
sudo yum install -y docker
sudo service docker start
sudo docker info
sudo yum install git
sudo usermod -a -G docker ec2-user
newgrp docker
现在我们已经安装了Docker和Git。网络
我们需要从存储库中克隆网络的元素。为此,请在每个终端中执行命令:git clone https://github.com/nixsolutions/blockchain-poc-network.git network
我们还需要从存储库中克隆智能合约,以管理网络参与者之间的关系。智能合约以Golang语言编写。我们在四个服务器的每一个上执行以下步骤:cd network && mkdir chaincode && cd chaincode
git clone https://github.com/nixsolutions/blockchain-poc-medical-contract.git medical-contract
git clone https://github.com/nixsolutions/blockchain-poc-kindergarten-contract.git kindergarten-contract
在第一个终端中,我们需要生成通道配置文件和证书以将组织连接到网络:cd network/poc-network
./1_generate_connection_files.sh
./2_generating_channel_configuration.sh
现在,将channel-artifacts和crypto-config文件夹复制到网络父目录的poc-network文件夹中的其他三台主机。请注意:将组织复制到EC2服务器时,您需要从crypto-config / peerOrganizations文件夹中删除与其他组织的工作有关的第三方证书。例如,当复制到“家长”主机时,我们需要将Parents.poc-network.com文件夹保留在该文件夹中,但要删除hospital.poc-network.com和幼儿园.poc-network.com。创建一个Docker Swarm堆栈
为了使属于不同组织且位于不同EC2服务器上的容器能够相互访问,我们需要将它们组合成一个堆栈。让我们看一下我们的文件网络/ poc-network / docker-compose-general.yaml。它包含服务的配置,指示将特定服务(密钥node.hostname
)部署到哪些主机,并指示别名(密钥aliases
)。我们需要在第一个终端中初始化swarm:docker swarm init
docker swarm join-token manager
令牌将显示为将另一个EC2服务器附加到堆栈。类似于:docker swarm join --token SWMTKN-1-42ml0ohnnbidg8kflgp8xp9dkkus6mn1lslqc15hrxj4tk9e3q-5h4vbzbfk8p90n83oe08gbltf 172.31.46.214:2377
。现在我们可以在其余终端中执行:docker swarm join --token SWMTKN-1-2xzco7t7txohnzd09318eczpbgmm8woex80byxptpt1jl5i2ar-bsg37h40xze1gaabg80i96gw2 172.31.38.245:2377
一条消息出现在控制台中:This node joined a swarm as a manager.
将所有三台主机都连接到Swarm之后,我们可以通过运行以下命令在第一台主机的终端中看到它们:docker node ls
图3。Docker Swarm中的服务器列表。在network / poc-network文件夹中,有一个.env.template文件,您需要在其中为每个主机指定一个主机名:ORDERER=ip-172-31-38-245
PARENTS=ip-172-31-43-64
HOSPITAL=ip-172-31-38-130
KINDERGARTEN=ip-172-31-40-157
要生成.env文件,您需要运行./3_env_gen.sh文件。现在使用驱动程序创建一个网络overlay
:docker network create --driver overlay --attachable stage_byfn
运行Swarm以基于docker-compose-general.yaml文件创建堆栈:env $(cat .env | grep ^[A-Z] | xargs) docker stack deploy -c docker-compose-general.yaml stage 2>&1
使用此命令,我们还设置了环境变量,这些变量在.env文件中进行了描述,并且对于网络正常工作是必需的。您可以docker service ls
在第一个终端中执行命令。您将看到在我们所有EC2实例上运行的所有服务的列表。图4。所有EC2服务器上运行的所有服务的列表。如果您在终端中看到的与屏幕截图相同,则一切正常。现在运行我们的网络。在第二个终端中,您必须输入CLI容器(毕竟,此容器已部署在第二个主机上):docker exec -ti stage_cli.1.owni217t53m53efjtikb5oa2f /bin/bash
可以通过在终端中执行命令来查看容器名称docker ps
。在容器中,我们执行4_create_channels.sh文件中的所有命令,并将它们一个接一个地复制到终端。在bin文件夹中,我们具有用于创建网络的二进制文件:- 对等渠道创建-创建渠道;
- 对等频道加入-将对等加入频道;
- 对等频道更新-更新配置;
- 对等chaincode安装-安装代码
- 对等链码实例化-在网络上部署指定的链码。
现在,您可以通过运行命令离开容器exit
。父母回申请
在第二台主机上安装应用程序:cd ~
git clone https://github.com/nixsolutions/blockchain-poc-backend.git back
我们还需要安装NodeJS和gcc-c ++(编译器):curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
sudo yum install nodejs
cd back
sudo yum install gcc-c++ -y
npm install
我们也可以通过adminer与以下授权的数据进入我们的数据库:<HOST_1>:3306
(其中<HOST_1>
是在其上存储数据库中的第EC2服务器的地址),dev
devpass
poc_database
也有必要对我们的API的应用程序连接到数据库:vim ~/back/config/config.json
为键分配正确的值host
。我们的反向应用程序已准备好迁移和种子。您需要运行它们:npx sequelize-cli db:migrate
npx sequelize-cli db:seed:all
表应该出现在数据库中。在组织表格中,我们将在组织中看到三行-父母,医院,幼儿园。从一开始生成证书时,我们就收到了用于连接第一台主机上每个组织的网络的文件。将connection-parents.json文件从第一台主机复制到第二台主机。为此,请从我们所在的文件夹中打开另一个终端,key
然后执行以下命令:HOST1=ec2-18-232-164-119.compute-1.amazonaws.com
HOST2=ec2-54-145-203-186.compute-1.amazonaws.com
scp -i ./key-poc.pem -r ec2-user@$HOST1:~/network/poc-network/connection-parents.json ~
scp -i ./key-poc.pem ~/connection-parents.json ec2-user@$HOST2:~/network/poc-network
修复exports.hostName
constants.js(当前主机的值):vim ~/back/constants.js
在第二个终端中运行我们的应用程序:npm start
在userGenerator.sh文件中,将HOST_2
正确的值分配给变量:vim ~/back/generators/userGenerator.sh
接下来,您需要运行将创建上级组织用户的脚本:./back/generators/userGenerator.sh parents
运行脚本以生成医疗记录:node ~/back/generators/setCards.js
将在区块链中创建两张卡,这些卡也将写入卡表中的SQL数据库中。医院背部申请
与以前的后台应用程序类似,我们需要将文件放置在第三台主机上以连接到网络。为此,在第五个终端中,执行:scp -i ./key-poc.pem -r ec2-user@$HOST1:~/network/poc-network/connection-hospital.json ~
scp -i ./key-poc.pem ~/connection-hospital.json ec2-user@$HOST3:~/network/poc-network
我们将应用程序克隆到第三台主机:cd ~
git clone https://github.com/nixsolutions/blockchain-poc-backend.git back
安装NodeJS和gcc-c ++(编译器):curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
sudo yum install nodejs
cd back
sudo yum install gcc-c++ -y
npm install
修复exports.hostName
constants.js(当前主机的值):vim ~/back/constants.js
在第三个终端中运行我们的应用程序:npm start
在userGenerator.sh文件中,将HOST_3
正确的值分配给变量:vim ~/back/generators/userGenerator.sh
接下来,我们需要运行一个脚本,该脚本将创建Hospital组织的用户:./back/generators/userGenerator.sh hospital
现在,数据库的“用户”表中还有第二个用户。幼儿园回申请
与以前的后台应用程序类似,我们需要将文件放置在第三台主机上以连接到网络。为此,在第五个终端中,执行:scp -i ./key-poc.pem -r ec2-user@$HOST1:~/network/poc-network/connection-kindergarten.json ~
scp -i ./key-poc.pem ~/connection-kindergarten.json ec2-user@$HOST4:~/network/poc-network
我们将应用程序克隆到第三台主机:cd ~
git clone https://github.com/nixsolutions/blockchain-poc-backend.git back
安装NodeJS和Gcc-c ++(编译器):curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
sudo yum install nodejs
cd back
sudo yum install gcc-c++ -y
npm install
修复exports.hostName
constants.js(当前主机的值):vim ~/back/constants.js
在第三个终端中运行我们的应用程序:npm start
在userGenerator.sh文件中,将HOST_4
正确的值分配给变量:vim ~/back/generators/userGenerator.sh
接下来,我们需要运行一个脚本,该脚本将创建Hospital组织的用户:./back/generators/userGenerator.sh kindergarten
现在,数据库的“用户”表中有第三个用户。在第二,第三和第四台EC2服务器上安装wkhtmltopdf
后台应用程序使用wkhtmltopdf库生成有关孩子健康状况的PDF报告。我们需要安装libpng-用于处理PNG格式的光栅图形的官方库。该库是独立于平台的,并且包含用C语言编写的函数。第一小组将安装wkhtmltox-开放源代码LGPLv3库,用于使用QtWebKit渲染引擎将HTML渲染为PDF和各种图像格式:wget https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox-0.12.5-1.centos7.x86_64.rpm
sudo yum install -y wkhtmltox-0.12.5-1.centos7.x86_64.rpm
第二个命令块将下载并部署libpng15库:wget https://sourceforge.net/projects/libpng/files/libpng15/older-releases/1.5.15/libpng-1.5.15.tar.gz/download -O libpng-1.5.15.tar.gz
tar -zxvf libpng-1.5.15.tar.gz
cd libpng-1.5.15
安装编译器需要第三条命令:sudo yum groupinstall -y "Development Tools"
./configure --prefix=/usr
sudo make install
您仍然需要安装LibTIFF:sudo yum install -y libtiff
我们可以测试:wkhtmltopdf https://majestic.cloud majestic.pdf
现在,您可以生成和查看PDF文档。关于Node SDK的一些知识
用于Hyperledger Fabric网络的NodeJS工具以“ fabric-ca-client -v 1.4.0”和“ fabric-network” v 1.4.0”的形式提供。使用Node SDK与网络交互的后端应用程序的所有服务都位于项目根目录下的Services文件夹中。您可以在官方文档中了解这些工具及其方法。应用业务流程
现在,我们将讨论网络成员如何在此应用程序中彼此交互。所有过程都在UML图中描述。让我们更详细地考虑它们。图5。应用程序中业务流程的图形描述。因此,网络上有几个组织:父母,医院和幼儿园。父母的一个成员为其两个孩子创建电子健康记录。这些数据将存储(并补充)在区块链网络中。接下来,父母发送请求与儿科医生达成协议,儿科医生将观察他的孩子,直到他们成年为止(在图中- 请求与医生达成协议)。医院组织的成员签署协议(在图中- 医生签署协议)。接下来,父母向幼儿园发送请求,并要求其注册孩子(在图中- 要求幼儿园接收孩子的请求)。图6。家长帐户中包含可用教育机构列表的页面。幼儿园在新请求列表中看到该请求:图7。一个页面,其中包含入学机构个人帐户的申请列表。幼儿园在决定接纳孩子之前,必须确保其健康状况令人满意。为此,幼儿园将请求发送到观察该孩子的诊所(在图中- 儿童健康报告请求)。将入园的请求移至“已接受”选项卡后,会自动执行对儿科医生的请求。图8。一个页面,其中列出了允许进入教育机构个人帐户的已批准申请。儿科医生会看到该请求并生成一个报告,其中包含有关儿童健康的数据(在图表中- 儿童健康报告create)。图9。带有应用列表的页面,用于通过医院的个人帐户创建有关儿童健康状况的报告。家长看到儿科医生已经生成了报告:图10。父母个人帐户中的页面,其中显示有关孩子健康状况的报告状态。...并决定授予学龄前教育机构查看和下载报告的权限(在图中- 授予查看报告的权限)。图11。一个弹出窗口,用于选择可以查看生成的医疗报告的教育机构。父级点击“确认”:图12。关于所选教育机构已获准查看医疗报告的通知。在教育机构的应用程序的报告列表中,显示该报告已生成并且可以以PDF格式查看和下载的信息。图13 链接以下载与批准的申请一致的PDF格式的报告。这是一份报告,您将在计算机的新选项卡中看到该报告:图14。医院员工生成的健康报告。与儿科医生创建病历和协议,签署协议
由于该应用程序的设计目的是为了演示网络在不同EC2服务器上的部署,因此我们将从准备好的脚本中执行一些命令。第一台EC2服务器:node ~/back/generators/setCards.js
我们先前已连接到数据库。执行命令后,您将在Cards表中看到两个条目。此外,有关这两个孩子的医疗数据的信息也记录在区块链上。我们需要从此EC2服务器与将观察儿童的儿科医生达成协议:node ~/back/generators/createAgreement.js
现在,此协议必须由我们为医院组织创建的用户签署。我们从第二个主机执行命令:node ~/back/generators/signAgreement.js
我们的协议已由医生签署,我们可以继续进行申请。接下来,我们需要在第二,第三和第四台EC2服务器上安装前端应用程序。PS:您可以在〜/ back / generators文件夹中找到用于生成用户,卡,协议和签名协议的所有命令。家长前端申请
在第二台主机(“家长”组织所在的主机)上运行:cd ~
git clone https://github.com/nixsolutions/blockchain-poc-frontend.git front
我们创建.env文件并指定前端应用程序所在的主机名:vim ~ /front/.env:
VUE_APP_API_BASE_URL='http://ec2-107-22-75-46.compute-1.amazonaws.com:3006/'
有必要建立依赖关系:cd front
npm install
您还必须构建应用程序并在端口8080上运行它:docker build . -t my-app
docker run -d -p 8080:80 my-app
我们的应用程序将在以下http://<HOST_2>:8080
位置提供:哪里<HOST_2>
是我们的应用程序所在的第二台EC2服务器的地址。登录名:parents
密码:password
。这就是前端的外观。在这里,您将看到有关我们从终端创建的医疗卡的信息:图15。父母个人帐户中有关孩子病历的信息。医院前端应用
在第二台主机(医院组织所在的主机)上运行:cd ~
git clone https://github.com/nixsolutions/blockchain-poc-frontend.git front
我们创建.env文件并指定前端应用程序所在的主机名:vim ~ /front/.env:
VUE_APP_API_BASE_URL='http://ec2-3-91-238-161.compute-1.amazonaws.com:3006/'
有必要建立依赖关系:cd front
npm install
您还必须构建应用程序并在端口8080上运行它:docker build . -t my-app
docker run -d -p 8080:80 my-app
我们的应用程序将在以下http://<HOST_3>:8080
位置提供:<HOST_3>
第三台EC2服务器的地址在哪里。登录名:hospital
密码:password
。幼儿园前端应用
在第二台主机(幼儿园组织所在的主机)上运行:cd ~
git clone https://github.com/nixsolutions/blockchain-poc-frontend.git front
我们创建.env文件并指定前端应用程序所在的主机名:vim ~ /front/.env:
VUE_APP_API_BASE_URL='http://ec2-107-22-12-137.compute-1.amazonaws.com:3006/'
有必要建立依赖关系:cd front
npm install
您还必须构建应用程序并在端口8080上运行它:docker build . -t my-app
docker run -d -p 8080:80 my-app
我们的应用程序将在以下http://<HOST_4>:8080
位置提供:哪里<HOST_4>
是第四台EC2服务器的地址。登录名:kindergarten
密码:password
。结论
我们研究了如何在多个虚拟或物理服务器上部署区块链应用程序网络。本文旨在使您熟悉区块链技术的基础知识,了解什么是智能合约,并且至少初步了解Hyperledger Fabric框架及其标准Fabric-samples应用程序。