Implemente Hyperledger Fabric 1.4 en AWS

Hyperledger Fabric es una plataforma blockchain de código abierto de la Fundación Linux. Con él, puede crear aplicaciones blockchain y controlar el acceso y los permisos para los datos en blockchain. Se debe usar Hyperledger Fabric si desea crear una red privada de blockchain o establecer restricciones sobre qué transacciones puede ver cada lado.

En la documentación de Hyperledger Fabric, la creación de una red blockchain en una máquina con Docker está bien planificada, donde cada miembro de la red es un contenedor separado. Pero no se describe el proceso de configuración de una red en varias máquinas físicas o virtuales. Esto se discutirá en este artículo.

Nuestra aplicación blockchain es un servicio para almacenar algunos datos médicos de niños en edad escolar y preescolar. Los datos deben estar sin cambios. Se presentarán en forma de información sobre la vacunación y el acuerdo del paciente con un médico en particular. La red incluirá miembros de Parents (una organización que representa los intereses de los padres), Hospital (un hospital con cuyos pediatras los padres pueden llegar a un acuerdo para cuidar a sus hijos) y Kindergarten (un jardín de infantes que puede solicitar informes de salud y vacunas para u otro niño en el hospital).

Blockchain administrado por Amazon


AWS tiene un servicio Amazon Managed Blockchain. Le permite implementar redes blockchain usando las interfaces de usuario de la consola de AWS. Pero, después de ganar algo de experiencia trabajando con Amazon Managed Blockchain, tuvimos que abandonar la idea de usar el servicio en proyectos comerciales. Hubieron varias razones para esto. Los principales son:

  1. Solo la versión de Hyperledger Fabric 1.2 estaba disponible en Amazon Managed Blockchain, y en el momento de escribir este artículo, la versión 1.4 se usa para construir redes de blockchain empresariales. Tampoco permite el uso de versiones modernas de las herramientas Node.js SDK;
  2. Amazon Managed Blockchain no es compatible con la base de datos CouchDB, lo que dificulta la creación de aplicaciones que indexen los datos almacenados.

Por lo tanto, nuestra opinión es que es mejor usar servidores virtuales o físicos para construir redes utilizando el marco Hyperledger Fabric.

Acerca de los canales de aplicaciones


Hyperledger Fabric tiene el concepto de "canal". Un canal es una subred para realizar transacciones confidenciales. Habrá dos canales en nuestra aplicación.

  • "Parentshospital". Está destinado a transacciones entre miembros de organizaciones de padres y hospitales: crear y modificar registros médicos, crear un acuerdo con un pediatra y firmar un acuerdo de pediatra.
  • "Parentshospitalkindergarten". Dentro de este canal, los miembros de Parents and Hospital interactuarán con los miembros de Kindergarten. Además, se generarán informes basados ​​en datos de registros médicos.

Ambiente de trabajo


Implementaremos nuestra red blockchain usando Docker Swarm: este es el sistema nativo de Docker para implementar un clúster de host. Si nunca ha trabajado con Docker (y especialmente con Docker Swarm), primero consulte este producto y cómo orquestar los contenedores con Docker Swarm. La documentación describe bien los conceptos básicos para trabajar con estas herramientas.

Toda nuestra red estará ubicada en servidores AWS EC2. La información dentro de la red blockchain se almacenará en CouchDB. Hyperledger Fabric también es compatible con la base de datos LevelDB, pero CouchDB, a diferencia de esta última, permite buscar por cualquier criterio en una colección de documentos. También usaremos Fabric Certificate Authority: este es un componente modular para administrar identificadores de red de todas las organizaciones y sus usuarios. Proporciona el registro de los participantes de la red y la emisión de certificados.

Tendremos cuatro servidores EC2:

  1. Orderer, MySQL DB (para almacenar información de la aplicación que no se aplica a los registros médicos)
  2. Organización de padres (Peer0, Peer1), CouchDB, Fabric-CA, CLI
  3. Organización del hospital (Peer0, Peer1), CouchDB, Fabric-CA
  4. Organización de jardín de infantes (Peer0, Peer1), CouchDB, Fabric-CA

Creación de servidores EC2 en AWS


Necesitamos los servicios de t2.medium para trabajar. Este tipo de servidor EC2 tiene suficiente potencia informática para instalar todo el software necesario y trabajar con la herramienta Hyperledger Fabric. En Configurar grupo de seguridad, configure Todo el tráfico y Origen - 0.0.0.0/0, :: / 0.


Figura 1. Configure el grupo de seguridad en el panel de AWS.

Tenemos cuatro servidores EC2:

  1. ec2-18-232-164-119.compute-1.amazonaws.com
  2. ec2-54-145-203-186.compute-1.amazonaws.com
  3. ec2-54-80-241-117.compute-1.amazonaws.com
  4. ec2-52-87-193-235.compute-1.amazonaws.com

Naturalmente, tendrá sus propias rutas a los servidores EC2.


Figura 2. Preparado para la operación de servidores EC2.

Instalación de software de requisitos previos en servidores EC2


Ahora en cada servidor EC2 necesitamos instalar Docker y Git. Para mayor comodidad, abra cuatro pestañas en la terminal. Vayamos a cada servicio EC2 a través de SSH:

Terminal 1:

HOST1=ec2-18-232-164-119.compute-1.amazonaws.com
ssh ec2-user@$HOST1 -i ./key-poc.pem

Terminal 2:

HOST2=ec2-54-145-203-186.compute-1.amazonaws.com
ssh ec2-user@$HOST2 -i ./key-poc.pem

Terminal 3:

HOST3=ec2-54-80-241-117.compute-1.amazonaws.com
ssh ec2-user@$HOST3 -i ./key-poc.pem

Terminal 4:

HOST4=ec2-52-87-193-235.compute-1.amazonaws.com
ssh ec2-user@$HOST4 -i ./key-poc.pem

En cada terminal, ejecute los siguientes comandos:

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

Ahora tenemos instalado Docker y Git.

Red


Necesitamos clonar elementos de nuestra red desde el repositorio. Para hacer esto, ejecute el comando en cada terminal:

git clone https://github.com/nixsolutions/blockchain-poc-network.git network

También necesitamos clonar contratos inteligentes desde el repositorio que regulará las relaciones entre los participantes de la red. Los contratos inteligentes están escritos en el idioma Golang.

Realizamos estos pasos en cada uno de los cuatro servidores:

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

En el primer terminal, necesitamos generar archivos de configuración de canales y certificados para conectar organizaciones a la red:

cd network/poc-network
./1_generate_connection_files.sh
./2_generating_channel_configuration.sh

Ahora copie los artefactos de canal y las carpetas de configuración de cifrado a los otros tres hosts en la carpeta de red de poc del directorio principal de la red. Tenga en cuenta: al copiar organizaciones al servidor EC2, debe eliminar los certificados de terceros de la carpeta crypto-config / peerOrganizations que se relacionan con el trabajo de otras organizaciones. Por ejemplo, al copiar en el host Parents, debemos dejar la carpeta parents.poc-network.com en esta carpeta, pero eliminar hospital.poc-network.com y kindergarten.poc-network.com.

Crear una pila de enjambre Docker


Para que los contenedores que pertenecen a diferentes organizaciones y estén ubicados en diferentes servidores EC2 puedan acceder entre sí, debemos combinarlos en una pila. Echemos un vistazo a nuestra red de archivos / poc-network / docker-compose-general.yaml. Contiene la configuración de servicios, indica en qué hosts se implementará un servicio (clave node.hostname) en particular, se indican los alias (clave aliases).

Necesitamos inicializar enjambre en la primera terminal:

docker swarm init
docker swarm join-token manager

Aparecerá un token para conectar otro servidor EC2 a la pila. Algo así como: docker swarm join --token SWMTKN-1-42ml0ohnnbidg8kflgp8xp9dkkus6mn1lslqc15hrxj4tk9e3q-5h4vbzbfk8p90n83oe08gbltf 172.31.46.214:2377.

Ahora podemos ejecutar en los terminales restantes:

docker swarm join --token SWMTKN-1-2xzco7t7txohnzd09318eczpbgmm8woex80byxptpt1jl5i2ar-bsg37h40xze1gaabg80i96gw2 172.31.38.245:2377

Aparece un mensaje en la consola:

This node joined a swarm as a manager.

Después de que los tres hosts estén conectados a Swarm, podemos verlos en la terminal del primer host ejecutando el comando:

docker node ls


Fig. 3. Lista de servidores en Docker Swarm.

En la carpeta network / poc-network hay un archivo .env.template en el que debe especificar un nombre de host para cada uno de los hosts:

ORDERER=ip-172-31-38-245
PARENTS=ip-172-31-43-64
HOSPITAL=ip-172-31-38-130
KINDERGARTEN=ip-172-31-40-157

para generar un archivo .env, debe ejecutar el archivo ./3_env_gen.sh.

Ahora cree una red con un controlador overlay:

docker network create --driver overlay --attachable stage_byfn

Ejecute Swarm para crear una pila basada en el archivo docker-compose-general.yaml:

env $(cat .env | grep ^[A-Z] | xargs) docker stack deploy -c docker-compose-general.yaml stage 2>&1

Con este comando, también establecemos variables de entorno, que se describen en el archivo .env y que son necesarias para que la red funcione correctamente.

Puede ejecutar el comando docker service lsen la primera terminal. Verá una lista de todos los servicios que se ejecutan en todas nuestras instancias EC2.


Fig.4. Lista de todos los servicios que se estaban ejecutando en todos los servidores EC2.

Si ve lo mismo en su terminal que en la captura de pantalla, entonces todo está bien. Ahora ejecuta nuestra red. En la segunda terminal, debe ingresar el contenedor CLI (después de todo, este contenedor se implementa en el segundo host):

docker exec -ti stage_cli.1.owni217t53m53efjtikb5oa2f /bin/bash

El nombre del contenedor se puede ver ejecutando el comando en la terminal docker ps.

En el contenedor, ejecutamos todos nuestros comandos desde el archivo 4_create_channels.sh, copiándolos uno por uno en el terminal. En la carpeta bin, tenemos los binarios para crear la red:

  • canal de pares crear - crear canales;
  • unión de canal de igual: unir un igual a un canal;
  • actualización de canal par: configuraciones de actualización;
  • instalación de chaincode por pares: instale el código de código;
  • instancia de chaincode de igual: despliega el código de cadena especificado en la red.

Ahora puede salir del contenedor ejecutando el comando exit.

Solicitud de Padres


Instale la aplicación en el segundo host:

cd ~
git clone https://github.com/nixsolutions/blockchain-poc-backend.git back

También necesitamos instalar NodeJS y gcc-c ++ (compilador):

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

También podemos ingresar a nuestra base de datos a través del administrador con los siguientes datos de autorización:

<HOST_1>:3306(donde <HOST_1>está la dirección del primer servidor EC2 en el que se almacena la base de datos)
dev
devpass
poc_database

También es necesario conectar nuestra aplicación API a la base de datos:

vim ~/back/config/config.json

Asigne el valor correcto a la clave host. Nuestra aplicación posterior ha preparado migraciones y semillas. Necesitas ejecutarlos:

npx sequelize-cli db:migrate
npx sequelize-cli db:seed:all

Las tablas deben aparecer en la base de datos. Y en la tabla de organizaciones veremos tres filas con nuestras organizaciones: padres, hospital, jardín de infantes.

Al generar certificados desde el principio, recibimos archivos para conectarnos a la red para cada organización en el primer host. Copie el archivo connection-parents.json del primer host al segundo. Para hacer esto, abra otra terminal desde la carpeta donde keyse encuentra la nuestra y ejecute los comandos:

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

Arreglo exports.hostNameen constants.js (valor para el host actual):

vim ~/back/constants.js

Ejecute nuestra aplicación en la segunda terminal:

npm start

En el archivo userGenerator.sh, asigne el HOST_2valor correcto a la variable :

vim ~/back/generators/userGenerator.sh

A continuación, debe ejecutar el script que creará los usuarios de la organización Parents:

./back/generators/userGenerator.sh parents

Ejecute el script para generar registros médicos:

node ~/back/generators/setCards.js

Se crearán dos tarjetas en la cadena de bloques, que también se escribirán en la base de datos SQL en la tabla de tarjetas.

Solicitud de espalda hospitalaria


Por analogía con la aplicación anterior, necesitamos colocar el archivo para conectarnos a la red en el tercer host. Para hacer esto, en la quinta terminal, ejecute:

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

Vamos a clonar nuestra aplicación al tercer host:

cd ~
git clone https://github.com/nixsolutions/blockchain-poc-backend.git back

Instale NodeJS y gcc-c ++ (compilador):

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

Arreglo exports.hostNameen constants.js (valor para el host actual):

vim ~/back/constants.js

Ejecute nuestra aplicación en el tercer terminal:

npm start

En el archivo userGenerator.sh, asigne el HOST_3valor correcto a la variable :

vim ~/back/generators/userGenerator.sh

Luego, necesitamos ejecutar un script que creará usuarios de la organización del Hospital:

./back/generators/userGenerator.sh hospital

Ahora tenemos un segundo usuario en la tabla Usuarios en la base de datos.

Solicitud de espalda para kinder


Por analogía con la aplicación anterior, necesitamos colocar el archivo para conectarnos a la red en el tercer host. Para hacer esto, en la quinta terminal, ejecute:

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

Vamos a clonar nuestra aplicación al tercer host:

cd ~
git clone https://github.com/nixsolutions/blockchain-poc-backend.git back

Instale NodeJS y Gcc-c ++ (compilador):

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

Arreglo exports.hostNameen constants.js (valor para el host actual):

vim ~/back/constants.js

Ejecute nuestra aplicación en el tercer terminal:

npm start

En el archivo userGenerator.sh, asigne el HOST_4valor correcto a la variable :

vim ~/back/generators/userGenerator.sh

Luego, necesitamos ejecutar un script que creará usuarios de la organización del Hospital:

./back/generators/userGenerator.sh kindergarten

Ahora tenemos un tercer usuario en la tabla Usuarios en la base de datos.

Instale wkhtmltopdf en el segundo, tercer y cuarto servidor EC2


La aplicación posterior utiliza la biblioteca wkhtmltopdf para generar un informe en PDF sobre el estado de salud del niño.

Necesitamos instalar libpng, la biblioteca oficial para trabajar con gráficos ráster en formato PNG. La biblioteca es independiente de la plataforma y consta de funciones escritas en lenguaje C.

El primer equipo instalará wkhtmltox, la biblioteca LGPLv3 de código abierto para renderizar HTML a PDF y varios formatos de imagen utilizando el motor de renderización QtWebKit:

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

El segundo bloque de comandos descargará e implementará la biblioteca 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

Se necesita el tercer bloque de comandos para instalar el compilador:

sudo yum groupinstall -y "Development Tools"
./configure --prefix=/usr
sudo make install

Aún necesita instalar LibTIFF:

sudo yum install -y libtiff

Podemos probar:

wkhtmltopdf https://majestic.cloud majestic.pdf

Ahora puede generar y ver documentos PDF.

Un poco sobre Node SDK


Las herramientas NodeJS para trabajar con la red Hyperledger Fabric se presentan en forma de paquetes "fabric-ca-client -v 1.4.0" y "fabric-network" v 1.4.0 ". Todos los servicios de la aplicación de fondo que interactúan con la red utilizando el SDK de nodo se encuentran en la carpeta Servicios, en la raíz del proyecto.

Puede leer sobre estas herramientas y sus métodos en la documentación oficial .

Procesos empresariales de aplicación


Ahora hablaremos sobre cómo los miembros de la red interactúan entre sí en esta aplicación. Todos los procesos se describen en un diagrama UML. Consideremos cada uno de ellos con más detalle.


Fig.5. Una descripción gráfica de los procesos de negocio en la aplicación.

Por lo tanto, hay varias organizaciones en la red: padres, hospital y jardín de infantes.

Un miembro de Parents crea registros de salud electrónicos para dos de sus hijos. Estos datos se almacenarán (y complementarán) en la red blockchain. Luego, el padre envía una solicitud de acuerdo con el pediatra, quien observará a sus hijos hasta que lleguen a la edad adulta (en el diagrama, solicite un acuerdo con un médico ).

Un miembro de la organización del hospital firma un acuerdo (en el diagrama, el médico firma un acuerdo ).

Luego, el padre envía una solicitud al jardín de infantes con una solicitud para inscribir a su hijo (en el diagrama: solicitud de que el jardín de infantes reciba un hijo ).


Fig.6. Una página con una lista de instituciones educativas disponibles en la cuenta de los padres.

Kindergarten ve la solicitud en la lista de solicitudes nuevas:


Fig.7. Una página con una lista de solicitudes de admisión a la cuenta personal de la institución educativa.

Kindergarten antes de decidir sobre la admisión del niño debe asegurarse de que su estado de salud sea satisfactorio. Para hacer esto, el jardín de infantes envía una solicitud a la clínica en la que se observa a este niño (en el diagrama: solicitud de informe de salud infantil ). La solicitud al pediatra se ejecuta automáticamente después de que la solicitud de admisión al jardín se mueve a la pestaña "Aceptada".


Fig.8. Una página con una lista de solicitudes aprobadas para la admisión a la cuenta personal de la institución educativa.

El pediatra ve la solicitud y genera un informe que contiene datos sobre la salud del niño (en el diagrama: crear informe de salud infantil ).


Fig.9. Una página con una lista de aplicaciones para crear un informe sobre el estado de salud del niño en la cuenta personal del hospital.

El padre ve que el pediatra ha generado un informe:


Fig.10. Una página en la cuenta personal del padre, que muestra el estado de los informes sobre el estado de salud del niño.

... y toma la decisión de otorgar acceso a la institución educativa preescolar para ver y descargar el informe (en el diagrama, otorgue permiso para ver el informe ).


Fig.11. Una ventana emergente para elegir una institución educativa que pueda ver el informe médico generado.

Los padres hacen clic en "Confirmar":


Fig. 12. Notificación de que la institución educativa seleccionada ha recibido permiso para ver el informe médico.

En la lista de informes en la solicitud de la institución educativa, aparece información de que el informe se ha generado y está disponible para verlo y descargarlo en formato PDF.


Fig.13. Enlace para descargar el informe en formato PDF en la línea con la solicitud aprobada.

Aquí hay un informe que verá en una nueva pestaña en su computadora:


Fig.14. Un informe de salud generado por un empleado del hospital.

Crear registros médicos y acuerdos con un pediatra, firmar un acuerdo


Dado que la aplicación está diseñada más para demostrar el despliegue de la red en servidores EC2 separados, ejecutaremos algunos comandos de los scripts preparados.

Primer servidor EC2:

node ~/back/generators/setCards.js

Nos hemos conectado previamente a la base de datos. Después de ejecutar el comando, verá dos entradas en la tabla Tarjetas. Además, la información sobre los datos médicos de estos dos niños se registró en la cadena de bloques.

Desde este servidor EC2 necesitamos crear un acuerdo con un pediatra que observará a los niños:

node ~/back/generators/createAgreement.js

Ahora este acuerdo debe ser firmado por el usuario que creamos para la organización Hospital. Ejecutamos el comando desde el segundo host:

node ~/back/generators/signAgreement.js

Nuestro acuerdo está firmado por el médico y podemos seguir trabajando en nuestra solicitud. Luego, necesitamos instalar la aplicación frontend en los servidores EC2 segundo, tercero y cuarto.

PD: Puede encontrar todos los comandos para generar usuarios, tarjetas, acuerdos y acuerdos de firma en la carpeta ~ / back / generators.

Solicitud Frontend de Padres


Ejecute en el segundo host (donde se encuentra la organización de Padres):

cd ~
git clone https://github.com/nixsolutions/blockchain-poc-frontend.git front

Creamos el archivo .env y especificamos el nombre de host en el que se ubicará nuestra aplicación de interfaz:

vim ~ /front/.env:


VUE_APP_API_BASE_URL='http://ec2-107-22-75-46.compute-1.amazonaws.com:3006/'

Es necesario establecer las dependencias:

cd front
npm install

También debe compilar la aplicación y ejecutarla en el puerto 8080:

docker build . -t my-app
docker run -d -p 8080:80 my-app

Nuestra aplicación estará disponible en: http://<HOST_2>:8080dónde <HOST_2>está la dirección del segundo servidor EC2 en el que se encuentra nuestra aplicación.

Usuario: parentsContraseña: password.

Así es como se verá la interfaz. Aquí verá información sobre las tarjetas médicas que creamos desde la terminal:


Fig.15. Información sobre los registros médicos de los niños en la cuenta personal de los padres.

Solicitud de hospital frontend


Ejecute en el segundo host (donde se encuentra la organización del Hospital):

cd ~
git clone https://github.com/nixsolutions/blockchain-poc-frontend.git front

Creamos el archivo .env y especificamos el nombre de host en el que se ubicará nuestra aplicación de interfaz:

vim ~ /front/.env:


VUE_APP_API_BASE_URL='http://ec2-3-91-238-161.compute-1.amazonaws.com:3006/'

Es necesario establecer las dependencias:

cd front
npm install

También debe compilar la aplicación y ejecutarla en el puerto 8080:

docker build . -t my-app
docker run -d -p 8080:80 my-app

Nuestra aplicación estará disponible en: http://<HOST_3>:8080dónde <HOST_3>está la dirección del tercer servidor EC2.

Usuario: hospitalContraseña: password.

Aplicación de interfaz de jardín de infantes


Ejecutar en el segundo host (donde se encuentra la organización de Kindergarten):

cd ~
git clone https://github.com/nixsolutions/blockchain-poc-frontend.git front

Creamos el archivo .env y especificamos el nombre de host en el que se ubicará nuestra aplicación de interfaz:

vim ~ /front/.env:


VUE_APP_API_BASE_URL='http://ec2-107-22-12-137.compute-1.amazonaws.com:3006/'

Es necesario establecer las dependencias:

cd front
npm install

También debe compilar la aplicación y ejecutarla en el puerto 8080:

docker build . -t my-app
docker run -d -p 8080:80 my-app

Nuestra aplicación estará disponible en: http://<HOST_4>:8080donde <HOST_4>está la dirección del cuarto servidor EC2.

Usuario: kindergartenContraseña: password.

Conclusión


Examinamos cómo implementar una red de aplicaciones blockchain en varios servidores virtuales o físicos. El artículo está diseñado para familiarizarlo con los conceptos básicos de la tecnología blockchain, saber qué son los contratos inteligentes y, al menos, familiarizarse superficialmente con el marco Hyperledger Fabric y su aplicación estándar de muestras de tela.

All Articles