¡Participa de la Maratón Behind the Code, la competencia de programación más desafiante! Inscríbete aqui

Implementar una aplicación de muestra en el IBM Blockchain Platform

En este tutorial vemos cómo crear una red en IBM Blockchain Platform, cómo instalar un contacto inteligente (chaincode) en un canal de la red y cómo implementar una aplicación de muestra en ella. Verá cómo se rellena el libro contable compartido y cómo comunicarse con él haciendo llamadas desde una aplicación cliente local para consultar y actualizar el libro contable.

La IBM Blockchain Platform, previamente conocida como High Security Business Network (HSBN), es un servicio completamente integrado, preparado para la empresa y que se ejecuta en IBM Cloud. La plataforma está diseñada para acelerar el desarrollo, el gobierno y el funcionamiento de una red empresarial con múltiples instituciones.

La aplicación de muestra que utilizaremos en este tutorial es una muestra de Hyperledger Fabric llamada «fabcar» y, aunque puede ejecutarla de forma local dentro de un contenedor de Docker, en este tutorial verá cómo se instala y cómo se ejecuta en IBM Blockchain Platform en IBM Cloud. Hyperledger es un esfuerzo colaborativo global, de código abierto y organizado por The Linux Foundation, para avanzar en las tecnologías blockchain multiindustria. Hyperledger Fabric es un proyecto de Hyperledger y una implementación de infraestructura cuya arquitectura modular alimenta a IBM Blockchain Platform.

Crear una red en IBM Blockchain Platform

Para completar este tutorial, necesitará una cuenta de IBM Cloud y una suscripción de pago del Enterprise Membership Plan de IBM Blockchain Platform, que le permitirá activar una red de blockchain en producción. Tenga en cuenta que la Plataforma se actualiza a menudo, y que las capturas de pantalla de este tutorial pueden no coincidir exactamente con las que usted ve.

  1. Empezando en la página Construir rápidamente con IBM Blockchain Platform, seleccione Planos de Servicios. Luego haga clic en Actualizar (si ya tiene una cuenta de prueba) o Crear (si no tiene una cuenta de prueba). Ahora podrá ver la pantalla de bienvenida. Haga clic en Crear Red para ver el panel de instrumentos de su red.

    Al centro con un aplicativo, conectado a un círculo a la izquierda con datos y otro a la derecha con gente, estos se ramifican conectando productos y lugares

  2. Ahora podrá ver el asistente de Crear Red. Complete el asistente.

    Pantalla inicial de creación de la red, solicitando nombre de la red, localidad y empresa

  3. En la siguiente página es posible invitar a miembros añadiendo el nombre de su institución y su dirección de email. Sin embargo, para este tutorial, no es necesario invitar a ningún miembro; solo tiene que hacer clic en Siguiente. En la siguiente página es posible aceptar las reglas y las políticas de gobierno predeterminadas haciendo clic en Siguiente. En la última página podrá revisar el resumen de los detalles que ha brindado y podrá hacer clic en Hecho.
  4. Cuando haya acabado verá una página de resumen; haga clic en Ingresar Red para obtener una visión general de su red de blockchain y de los recursos que acaba de crear.

    Página de la red creada con la lista de nodos que contiene

  5. Haga clic en Añadir Pares en la página de Visión General y añada el número de pares. Para este tutorial, con 2 pares es suficiente.

    Página con la opción de agregar pares a la red de blockchain

  6. Los pares ahora aparecerán en la página de Visión General.

    Imagen de la lista de pares agregada a la red

Crear un canal

El siguiente paso es crear un canal llamado «fabcar.» Un canal es una agrupación lógica de pares seleccionados de la red de blockchain. El canal permite que los pares asociados con ese canal vean las transacciones de los otros, pero los pares que están fuera del canal no pueden ver esas transacciones. Brinda un nivel de privacidad de las transacciones y de seguridad entre los pares. Cada canal puede tener instanciado el mismo chaincode o diferentes, según sus necesidades empresariales.

  1. En la red de blockchain, haga clic en la pestaña Canales de la izquierda, y seleccione Crear Canal. Ingrese el nombre del canal fabcar y haga clic en Siguiente.

    Menú para crear un nuevo canal solicitando el nombre del canal y una descripción

  2. Asigne un rol a cada miembro y haga clic en Siguiente. Asegúrese de que para este paso estén seleccionadas todas las opciones.

    Menú de opción para agregar nombre de nuevos miembros y asignarles un rol

  3. Revise la política de actualización de canales y haga clic en Enviar Solicitud.

    Menú para revisar la política de actualización de canales y opciones para cancelar, volver o enviar solicitud

  4. Encontrará una notificación en la pestaña Notificaciones. Seleccione la casilla de verificación Solicitud de Canal y haga clic en Revisar Solicitud.

    Aviso indicando que hay solicitaciones sin leer

  5. Revise la política y los miembros del canal. Haga clic en Aceptar para aceptar la invitación del canal.

    Menú mostrando política del canal y miembros del canal con opciones de aceptar o declinar

  6. En la pestaña Notificaciones, seleccione el canal y haga clic en Enviar Solicitud.

    Menú de notificaciones que muestra el pedido y la opción de enviar solicitud

  7. Seleccione la pestaña Canales y haga clic en Enviar.

    Menú de envío de solicitud, con nombre, rol y status del miembro con la opción de enviar.

  8. Haga clic en Unir Pares en la pestaña Canales.

    Lista de los pares del canal, que muestra la opción de unir pares

  9. Seleccione los pares que se deberían unir a este canal. Haga clic en Añadir los Seleccionados.

    Lista de casillas de los pares seleccionados y la opción de añadir los seleccionados

  10. Ahora podrá ver que el canal ha sido creado.

    El canal creado con su nombre, fecha de creación y pares que participan en él

Instale chaincode en el canal

Después de crear el canal, el siguiente paso es instalar el chaincode. Utilizaremos el chaincode de la aplicación de muestra «fabcar».

  1. Para obtener el chaincode, siga las instrucciones para «Obtener una Red de Muestra» o clone el git de este repositorio:

    git clone https://github.com/hyperledger/fabric-samples.git

  2. Para instalar el chaincode, seleccione la pestaña de Chaincode, elija un par, y haga clic en Instalar chaincode. Ingrese «fabcar» en el nombre de chaincode, ingrese «v3» en la versión de chaincode, y haga clic en Elegir Archivos para seleccionar el archivo chaincode fabcar.go desde la carpeta fabric-samples/chaincode/fabcar que descargó desde GitHub. Haga clic en Enviar.

    Menú para elegir el par, instalar el chaincode y enviar la solicitud

  3. El chaincode ya está instalado en el par.

    Pantalla de verificación del par donde fue instalado el chaincode

  4. El siguiente paso es instanciar el chaincode en un canal llamando al método init del chaincode. Para este paso no se necesitan argumentos, así que puede elegir el canal «fabcar» y dejar vacío el campo de argumentos.

    Menú de opciones con el campo argumento y el nombre del canal

  5. El chaincode instanciado se parecerá a esto:

    Verificación de una línea con el nombre del canal instanciado y su versión

  6. Cuando el chaincode haya sido instanciado en el canal, seleccione la pestaña lateral Canales y elija la opción Chaincode. Entonces podrá ver tres botones bajo fabcar:

    • JSON: Este archivo JSON contiene las credenciales y la información de los pares para la red de blockchain.
    • Registros: Todos los registros de chaincode se imprimen aquí.
    • Borrar: Esto borra/detiene la instancia de chaincode.

    Menú con opción de instalación del chaincode y los tres botones de  JSON, Registros y Borrar

    En la carpeta fabric-samples/fabcar, cree una carpeta nueva llamada config. Haga clic en el botón JSON, y se abrirá una pestaña nueva. Copie todos los datos que se muestran en esta pestaña en un archivo nuevo que se llame blockchain_creds.json y guarde este archivo dentro de la carpeta «config».

Configurar la aplicación para que se ejecute en IBM Blockchain Platform

Para ejecutar su aplicación en IBM Blockchain Platform, tendrá que hacer algunos cambios en la muestra «fabcar».

Ejecute npm install

Ejecute npm install desde dentro de la carpeta de «fabcar»:

cd fabric-samples/fabcar
npm install

Es posible que en Windows tenga que instalar Windows Build Tools si obtiene errores:

npm install --global windows-build-tools

Extraer certificados

En IBM Blockchain Platform está activada la Transport Layer Security (TLS), y, por lo tanto, tiene que extraer los certificados TLS que brinda el servicio para establecer una conexión siguiendo estos pasos.

Cree un directorio llamado «network» dentro del directorio «fabcar», y después ejecute extractCerts.js como se muestra a continuación. Esto creará un certificado CA y un certificado de pares en la ruta dada, o de forma predeterminada en la carpeta ./network/tls que está dentro del directorio «fabcar». De forma predeterminada, tomará la información de /config/blockchain_creds.json que está dentro del directorio «fabcar».

node extractCerts.js

o

node extractCerts.js --input= /config/blockchain_creds.json --cert_path=./network/tls

Además de crear los archivos del certificado, este comando imprime un EnrollId, un EnrollSecret y un CA_URL que se van a utilizar en el siguiente paso. También imprime tres URLs que se utilizarán después para inscribir a los usuarios (peer-url, peer-event-url y orderer-url).

Registrar usuarios

Ejecute el siguiente comando con los EnrollId, EnrollSecret y CA_URL de la sección anterior. Generará un certificado en la ruta de la cartera del usuario proporcionado.

node enrollUser.js --wallet_path=./network/creds --user_id=admin --user_secret=secret --ca_url=https://fft-zbcxxx.4.secure.blockchain.ibm.com:15185

Iniciar el chaincode

Antes de poder consultar y actualizar el libro contable, tiene que ejecutar una transacción de configuración para llenar el libro contable con algunos datos de muestra.Haga una copia del archivo «invoke.js» que está en la carpeta fabric-samples/fabcar y llame a la copia «invokeNetwork.js». Asegúrese de que la copia esté en la misma carpeta que el archivo original. Después, realice los siguientes cambios al comando invokeNetwork.js.

  1. Añada el siguiente parámetro require justo debajo de la variable util.

    var fs = require("fs")
    
  2. Modifique la variable options como se muestra a continuación. Asegúrese de que actualiza los campos peer_url, event-url e orderer-url con los valores que devuelve la ejecución de extractCerts.js anterior.

    var options = {
        wallet_path: path.join(__dirname, './network/creds'),
        user_id: 'admin',
        channel_id: 'fabcar',
        chaincode_id: 'fabcar',
        peer_url: '<peer_url>',
        event_url: '<peer-event-url>',
        orderer_url: '<orderer-url>',
        tls_cert: {
            pem: fs.readFileSync(path.join(__dirname, './network/tls') + '/peer.cert').toString(),
        }
    };
    
  3. Para activar la TLS, reemplace este código:

    var peerObj = client.newPeer(options.peer_url);
    

    con:

    var peerObj = client.newPeer(options.peer_url, {
        pem: options.tls_cert.pem
    });
    
  4. Reemplace este código:

    channel.addOrderer(client.newOrderer(options.orderer_url));
    

    con:

    channel.addOrderer(client.newOrderer(options.orderer_url, {
        pem: options.tls_cert.pem
    }));
    
  5. Reemplace este código:

    eh.setPeerAddr(options.event_url);
    

    con:

    eh.setPeerAddr(options.event_url, {
        pem: options.tls_cert.pem
    });
    
  6. Finalmente, cambie el valor del campo fcn de la variable request de createCar a initLedger, y haga que args sea una matriz vacía. La variable «request» cambiada ahora se debería parecer a esto:

    var request = {
            targets: targets,
            chaincodeId: options.chaincode_id,
            fcn: 'initLedger',
            args: [''],
            chainId: options.channel_id,
            txId: tx_id
    };
    
  7. Ahora, guarde el archivo y ejecute el comando nuevo utilizando node invokeNetwork.js. El resultado esperado es:

    ...
    Transacción enviada correctamente al ordenante.
    

Consultar al libro contable

El comando invokeNetwork.js ya ha completado el libro contable con algunos datos de muestra, así que vamos a consultar al libro contable para ver los datos. Haga una copia del archivo «query.js» que está en la carpeta fabric-samples/fabcar y llame a la copia «queryNetwork.js». Asegúrese de que la copia esté en la misma carpeta que el archivo original. Después, realice los siguientes cambios al comando queryNetwork.js.

  1. Añada el siguiente parámetro require justo debajo de la variable path.

    var fs = require("fs")
    
  2. Modifique la variable options como se muestra a continuación. Asegúrese de que actualiza el valor del campo network_url con el valor de peer_url que devolvió la ejecución del extractCerts.js anterior.

    var options = {
        wallet_path: path.join(__dirname, './network/creds'),
        user_id: 'admin',
        channel_id: 'fabcar',
        chaincode_id: 'fabcar',
        network_url: '<peer_url>',
        tls_cert: {
            pem: fs.readFileSync(path.join(__dirname, './network/tls') + '/peer.cert').toString(),
        }
    };
    
  3. Reemplace este código:

    channel.addPeer(client.newPeer(options.network_url));
    

    con:

    channel.addPeer(client.newPeer(options.network_url, {
        pem: options.tls_cert.pem
    }));
    

    Ahora, guarde el archivo y ejecute el comando nuevo utilizando node queryNetwork.js. El resultado esperado es:

    ...
    Cuenta de resultados de la consulta =  1
    La respuesta es  [{"Key":"CAR0","Record":{"make":"Toyota","model":"Prius","colour":"blue","owner":"Tomoko"}},{"Key":"CAR1","Record":{"make":"Ford","model":"Mustang","colour":"red","owner":"Brad"}},{"Key":"CAR10","Record":{"make":"","model":"","colour":"","owner":"Tom"}},{"Key":"CAR11","Record":{"make":"Honda","model":"Accord","colour":"Black","owner":"yog"}},{"Key":"CAR12","Record":{"make":"Honda","model":"Accord","colour":"Black","owner":"Tom"}},{"Key":"CAR2","Record":{"make":"Hyundai","model":"Tucson","colour":"green","owner":"JinSoo"}},{"Key":"CAR3","Record":{"make":"Volkswagen","model":"Passat","colour":"yellow","owner":"Max"}},{"Key":"CAR4","Record":{"make":"Tesla","model":"S","colour":"black","owner":"Adriana"}},{"Key":"CAR5","Record":{"make":"Peugeot","model":"205","colour":"purple","owner":"Michel"}},{"Key":"CAR6","Record":{"make":"Chery","model":"S22L","colour":"white","owner":"Aarav"}},{"Key":"CAR7","Record":{"make":"Fiat","model":"Punto","colour":"violet","owner":"Pari"}},{"Key":"CAR8","Record":{"make":"Tata","model":"Nano","colour":"indigo","owner":"Valeria"}},{"Key":"CAR9","Record":{"make":"Holden","model":"Barina","colour":"brown","owner":"Shotaro"}}]
    

Actualizar el libro contable

Finalmente, vamos a actualizar el libro contable. Para hacerlo, se puede hacer otro sencillo cambio al nuevo comando invokeNetwork.js que usted creó anteriormente.

  1. Edite la variable request como se muestra a continuación para que invoque el chaincode createCar con un conjunto de argumentos que describan el automóvil que se va a crear. La variable «request» cambiada se debería parecer a esto:

    var request = {
            targets: targets,
            chaincodeId: options.chaincode_id,
            fcn: 'createCar',
            args: ['CAR11', 'Honda', 'Accord', 'Black', 'Tom'],
            chainId: options.channel_id,
            txId: tx_id
    };
    
  2. Salve el archivo y ejecute el comando utilizando node invokeNetwork.js. El resultado esperado es:

    ...
    Transacción enviada correctamente al ordenante.
    

    Esto ha creado un vehículo nuevo y su propietario «Tom», y los ha almacenado en el libro contable. Se puede ver el automóvil nuevo en el libro contable volviendo a ejecutar el comando queryNetwork.js. Ahora se puede experimentar creando automóviles nuevos, con nombres y propietarios diferentes, en el libro contable.

  3. Finalmente, puede experimentar con el chaincode changeOwner para cambiar el propietario de un vehículo. Para hacerlo, vuelva a cambiar la variable request de invokeNetwork.js para que se parezca a esto:

    var request = {
            targets: targets,
            chaincodeId: options.chaincode_id,
            fcn: 'changeCarOwner',
            args: ['CAR11', 'MGK'],
            chainId: options.channel_id,
            txId: tx_id
    };
    
  4. Ahora, salve el archivo y vuelva a ejecutar el comando utilizando node invokeNetwork.js. El resultado esperado es:

    ...
    Transacción enviada correctamente al ordenante.
    
  5. Se puede ver el propietario actualizado en el libro contable volviendo a ejecutar el comando queryNetwork.js. Se puede ver que el propietario ha cambiado de «Tom» a «MGK.»
  6. Si quiere hacer una consulta para un único automóvil en vez de para todos ellos, haga este cambio a la variable request del comando queryNetwork.js y vuelva a ejecutarlo:

    const request = {
            chaincodeId: options.chaincode_id,
            txId: transaction_id,
            fcn: 'queryCar',
            args: ['CAR11']
    };
    

    Ahora debería ver la información para un único automóvil:

    ...
    Cuenta de resultados de la consulta =  1
    La respuesta es  {"make":"Honda","model":"Accord","colour":"Black","owner":"MGK"}
    

Resumen

Ahora tiene una red que se ejecuta en IBM Blockchain Platform, con un chaincode de muestra en un canal de la red y una aplicación en ejecución con la que puede trabajar fácilmente. Ha rellenado el libro contable con datos de muestra y su aplicación ahora se puede comunicar con (consultar y actualizar) el blockchain de IBM Blockchain Platform. ¡Aproveche el proceso de blockchain!

Agradecimientos

Los autores agradecen a Anthony O’Dowd y a David Gorman del equipo IBM Blockchain Labs Global Engagement por su experta orientación y soporte durante el desarrollo de este tutorial.

Aviso

El contenido aquí presentado fue traducido de la página IBM Developer US. Puede revisar el contenido original en este link.