Hyperledger es una plataforma opensource para crear aplicaciones blockchain en una red de negocio de
carácter empresarial.
Para ello la filosofía que persigue es que los participantes de la red deben ser conocidos, las redes deben ser
permisionadas, debe tener una tasa de transacciones por segundo muy alta y debe guardar la privadad y
confidencialidad de las transacciones y de los datos.
Entre los casos de uso que están aplicando Hyperledger podemos encontrar el Supply Chain, Provenance, Derechos de la propiedad, Fintech, Healthcare, entre otros.
Hyperledger consta de varios sub-proyectos o frameworks (Burrow, Fabric, Iroha, Sawtooth) y varias herramientas (Caliper, Cello, Composer, Explorer, Quilt).
Hyperledger está gobernado por la Linux Foundation y tiene un gran soporte por parte de IBM.
Lo más conocido de Hyperledger es Fabric y Composer.
Fabric es el más activo de los 10 proyectos actuales. Este tutorial está centrado en Hyperledger Fabric.
Hyperledger Iroha
Inicialmente tuvo contribuciones de Soramitsu, Hitachi, NTT Data y Colu. Está enfocado en la sencillez de implementación utilizando C++, enfatizando el desarrollo de apps móviles y utilizando el algoritmo de consenso YAC.
Por cierto, si quieres obtener criptomonedas gratis al aprender, puedes dar un vistazo a Coinbase que es además un excelente Exchange.
Hyperledger Indy
Este framework está enfocado en la identidad digital en Internet. Utiliza DID (Identificadores Descentralizados) y Credenciales Verificables para añadir una capa de identidad en Internet.
Hyperledger Sawtooth
Ha sido uno de los primeros proyectos en unirse a la Linux Foundation y está arropado por Intel. Permite el uso permisionado o no permisionado. Utiliza el algoritmo de consenso Proof of Elapsed Time
Hyperledger Fabric
Ha sido de los primeros proyectos en madurar, bajo la mano de IBM. Utiliza Peers, un Ordering service y un servidor de membresía. Tiene la capacidad de usar smart contracts (denominados chaincode) y permite el uso de varios canales.
Fabric es una DLT privada permisionada con soporte para canales. No necesita una
criptomoneda
para poder funcionar.
Composer es un conjunto de herramientas para modelar y construir redes de negocio en blockchain.
Construida con Javascript, utiliza varias herramientas muy conocidas como Node.js, npm y Yeoman.
Fabric puede utilizar modelos de consenso de tipo plug and play, para adecuar a cada caso de uso el más
eficiente.
Por ejemplo si se usa en una sola empresa se puede usar un algoritmo de consenso de tipo Crash
Bizantine Fault Tolerant mientras que si se usa entre varias empresas podría usar un algoritmo
de
consenso de tipo Tolerante a Fallos Bizantinos.
Es permisionada, es decir se administra quien puede leer o escribir en la blockchain.
Guarda el estado de los activos digitales en una base de datos de tipo "clave-valor".
Tiene smart contracts denominados "chaincode", que pueden ser implementados en código Go o
Java o Javascript.
Asimismo puede usar una gestión de identidades de tipo plug and play, como LDAP o OpenID, para ajustarse a
las
necesidades de cada empresa o caso de uso.
El diseño de Fabric trabaja con varios conceptos com son los assets, el chaincode, el ledger, la privacidad, los servicios de membresía y el consenso.
Los assets permiten modelar el intercambio de cualquier cosa que tenga valor a través de la red de negocio,
desde comida, coches o divisas.
Incluso cosas intangibles como contratos o derechos de la propiedad intelectual.
Básicamente se almacenan como una colección de pares "clave-valor" con cambios de estado registrados como
transacciones en el ledger.
El chaincode permite modificar estos assets, mediante la lógica de negocio se definen las reglas para leer o alterar estos pares "clave-valor" u otra información de la base de datos del "estado".
En el ledger se guardan todos los cambios de estados, de manera secuencial y resistente a la manipulación de
estos datos.
Estos cambios de estado se producen a partir de las invocaciones del chaincode en forma de transacciones
que
emiten varios participantes de la red de negocio.
Así pues el ledger está compuesto de una blockchain para almacenar la secuencia de cambios y de una base de
datos de los estados.
Mediante el uso de canales se mantiene la privacidad de las transacciones en la red.
Dado que todos los participantes de la red de negocio tienen identidades conocidas dentro de una
organización, se usa PKI con certificados X509 para generar certificados criptográficos a las
organizaciones, participantes o usuarios de las aplicaciones.
Existen también los proveedores de servicios de membresía que definen dentro de cara organización el rol de
cada Peer.
El algoritmo de consenso es la pieza fundamental a la hora de ordenar las transacciones en un bloque, desde la propuesta y el "endorsement" hasta la ordenación, validación y escritura.
Una red de negocio consta de varios nodos que se comunican por la red. Hay 3 tipos de nodos: los clientes
que envían transacciones a los peers,
los peers que registran las transaciones, mantienen una copia del ledger y del estado y los ordering
service que ordenan, validan las transacciones, las meten en bloques y las envían a los Peers.
El servicio de autoridad de certificados se usa para generar certificados y claves para gestionar y
configurar las identidades de la red de negocio.
El ordering service ordena las transacciones por tiempo y las prepara para incluirlas en un bloque.
Los peers que pertenecen a las organizaciones, almacenan el ledger y los smart contracts.
Las transacciones se registran en la blockchain, mientras que el estado de los assets se almacena en una
base de datos.
Tanto el estado de los assets como los registros se comparten entre los varios peers del sistema utilizando
el algoritmo de consenso.
Para definir una red de negocio hace falta como mínimo un Ordering Service. Este es configurado y gestionado por un administrador de una determinada organización, dando permisos sólo a esa organización. Posteriormente se añade como mínimo un Peer que almacena una copia del ledger. Este Peer se comunica con el Ordering Service mediante un canal.
A continuación se muestra como las aplicaciones interaccionan con los Peers para acceder al ledger. Las
transacciones de consulta se retornan de modo inmediato,
mientras que las transacciones que contienen actualizaciones requieren interacciones entre aplicaciones,
peers y ordering services.
Un asset es un activo digital modelado dentro del sistema Hyperledger. Puede ser cualquier cosa desde un coche, un alimento, etc... tienen un identificador y varias propiedades, y pueden estar relacionados con otros asset o con participantes.
Un participante es un actor de la red que puede ser el dueño de un asset y puede enviar transacciones. Al igual que un asset, constan de un identificador y varias propiedades.
Vienen definidas por un certificado digital con su clave privada, se asignan a los participantes de la aplicación. Estas identidades se guardan en las "cards".
Definen la lógica de negocio de la aplicación. Es decir como los participantes se relacionan con los assets.
Definen consultas sobre el estado de los assets de la blockchain.
Se definen en fichero de modelado y permiten al mundo off-chain darse cuenta de los cambios on-chain. Las aplicaciones pueden suscribirse a varios eventos y así mostrar alertas especificas de lo que ocurre en los assets.
Permiten definir los permisos de los participantes a la hora de acceder a los varios assets
Es un conjunto de herramientas para desarrollar y agilizar la creación de aplicaciones blockchain. Se
comunica con Fabric de manera muy fácil y permite diseñar pruebas de concepto y desplegar en cuestión de
pocas semanas.
Composer empaqueta todos los archivos en un fichero BNA (Business Network Archive).
Un fichero BNA contiene:
Todo esto va empaquetado en un BNA y permite desplegar una aplicación blockchain fácilmente en varios entornos, ya sean locales o en el cloud.
Para ejecutar Hyperledger Composer se puede realizar en el ordenador local o en el cloud (Bluemix de IBM). Se utiliza lo que se denomina un "playground", que es un entorno de pruebas donde podemos editar todos los ficheros anteriores y desplegarlos en Fabric de manera transparente. Permite modelizar y testear una aplicación blockchain fácilmente y rápidamente.
El playground ya viene precargado con varios ejemplos, así es que es muy recomendable utilizarlo para hacerse una idea de como modelizar una aplicación blockchain dentro del ecosistema Hyperledger.
A la hora de elegir un entorno para instalar Hyperledger, es aconsejable utilizar una versión de Linux, en general se recomienda un Ubuntu 16.04 o un MacOS.
Hace falta toda una serie de programas que son los siguientes:
Existe un script de github que gestiona los requisitos. Lo podemos instalar con cURL. Si no tenemos
instalado cURL lo haremos con :
sudo apt install curl
A continuación se descarga el script y se ejecuta:
curl -O https://hyperledger.github.io/composer/latest/prereqs-ubuntu.sh
chmod u+x prereqs-ubuntu.sh
prereqs-ubuntu.sh
Para instalar el composer hay que utilizar npm para instalar varias herramientas:
npm install -g composer-cli
npm install -g composer-rest-server
npm install -g generator-hyperledger-composer
npm install -g yo
npm install -g composer-playground
Existe otro script que contiene el script de instalación de Fabric. Creamos un directorio, descargamos el script con cURL y lo desempaquetamos:
mkdir ~/fabric-dev-servers && cd ~/fabric-dev-servers
curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.tar.gz
tar -xvf fabric-dev-servers.tar.gz
cd ~/fabric-dev-servers
./downloadFabric.sh
Para arrancar Fabric hacemos:
y cd ~/fabric-dev-servers
./startFabric.sh
Para detener Fabric hacemos:
./stopFabric.sh
Y para arrancar el playground:
composer-playground
Una vez hecho esto podemos acceder al playground desde el navegador en la url:
http://localhost:8080
Se puede instalar Kitematic para manejar los contenedores de Docker visualmente e Insomnia para manejar las peticiones a las API REST si se desea.
El primer paso consiste en crear una definición de la red de negocio. Ahí se define el modelo de datos, la
lógica de las transacciones y las reglas de acceso.
Se puede usar Yeoman para generar un esqueleto:
yo hyperledger-composer:businessnetwork
Una vez tengamos desarrollado los modelos y la lógica de negocio podemos empaquetarlo con:
composer archive create -t dir -n .
Esto creará un fichero del tipo mired@0.0.1.bna
A continuación creamos las credenciales del administrador de la red de negocio:
createPeerAdminCard.sh
con eso se nos crea una "card" denominada "PeerAdmin@hlfv1"
A continuación hay que instalar el BNA en Fabric:
composer network install --card PeerAdmin@hlfv1 --archiveFile mired@0.0.1.bna
Luego arrancar la red:
composer network start --networkName mired --networkAdmin admin --networkAdminEnrollSecret adminpw
--card PeerAdmin@hlfv1 --file miredadmin.card --networkVersion 0.0.1
Importar la card:
composer card import --file miredadmin.card
Podemos hacer un ping a la red de negocio:
composer network ping --card admin@mired
E incluso publicar una API REST para comunicarse con la blockchain:
composer-rest-server
Existe una opción para generar un esqueleto de aplicación angular usando Yeoman:
yo hyperledger-composer
Esta aplicación se puede iniciar con:
npm start
Para actualizar una BNA se requiere realizar los siguientes pasos:
Cambiar la "version" del package.json de 0.0.1 a 0.0.2
Volver a crear el paquete esta vez con el nombre: mired@0.0.2.bna
Instalar la nueva red en Fabric:
composer network install --card PeerAdmin@hlfv1 --archiveFile mired@0.0.2.bna
Upgradar la red a la nueva versión:
composer network upgrade -c PeerAdmin@hlfv1 -n mired -V 0.0.2
Hacer un ping a la red:
composer network ping --card admin@mired
Regenerar el API REST:
composer-rest-server
Los modelos utilizan un lenguaje orientado a objetos, similiar a un lenguaje Java. Se usa un espacio de nombres para
agrupar recursos:
namespace org.tutorial.basic
Luego estos se pueden importar dentro de otros ficheros .cto con:
import org.tutorial.basic
Los tipos primitivos son: String (UTF8), Double (número decimal 64bit), Integer (número entero con signo 32 bit), Long (número entero con signo 64bit), DateTime (fecha y hora con timezone) y Boolean (un valor verdadero o falso).
Pueden asignarse valores por defecto con la palabra clave:
o valores opcionales
con la palabra: default="texto"
optional
Se pueden definir arrays con los corchetes [] y enums:
enum Estado {
o PENDIENTE
o FINALIZADO
}
Luego se pueden definir assets con la palabra
que pueden heredar de otros assets con la
palabra asset
Las propiedades de un asset se definen con una "o" el tipo de datos y el nombre de la propiedad. Y si
queremos incluir una relación se define con "-->"extends
A continuación se pueden definir participantes con la palabra
que pueden heredar de
otros participantes con la palabra:participant
Las propiedades de un participant también se definen con una "o" el tipo de datos y el nombre de la
propiedad. Y si queremos incluir una relación se define con "-->"
extends
Lo mismo se aplica para las transacciones y los eventos, pueden heredar e incluyen propiedades y relaciones.
Existe un tipo de clase abstracta que no representa assets, participantes ni transacciones. No pueden ser
referenciadas. Sirven para agrupar propiedades:
abstract concepto Direccion {
o String calle
o String ciudad
o String pais
}
Para definir la lógica de ejecución se utilizan ficheros javascript. Usa los comentarios y metadatos para
definir estas funciones.
Se describen como
porque van orientadas a eventos como Node.async nombreTransaccion()
Son atómicas y podemos lanzar una excepción con
lo que provoca un rollback y se pierden todos los cambios.throw new Error("error")
Dentro del código se puede hacer uso de varias librerías: Common, Runtime, Admin, y Client.
Estas permiten gestionar activos, emitir eventos o gestionar la red.
Las consultas a la red de negocio se definen en ficheros .qry. Las consultas van precedidas de la palabra
query y contienen una "description" y un "statement" que es la consulta de base de datos
propiamente dicha.
query seleccionaMiAsset {
description: "Selecciona todos los assets de tipo MiAsset"
statement: SELECT org.tutorial.MiAsset
}
Es posible y recomendable definir todo este código completo en el Playground y testearlo directamente.
Incluso se puede exportar todo el código completo a un fichero .bna para su despliegue en Fabric funcionando en nuestra red local.