Contenido


Aspectos básicos de Hyperledger Composer, Parte 1

Modele y pruebe su red blockchain

Empiece a crear blockchains de forma rápida y fácil en Hyperledger Composer Playground

Comments

Contenido de la serie:

Este contenido es la parte # de # de la serie: Aspectos básicos de Hyperledger Composer, Parte 1

Manténgase en contacto por contenidos adicionales de esta serie.

Este contenido es parte de la serie:Aspectos básicos de Hyperledger Composer, Parte 1

Manténgase en contacto por contenidos adicionales de esta serie.

Este tutorial le permite empezar a desarrollar una red blockchain. Le presentaré Hyperledger Composer y su interfaz de usuario, Hyperledger Composer Playground, donde se puede modelar y probar la red con tan sólo Docker y un navegador web.

Requisitos previos

Para seguir con este tutorial, debería tener el siguiente software instalado en su computadora:

¿Qué es Hyperledger Composer?

Uno de los proyectos Hyperledger alojados por The Linux Foundation, Hyperledger Composer es un conjunto de herramientas que facilita la construcción de aplicaciones de blockchain, y que está formado por:

  • Un lenguaje de modelado llamado CTO (homenaje al nombre del proyecto original, Concerto)
  • Una interfaz de usuario llamada Hyperledger Composer Playground para la configuración, las pruebas y el despliegue rápidos de una red empresarial
  • Herramientas de la Interfaz de la Línea de Comando (CLI) para integrar redes empresariales que se han remodelado utilizando Hyperledger Composer con una instancia de la red blockchain de Hyperledger Fabric que está ejecutándose

En esta parte de la serie del tutorial, voy a presentarle el lenguaje de modelado CTO y Hyperledger Composer Playground. Dejaré el CLI para la Parte 2 de esta serie, donde le mostraré todo acerca del CLI (y mucho más).

Lenguaje de modelado Hyperledger Composer (CTO)

Hyperledger Composer tiene su propio lenguaje de modelado (llamado CTO) que se usan para modelar redes empresariales. En la Parte 1, le mostraré cómo utilizar CTO para modelar la muestra Red de Alimentos Perecederos. Esta red empresarial de muestra enseña cómo productores, transportadores de importadores definen contratos para el precio de bienes perecederos, basándose en las lecturas de temperatura que reciben de los contenedores de los envíos.

Hyperledger Composer Playground

Hyperledger Composer Playground es una interfaz basada en el navegador que se puede utilizar para modelar redes empresariales: qué artículos de valor (activos) se intercambian, quién participa (participantes) en el intercambio, cómo se protege el acceso (control de accesos), cuál es la lógica empresarial (transacciones) del proceso, etc..

Hyperledger Composer Playground (Playground a partir de ahora) utiliza el almacenamiento local de su navegador para simular el almacenamiento del estado de la red blockchain, lo que significa que usted no tiene que ejecutar una verdadera red de validación de pares para utilizar Playground.

Qué hará en este tutorial

  • Aprenda conceptos de la red empresarial
  • Ejecute Playground en su computadora con Docker
  • Familiarícese con el lenguaje de modelado
  • Utilice el lenguaje de modelado para modelar o describir la red empresarial
  • Pruebe la red empresarial

En la Parte 2, le mostraré cómo se instala el conjunto completo de utilidades de desarrollo de Hyperledger Composer, cómo se trabaja con funciones más avanzadas del lenguaje CTO (incluidos los eventos), cómo se realizan pruebas unitarias de los contratos inteligentes de JavaScript, y cómo se interactúa con una verdadera red blockchain de Hyperledger Fabric con la Interfaz de la Línea de Comando (CLI).

En la Parte 3, le daré una visión avanzada de Composer: cómo se genera una interfaz de REST y una GUI con Yeoman y cómo se despliega una aplicación de red de blockchain en IBM Cloud.

Conceptos de la red empresarial

A alto nivel, la red empresarial es un grupo de entidades que trabajan juntas para lograr determinados objetivos. Para lograr esos objetivos, entre los miembros de la red empresarial debe haber un acuerdo relativo a:

  • Los bienes y servicios que se intercambian
  • Cómo se va a realizar el intercambio (incluidas las reglas de negocio que gobiernan los pagos y las multas)
  • Qué miembros del grupo tienen permiso para participar y cuándo

En la siguiente sección, le presentaré la terminología habitual de la red empresarial. Primero, quiero hablarle acerca del problema empresarial que solucionará su primera red empresarial blockchain: el envío de alimentos perecederos. Y lo que es más importante, cómo el Internet de las Cosas, los sensores de temperatura, y la Nube se utilizan para asegurar que los bienes perecederos se envíen en condiciones ideales (y qué ocurre si no se envían).

La red de Alimentos Perecederos

La Red de Alimentos Perecederos basada en el Internet de las Cosas que es una red empresarial que contiene:

  • Alimentos perecederos, como plátanos, peras y café
  • Asociados de negocio, como productores, transportistas e importadores
  • Envíos de bienes perecederos
  • Acuerdos entre partes empresariales que estipulan las condiciones de los acuerdos
  • Reconocimiento de la recepción de bienes y servicios

Por toda esta serie de tutoriales utilizaré esta red empresarial como ejemplo. A medida que avance por la serie, observará que la aplicación aumenta de complejidad a medida que introduzco más conceptos de Hyperledger Composer, y mostraré cómo están relacionados con blockchain e IBM Cloud.

Activos

Un activo es cualquier cosa de valor que se puede intercambiar entre las partes de un acuerdo comercial. Esto significa que un activo puede ser prácticamente cualquier cosa. Ejemplos incluyen:

  • Un bote
  • Una cantidad de inventario
  • Una casa
  • Una caja de plátanos
  • Un envío de plátanos
  • Un contrato para enviar 1000 cajas de plátanos por un precio X que se basa en condiciones {X, Y, Z}

Lo que usted quiera. Si tiene un valor percibido y se puede intercambiar entre partes, es un activo. En la red de Alimentos Perecederos, los activos son los propios bienes perecederos, los envíos de dichos bienes y los contratos que gobiernan las actividades que se realizan durante el intercambio.

Participantes

Un participante es un miembro de una red empresarial. Para la red de Alimentos Perecederos, esto incluye a los productores, quienes producen los bienes perecederos, los transportistas, quienes los trasportar desde los productores hacia los puertos, y los importadores, quienes se encargan de la entrega de los bienes en los puertos. Obviamente, este modelo está demasiado simplificado, pero le debería dar una visión de cómo se modelan las aplicaciones en tiempo real con la terminología de la red empresarial.

Control de Acceso

Es una red empresarial, pero no todos los participantes tienen acceso a todo. Por ejemplo, un productor no tiene acceso al contrato que existe entre el transportista y el importador. El Control de Acceso se utiliza para limitar quién tiene acceso a qué (y bajo qué condiciones).

Transacciones

Cuando un activo es "tocado", esa interacción tiene el potencial de afectar al estado del libro contable de blockchain. La interacción se modela en Hyperledger Composer como una transacción.

Algunos ejemplos de transacciones de la red de Productos Perecederos son:

  • Un sensor de IoT que está en el contenedor del envío registra una lectura de temperatura
  • Un Importador recibe el envío de alimentos perecederos
  • Un sensor GPS de IoT registra la publicación actual del contenedor de transporte

Las transacciones son la lógica de negocio (o contratos inteligentes) del sistema.

Eventos

Un evento es una notificación producida por la aplicación de blockchain, y consumida por una entidad externa (como una aplicación) de manera publicar/suscribir.

Aún que el libro contable de blockchain se actualiza a medida que los activos se intercambian en el sistema, este es un proceso interno (sistema). Sin embargo, hay veces en las que una entidad externa tiene que ser notificada del cambio del estado del libro contable, o de que en el sistema quizá haya ocurrido algo digno de mención (o que no haya ocurrido, pero debería). En este caso su aplicación de blockchain podría utilizar un evento.

Ejemplos de eventos de la red de Productos Perecederos podrían ser:

  • Una lectura de temperatura ha sobrepasado X veces el límite superior o inferior (esto, por ejemplo, podría indicar un problema con el propio contenedor de transporte).
  • Un envío ha sido recibido.
  • Un envío ha llegado al puerto (por ejemplo, un sensor GPS de IoT podría informar de este evento).

En la siguiente sección, le mostraré cómo se crea el modelo de la red de activos, participantes y transacciones de Alimentos Perecederos. Mencionaré el control de acceso y guardaré los eventos de la Parte 2 de esta serie.

Ejecute Playground en su computadora con Docker

¿Qué es Playground?

Playground es un entorno que le permite construir y probar rápidamente redes empresariales de blockchain. No necesita de una red blockchain que se esté ejecutando, así que reduce la complejidad de definir, validar y probar una red empresarial.

Playground se ejecuta dentro de un contenedor de Docker, y se puede instalar en una computadora de dos formas diferentes:

  • Con un Hyperledger Fabric que valide redes de pares
  • En modo sólo navegador

Con un Hyperledger Fabric que valide redes de pares

Este modo instala Playground con Hyperledger Fabric que valide redes de pares, e incluye el contenedor de Docker para Playground, junto con todos los otros contenedores de Docker para ejecutar Hyperledger Fabric que valide redes de pares .

A medida que profundice en las Partes 2 y 3 de este tutorial, necesitará un Hyperledger Fabric completo que valide redes de pares. Por ahora, esto es demasiado, ya que ninguna de las actividades que realizará en la Parte 1 lo requiere.

Modo sólo navegador

Con modo sólo navegador se pueden crear modelos y probar la red empresarial con una imitación de un libro contable de blockchain que resida en el almacenamiento local de su navegador.

Este es el enfoque que utilizaré para la Parte 1.

Ejecute Playground

Desde una ventana de terminal (Mac/Linux) o desde un prompt de comandos (Windows), ejecute este comando:

                docker run --name composer-playground --publish 8080:8080 hyperledger/composer-playground

Esto inicia Docker de forma interactiva. Me gusta ejecutar Playground de esta manera para poder ver lo que se registra en STDOUT:

$ docker run --name composer-playground --publish 8080:8080 hyperledger/composer-playground
0|composer | PlaygroundAPI            :createServer()            > 8080
0|composer | ConnectionProfileManager :constructor()             Created a new ConnectionProfileManager {"fs":{"constants":{"O_RDONLY":0,"O_WRONLY":1,"O_RDWR":2,"S_IFMT":61440,"S_IFREG":32768,"S_IFDIR":16384,"S_IFCHR":8192,"S_IFBLK":24576,"S_IFIFO":4096,"S_IFLNK":40960,"S_IFSOCK":49152,"O_CREAT":64,"O_EXCL":128,"O_NOCTTY":256,"O_TRUNC":512,"O_APPEND":1024,"O_DIRECTORY":65536,"O_NOATIME":262144,"O_NOFOLLOW":131072,"O_SYNC":1052672,"O_DIRECT":16384,"O_NONBLOCK":2048,"S_IRWXU":448,"S_IRUSR":256,"S_IWUSR":128,"S_IXUSR":64,"S_IRWXG":56,"S_IRGRP":32,"S_IWGRP":16,"S_IXGRP":8,"S_IRWXO":7,"S_IROTH":4,"S_IWOTH":2,"S_IXOTH":1,"F_OK":0,"R_OK":4,"W_OK":2,"X_OK":1},"F_OK":0,"R_OK":4,"W_OK":2,"X_OK":1}}
0|composer | PlaygroundAPI            :createServer()            Playground API started on port 8080 
0|composer | PlaygroundAPI            :createServer()            < 
0|composer | Composer                 :main()                    >

Si quiere ejecutar Playground de forma separada, simplemente añada --detach:

                docker run --name composer-playground --publish 8080:8080 --detach hyperledger/composer-playground

Ahora abra un navegador y vaya a http://localhost:8080 y verá una pantalla como la de la Imagen 1:

Figura 1. pantalla de bienvenida de Playground
Hyperledger Composer Playground welcome screen
Hyperledger Composer Playground welcome screen

Cuando haya terminado de ejecutar Playground, utilice ctrl+c para cerrar el contenedor que está en modo interactivo. Si está ejecutándolo en modo separado, ejecute este comando:

                docker stop composer-playground

Ahora, limpie el contenedor de Docker (o Docker se quejará si lo intenta y y lo vuelve a ejecutar):

                    docker rm --force composer-playground

Video: Ejecutar Playground, visita por la UI

En este video, le mostraré como ejecutar Playground con Docker, y le guiaré a través de la UI de Playground.

El lenguaje de modelado de Hyperledger Composer

Antes de que pueda utilizar Hyperledger Composer para probar e implementar una red empresarial de blockchain, tiene que construir un modelo de ella. Para hacer esto, Hyperledger Composer tiene su propio lenguaje de modelado.

Vaya, genial, hay que aprender otro lenguaje, ¿verdad? Afortunadamente, el lenguaje de moderado CTO es sencillo (e intuitivo si ya se ha trabajado con conceptos orientados a objetos).

El lenguaje de modelado CTO está fuertemente enfocado (para modelar las redes empresariales) y sólo tiene algunas palabras clave, así que no hay mucho que aprender. El modelo de su red empresarial reside en un archivo que tiene una extensión de archivo .cto , y que contiene las definiciones para los siguientes elementos:

  • Espacio de nombres
  • Recursos
  • Importa de otros espacios de nombres, según se necesite

Si el modelo es muy grande, se pueden tener muchos archivos del modelo .cto , según se necesite. Todos los archivos del modelo .cto deben incluir un único espacio de nombres y, al menos, una definición de recursos.

Espacio de nombres

Un espacio de nombres crea un límite dentro del cual los nombres del ámbito se consideran únicos. Todos los archivos del modelo .cto requieren de un espacio de nombres, lo que significa que todos los nombres de un archivo del modelo .cto deben ser únicos.

Usted ya está familiarizado con el concepto de espacio de nombres, incluso si todavía no se ha dado cuenta. Los sistemas de archivos utilizan el directorio como el espacio de nombres, para que dos archivos del mismo directorio no puedan tener el mismo nombre. Sin embargo, en directorios diferentes se permite tener dos archivos con el mismo nombre, ya que están en diferentes espacios de nombres.

Para resumir: Dos recursos de un archivo del modelo CTO (el límite del espacio de nombres) no pueden tener el mismo nombre.

Recurso

Recurso es una de las siguientes cosas:

  • activo - un Activo de una red empresarial
  • participante - un Participante de la red empresarial
  • transacción - lógica de negocio
  • evento - una notificación de que está ocurriendo algo interesante en el sistema
  • tipo enumerado - un conjunto de valores denominados
  • concepto - cualquier objeto que quiera modelar que no sea de uno de los otros tipos

Cada tipo de recurso corresponde a un tipo de modelo del mismo nombre (por ejemplo, activo se utiliza para modelar a un Activo, participante modela a un Participante, etc.).

Los recursos tienen las siguientes propiedades:

  • Un espacio de nombres en el que están definidos
  • Un nombre, que debe ser único dentro del espacio de nombres
    • Si el recurso es un activo o participante, debe tener un campo identificativo que se indica por identified by (identificado por) seguido por el nombre del campo
  • (opcional) Su tipo de padre (súpertipo), si corresponde, que lo indica extiende seguido por el nombre del tipo de padre
  • (opcional) La palabra clave abstract (abstracto), si no quiere iniciar el recurso, sino que prefiere utilizarlo como súpertipo para otros recursos de ese tipo

En la red de Productos Perecederos el activo Shipment (Envío) se modela de esta manera:

                /**
                  * Una red empresarial para enviar bienes perecederos
                  * El carguero tiene la temperatura controlada y los contratos
                  * se pueden negociar basándose en las lecturas de la temperatura
                  * que se reciben del carguero
                  */
                namespace org.acme.shipping.perishable
                .
                .
                /**
                 * Un envío que está siendo rastreado como un activo del libro contable
                 */
                asset Shipment identified by shipmentId {
                  o String shipmentId
                  o ProductType type
                  o ShipmentStatus status
                  o Long unitCount
                  o TemperatureReading[] temperatureReadings optional
                  --> Contract contract
                }

Echemos un vistazo al ejemplo anterior, que voy a señalar algunas cosas.

El espacio de nombres es org.acme.shipping.perishable.

La palabra clave asset (activo) indica que Shipment (Envío) es un activo. La propiedad (que se indica por la "o" minúscula) shipmentId es del tipo String (cadena), e identifica de manera única a Shipment (tal como lo indica identified by).

Cada una de sus propiedades tiene un tipo, que pueden ser de tipo fundamental (como String) o de tipo enumerado (como ProductType), o transacción (como una matriz de TemperatureReading).

La referencia (que se indica por -->) a Contract (contrato) se llama relación, y es de una dirección (unidireccional).

Tipos enumerados

Cuando se conoce el conjunto de valores que puede tener una propiedad particular, ésta se debería modelar con el tipo enumerado. Esto facilita la operación de restringir valores, lo que simplifica la validación.

Los tipos enumerados se declaran de esta manera:

               /**
                 * El tipo de productos perecederos que se están enviando
                 */
                enum ProductType {
                  o BANANAS
                  o APPLES
                  o PEARS
                  o PEACHES
                  o COFFEE
                }

Conceptos

Cuando en su modelo empresarial exista una entidad que no sea un activo, participante, transacción o evento, debe modelar la entidad como concept (concepto).

                /**
                 * Un concepto para una dirección fácil
                 */
                concept Address {
                  o String city optional
                  o String country
                  o String street optional
                  o String zip optional
                }

El concepto de Dirección (Address) es importante en el modelo empresarial, pero no encaja perfectamente en una de las otras categorías, esa es la razón por la que se modela como concept.

Importaciones

Las importaciones se utilizan en un archivo de modelo .cto para indicar una relación entre una entidad de ese archivo del modelo y una entidad de otro archivo del modelo.

En este tutorial no voy a hablar de importaciones, ya que el modelo en el que va a trabajar es muy pequeño. El concepto es similar al de import del lenguaje Java™ y a #include de C++.

Referencia al CTO

Una vez haya aprendido la sintaxis básica (que en la mayoría de los casos es obvia por el contexto), el lenguaje de modelación es fácil de captar. Si ya se ha trabajado con conceptos orientados a objetos, será aún más fácil.

Si quiere saber más, le recomiendo que lea toda la documentación para el lenguaje de modelado CTO.

Modele la red de negocio

En el video anterior, le mostré cómo se utiliza Playground para crear un modelo empresarial vacío. En esta sección, usted va a modelar la red de Productos Perecederos en Playground (no se preocupe, tendrá la ayuda de la plantilla perishable-network que está incorporada).

Borrar el almacenamiento localhost del navegador

Si ve una pantalla de bienvenida como la de la Imagen 1, podrá continuar, y podrá saltar directamente a "Crear un modelo nuevo en Playground."

En el modo sólo navegador, Hyperledger Composer sólo permite trabajar con un modelo cada vez. Si tiene cargado otro modelo, tendrá que borrar el almacenamiento local de su navegador antes de cargar otro modelo.

Playground debería ser capaz de reemplazar su modelo actual por uno nuevo. Sin embargo, si tiene errores puede comenzar "desde cero" borrando el almacenamiento local de su navegador. El procedimiento varía dependiendo del navegador.

En Chrome, por ejemplo, bajo Ajustes > Avanzados > Ajustes de contenido > Cookies > Todas las cookies y datos del sitio > localhost, haga clic en el icono de la papelera para eliminar el almacenamiento local. Si usted está utilizando un navegador diferente, siga las instrucciones específicas de ese navegador y borre todo el almacenamiento local.

Crear un modelo nuevo en Playground

En el recuadro video anterior, le he mostrado cómo se crea una red empresarial nueva y vacía en Playground, además de los aspectos básicos de cómo utilizar Playground, así que no lo repetiré aquí. Si no ha tenido la oportunidad de ver el video, debería echarlo un vistazo antes de intentar continuar.

Para empezar, haga clic en el botón Vamos a crear un Blockchain (vea la Imagen 1). Después, cree una red empresarial nueva a partir de la plantilla perishable-network. Llámela perishable-iot-network y haga clic en Desplegar.

En la tarjeta de ID de Administrador, haga clic en el enlace Conectar ahora. Debería ver algo parecido a la Imagen 2.

Figura 2. La red de Alimentos Perecederos
The Perishable Goods network
The Perishable Goods network

Bajo ARCHIVOS (FILES), observe lo siguiente:

  • README.md - este archivo Markdown brinda una visión general rápida de la red de Alimentos Perecederos
  • models/perishable.cto - contiene el modelo empresarial
  • lib/logic.js - contiene el código de la lógica de negocio (contrato inteligente), lo que incluye la implementación de la transacción

Cuando se selecciona uno de los archivos que está bajo ARCHIVOS, se abre la ventana del editor de la derecha. Continúe y abra el archivo del modelo (perishable.cto), que contiene el modelo.

El activo Grower (Productor) se modela de la siguiente manera:

                /**
                 * Un tipo de participante abstracto en esta red empresarial
                 */
                abstract participant Business identified by email {
                  o String email
                  o Address address
                  o Double accountBalance
                }

                /**
                 * Un Grower (Productor) es un tipo de participante de la red
                 */
                participant Grower extends Business {
                }

Y el Shipper (Transportista) de la siguiente manera:

                /**
                 * Un Shipper (Transportista) es un tipo de participante de la red
                 */
                participant Shipper extends Business {
                }

El activo Contract (Contrato) de la siguiente manera:

                /**
                 * Define un contrato entre un Productor y un Importador para enviar con un
                 * Transportista, por lo que se paga un precio unitario establecido. El precio unitario se multiplica por
                 * un factor de penalización proporcional a la desviación de las temperaturas mínima y máxima
                 * negociadas para el envío.
                 */
                asset Contract identified by contractId {
                  o String contractId
                  --> Grower grower
                  --> Shipper shipper
                  --> Importer importer
                  o DateTime arrivalDateTime
                  o Double unitPrice
                  o Double minTemperature
                  o Double maxTemperature
                  o Double minPenaltyFactor
                  o Double maxPenaltyFactor
                }

Le animo a que se familiarice con el modelo, y a que conozca cuál es la apariencia de los recursos dentro del editor. Haga lo mismo para lib/logic.js y también familiarícese con el código de JavaScript.

Instancie el modelo

Haga clic en la pestaña Probar de la parte superior de la pantalla y verá algo parecido a la Imagen 3.

Figura 3. perishable-network - Pestaña de Prueba
perishable-network - Test Tab
perishable-network - Test Tab

Observe que los Activos y los Participantes del modelo aparecen en la parte izquierda de la pantalla, pero en el centro hay un mensaje que dice que el registro está vacío. ¿Qué está ocurriendo?

Como le mostré en el video, la primera vez que se crea una red empresarial los registros de Activos y Participantes están Vacíos. Es necesario crear instancias de Activos y Participantes, y esas instancias residirán en el registro.

En la siguiente sección, le mostraré cómo se instancia y se prueba el modelo.

Pruebe la red empresarial

Los modelos son geniales para funcionar como una especie de plano maestro para la aplicación que está construyendo, pero el modelo de una cosa no es de gran utilidad salvo que (en algún momento) cree una cosa real. Por ejemplo, el conjunto de planos maestros de un rascacielos es algo crítico si usted va a construir un rascacielos, ¡pero no es de gran utilidad salvo que en algún momento lo estén utilizando para construir (instanciar) un edificio real!

Volvemos al modelo de negocio, que, si va a ser útil, tiene que ser instanciado. Pero, ¿qué significa eso para una aplicación de blockchain?

Los registros de Activos y Participantes

Antes hemos visto el modelo para un participante Productor, un activo Envió asset, etc. Ahora es el momento de instanciar esos recursos, cuyas instancias residirán en sus respectivos registros. Así que las instancias de los activos van en el registro de activos, y las instancias de participantes van en el registro de participantes.

El modelo perishable-network incluye una transacción que se implementa como una función JavaScript en el módulo lib/logic.js llamado setupDemo() que se puede utilizar para instanciar el modelo y que crea entradas en los registros de Activos y Participantes. Se brinda como una forma de que la red empresarial que se obtiene de la plantilla se ponga en funcionamiento de una forma más rápida que si se introdujese el modelo de forma manual.

Aquí no mostraré la función setupDemo(), pero quiero señalar que hace tres cosas:

  1. Crea instancias de todos los activos y participantes del modelo
  2. Establece los valores de las propiedades de esas instancias
  3. Almacena las instancias en sus respectivos registros

Le animo a que abra el archivo lib/logic.js en el editor, y que lo vea por sí mismo

Instancie el modelo

Para ejecutar la transacción SetupDemo, haga clic en el botón Enviar Transacción y aparecerá un diálogo modal parecido al de la Imagen 4.

Figura 4. SubmitTransaction - SetupDemo
SubmitTransaction - SetupDemo
SubmitTransaction - SetupDemo

Asegúrese de que SetupDemo aparece en la lista desplegable Tipo de Transacción , después haga clic en el botón Enviar. Cuando la transacción se ejecute correctamente, usted verá un breve mensaje de notificación que se lo dirá.

Seleccione Productor del panel ACTIVOS del lado izquierdo, y todas sus instancias aparecerán en el lado derecho (Imagen 5). Lo mismo ocurre con los otros recursos (adelante, ¡pruébelo!).

Figura 5. Una instancia del activo Productor
A Grower asset instance
A Grower asset instance

Ahora que tiene definida una red empresarial, y los activos y participantes de sus respectivos registros, puede probar su red.

¿Qué ocurre con las transacciones?

Hasta ahora, en esta sección he hablado acerca de activos y participantes, pero ¿qué ocurre con las transacciones del modelo empresarial? ¿Dónde se muestran?

Para responder a la primera pregunta: la transacción representa la lógica del negocio de la aplicación (contratos inteligentes o chaincode). La lógica de negocio que impone el contrato inteligente que setupDemo() genera, estipula las siguientes condiciones:

  1. En todo momento la temperatura que está dentro del contenedor transporte tiene que ser de 6 grados Celsius. Si la temperatura del envío cae por debajo del rango acordado (+/- 5 grados), el precio del envío (0,50 $/unidad) se reduce 0,20 $/unidad por cada grado que esté por debajo y 0,10 $ por cada grado que esté por encima.
  2. Si el envío llega tarde, el Productor no recibirá ningún pago por el envío.

Vale, ¿dónde se muestran las transacciones? Las transacciones no se instancian por si mismas, en vez de eso se muestran como código JavaScript en el archivo lib/logic.js.

La Imagen 6 muestra el código del contrato inteligente (de lib/logic.js) que hace cumplir la segunda estipulación (los envíos retrasados no se pagan) del contrato.

Figura 6. Contrato inteligente: Penalización por envío retrasado
Smart contract: Late shipment penalty
Smart contract: Late shipment penalty

¿Qué ocurre con el control de acceso?

El control de acceso se gobierna por un archivo del modelo llamado permissions.acl. En la sección Conceptos de la red empresarial, presente el control de acceso como uno de los conceptos principales. En las Partes 2 y 3, cubriré más en detalle este tema de extrema importancia y cómo se controla el acceso a las aplicaciones de blockchain.

Echemos un vistazo a permissions.acl de la pestaña Definir del modelo. La plantilla perishable-network que se incluye en el archivo Lista de Control de Acceso (ACL) se parece a esto:

                /**
                 * Lista de control de acceso de muestra.
                 */
                rule Default {
                    description: "Allow all participants access to all resources"
                    participant: "ANY"
                    operation: ALL
                    resource: "org.acme.shipping.perishable.*"
                    action: ALLOW
                }
                
                rule SystemACL {
                  description:  "System ACL to permit all access"
                  participant: "org.hyperledger.composer.system.Participant"
                  operation: ALL
                  resource: "org.hyperledger.composer.system.**"
                  action: ALLOW
                }

El archivo ACL contiene reglas que le permiten controlar el acceso a los recursos de su aplicación de blockchain. Basta decir que Hyperledger Composer le mantiene protegido en lo relativo a la seguridad (le mostraré todo lo relativo a esto más tarde en esta serie de tutoriales).

Por ahora, las reglas de control de acceso que se han definido antes otorgan prácticamente el acceso completo, lo que por ahora está bien ya que acabamos de empezar con Hyperledger Composer.

Pruebe el modelo

Ahora que el modelo está instanciado, es el momento de probarlo, ¡y eso significa que hay que ejecutar el código! En este caso, significa ejecutar el código de JavaScript desde lib/logic.js.

Antes de configurar la prueba vamos a revisar el contrato (que fue instanciado por la función setupDemo()) para ver los términos. La imagen 7 muestra el código JavaScript que se utiliza para instanciar el activo del contrato:

Figura 7. Contrato inteligente: términos y condiciones
Smart contract: terms and conditions
Smart contract: terms and conditions

Así que ya está listo para aprobar el contrato inteligente. Ejecute Playground en su navegador, y haga clic en la pestaña Probar de la parte superior de la UI de Playground UI.

Vamos a probar el siguiente escenario:

  1. Los sensores de temperatura IoT brindan las siguientes lecturas (los números son grados Celsius):
    1. 5
    2. 7
    3. 1
    4. 4
  2. El Envío ha sido recibido

Echemos un vistazo de uno en uno a los componentes de este escenario, empezando con los datos del sensor de temperatura.

En una aplicación del mundo real, los sensores de temperatura del IoT podrían, por ejemplo, enviar estos datos a IBM Cloud, donde se podría invocar el código del contrato inteligente contra el blockchain para registrar esas transacciones.

En Playground, el blockchain se mantiene en el almacenamiento local del navegador, pero el código de la transacción que ejecuta es el mismo independientemente de donde resida el blockchain (lo que hace de Playground un lugar perfecto para realizar las pruebas, ¿verdad?).

Vea la función temperatureReading() de dentro de lib/logic.js:

                /**
                 * Se ha recibido la lectura de la temperatura de un envío
                 * @param {org.acme.shipping.perishable.TemperatureReading} temperatureReading - la transacción TemperatureReading
                 * @transaction
                 */
                function temperatureReading(temperatureReading) {

                    var shipment = temperatureReading.shipment;
                
                    console.log('Adding temperature ' + temperatureReading.centigrade + ' to shipment ' + shipment.$identifier);

                    if (shipment.temperatureReadings) {
                        shipment.temperatureReadings.push(temperatureReading);
                    } else {
                        shipment.temperatureReadings = [temperatureReading];
                    }
                
                    return getAssetRegistry('org.acme.shipping.perishable.Shipment')
                        .then(function (shipmentRegistry) {
                            // añadir la lectura de la temperatura al envío
                            return shipmentRegistry.update(shipment);
                        });
                }

En la aplicación del mundo real, cuando un sensor de IoT del contenedor de transporte quiere enviar una lectura, la envía a la nube (a través de la red del barco carguero), donde se recoge por, por ejemplo, una función sin servidor que se ejecuta en OpenWhisk, que invoca la función temperatureReading().

Para simularlo en Playground:

  1. Haga clic en el botón Enviar Transacción (igual que hizo para invocar a la función setupDemo()).
  2. Asegúrese de que TemperatureReading aparece en la lista desplegable Tipo de Transacción.
  3. Cambie la lectura de "centigrade" de 0 a 5 (la primera lectura que queremos enviar) en la ventana Vista Previa de Datos JSON.
  4. Asegúrese de que el ID del envío sea SHIP_001.
  5. Haga clic en Enviar.
  6. Repítalo para las tres lecturas que faltan.

para recibir el envío en una aplicación del mundo real, una aplicación que se esté ejecutando en el dispositivo manual del importador podría indicar a una aplicación que se esté ejecutando en IBM Cloud (o una función sin servidor que se ejecute en OpenWhisk) que el envío ha sido recibido, que después calcularía el pago que se va a enviar al productor.

Para simular la recepción del envío en Playground, ejecute la transacción ShipmentReceived en Playground, asegúrese de que brinda el ID del envío, y haga clic en Enviar.

Video: Cómo probar el modelo y ver las transacciones

Hemos cubierto mucho, lo sé. Pero no se preocupe: en el siguiente video, le mostraré cómo probar el modelo y cómo ver en la consola JavaScript del navegador los resultados de todas que ejecute.

Cómo trabajar con modelos

Así que, tiene este gran modelo empresarial de blockchain. ¿Ahora qué?

Exporte el modelo

Supongamos que quiere que el modelo esté disponible para otros miembros de su equipo, o que tiene que exportar el modelo para desplegarlo en producción de una red blockchain real (Le mostraré cómo hacerlo en la Parte 2).

Playground tiene la función de exportación que permite crear un archivo de un Archivo de Redes Empresariales (BNA) que se puede compartir. Para exportar el modelo, en la pestaña Definir, haga clic en el enlace Exportación de la parte inferior izquierda de la pantalla, y Playground generará un archivo de un Archivo de Redes Empresariales (BNA) y luego lo descargará a su computadora.

Importe un modelo

Supongamos que tiene un archivo de un Archivo de Redes Empresariales (BNA) — que posiblemente haya recibido de un miembro del equipo — y que quiere jugar con él en Playground.

¿Cómo se pone un archivo BNA dentro de Playground? Primero, asegúrese de que Playground esté en funcionamiento. Después, bajo la pestaña Definir, elija Importar/Reemplazar. En la pantalla de Importar/Reemplazar Red, haga clic en Deje aquí para subir o navegue, utilice el diálogo de navegar para publicar y seleccionar el archivo BNA que usted quiere importar, y elija Abrir. Luego haga clic en Importar y confirme que quiere reemplazar el modelo actual con el que usted quiere importar.

Nota: Si tiene algún problema importando el archivo BNA, limpie el almacenamiento local de su navegador y vuelva a intentar importar. Vea la sección "Borrar el almacenamiento localhost del navegador " de antes en este tutorial para obtener más información.

Conclusión para la Parte 1

La Parte 1 de esta serie de tutoriales ha mostrado cómo utilizar Docker para ejecutar Playground y ha presentado los aspectos básicos del lenguaje de modelado Hyperledger Composer (CTO). También ha visto cual es el aspecto en Playground de un modelo de una red empresarial sencilla mediante la creación de una red empresarial nueva que se construyó en la plantilla perishable-network que brinda la imagen de Playground Docker.

Después, el tutorial mostró cómo probar ese modelo almacenando las diferentes transacciones hacia el blockchain de las lecturas de la temperatura, y cómo el contrato inteligente utilizó esas transacciones para resolver los términos del contrato cuando se recibió el Envío.

Finalmente, mostré cómo compartir modelos con colegas y con otras personas mediante la exportación y la importación de modelos en Playground, respectivamente.

Permanezca atento por la Parte 2, que le mostrara cómo construir y perfeccionar la red empresarial existente de la Parte 1, y también a hacer las pruebas unitarias y desplegarla en IBM Cloud.


Recursos para Descargar


Temas relacionados


Comentarios

Inicie Sesión o Regístrese para agregar comentarios.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Internet of Things, Cloud computing
ArticleID=1057966
ArticleTitle=Aspectos básicos de Hyperledger Composer, Parte 1: Modele y pruebe su red blockchain
publish-date=02082018