Hyperledger Fabric Tutorial: Comprehensive Guide-Part 1

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

La siguiente serie de tutoriales de estructura Hyperledger consta de tres artículos que le enseñarán varios aspectos sobre el desarrollo de código de cadena de Hyperledger Fabric que van desde operaciones CRUD, protección de datos y pruebas de código de cadena.

Parte 1

Parte 2

Parte 3

Por Michiel Mulders

Una visión general de la serie:

Artículo 1: Desarrollo básico de códigos de cadena y almacenamiento de datos privados en colecciones

Artículo 2: Consultas avanzadas de código de cadena y la GUI de CouchDB

Artículo 3: Un tutorial para probar su código de cadena con MockStub

Requisitos

4 GB de RAM (se prefiere más)

Docker, Docker-Compose, editor de código (por ejemplo, código de Visual Studio), Git

NodeJS versión 8.9 + (Preferido es 8.9.4 - cambie su versión con un administrador de versiones como “n”)

Conocimiento básico de JavaScript

Objetivos

Cree funciones básicas de código de cadena como leer y agregar datos al libro mayor.

Validar la funcionalidad creada a través del comando Docker exec.

Configurar recopilaciones de datos privados.

Agregue datos a recopilaciones de datos privadas y recupere un objeto agregado del libro mayor.

Introducción: tutorial de estructura Hyperledger

En este primer artículo, nos acostumbraremos a la tabla repetitiva de Hyperledger Fabric para el código de cadena NodeJS que vamos a utilizar a lo largo de esta serie tutorial. La tabla repetitiva es desarrollada por una empresa de consultoría belga de blockchain llamada Theledger.be, muchas gracias por el abastecimiento abierto de este repetitivo.

¿Por qué usamos este repetitivo? ¡Te hace la vida más fácil! Por ejemplo, la repetición ajustará y serializará automáticamente la respuesta con shim.success () y shim.error (). Simplemente puede devolver el objeto javascript y hará el resto.

En este tutorial, nos centraremos en el desarrollo de operaciones CRUD básicas con y sin colecciones de datos privados, que probaremos después. Además, le daremos una breve introducción al funcionamiento de las colecciones privadas.

Obtener el código

El código se puede encontrar en Github michielmulders/hyperledger -fabric-blockgeeks. Se recomienda usar

git clon

para crear un clon local del repositorio en su máquina y echa un vistazo a la primera parte del tutorial con git checkout tutorial-1

Configuración de la placa de repetición

Ok, por lo que Hyperledger Fabric no arranca de la nada... Primero, tenemos que extraer las imágenes Docker requeridas que son necesarias para Fabric para crear los contenedores necesarios (Autoridad Certificada, Order, Peer, Membership Service).

La carpeta de scripts contiene un script llamado bootstrap.sh que por defecto extraerá la versión 1.2.0 de Hyperledger Fabric que admite la funcionalidad de colecciones privadas que usaremos más adelante. Asegúrese de tener suficiente espacio disponible en su disco y una conexión a Internet adecuada, ya que las imágenes son en total más de 1 GB de tamaño. Ejecute el script de esta manera. /scripts/bootstrap.sh

Cuando hayamos descargado todas las imágenes necesarias, podemos seguir probando nuestro repetitivo asegurándonos de que comience sin errores. Vamos a ejecutar el script StartFabric.sh con. /Scripts/startFabric.sh

Una finalización exitosa (una red de Hyperledger Fabric en ejecución) debería devolver un estado 200.

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

Consejo: Si no puede ejecutar el script Bash (.sh), intente darle derechos ejecutables con:

chmod + x bootstrap.sh

Acerca de las Colecciones Privadas

Hyperledger Fabric ha desarrollado este concepto de SideDBs que contienen datos privados, solo visibles para el nodo que posee el SideDB. Básicamente, se trata de información que no se ha compartido públicamente entre la red privada. Recientemente, Hyperledger ha cambiado la marca de esto como colecciones privadas que ven como una solución incorporada “compatible con el RGPD”.

Antes, la confidencialidad se creó en la red Hyperledger a través de los usos de los canales. El ejemplo más común es la negociación sobre un precio por kilo para un determinado pescado. Fisher A quiere ofrecer un precio especial al restaurante A porque son amigos cercanos, sin embargo, Fisher A no quiere que el restaurante B vea este trato más barato con el restaurante A. Para crear una comunicación segura, se crean dos canales desde Fisher A al restaurante A y desde Fisher A al restaurante B.

Sin embargo, el proceso de creación de canales puede llegar a ser bastante complejo en una situación fintech donde hablamos de miles de clientes, cada uno con múltiples canales. Esa es la razón por la que Hyperledger Fabric desaconseja el uso excesivo de canales, ya que esto ralentiza drásticamente la red, afectando el rendimiento.

Jonas Snellinckx de TheEdger explica cómo se pueden administrar mejor los datos privados dentro de la red Hyperledger.

“Los datos privados le permiten crear colecciones de datos utilizando políticas para definir qué partes en el canal pueden acceder a los datos. Este acceso se puede administrar simplemente agregando políticas a las colecciones. Esto permite que algunos datos sean públicos y otros sean privados para algunas partes.”

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

Imagen 1: Desde slidedeck “Libro de contabilidad activado por privacidad”

Para este tutorial, estamos definiendo coches que se almacenarán dentro de la red Fabric. Los datos sobre el propietario son privados, por lo que se agregarán a una colección privada. ¡Vamos a codificar!

Código de cadena de estructura de Hyperledger

Echemos un vistazo al código de cadena actual que puedes encontrar en Chaincode/node/src/mychaincode .ts. El archivo contiene una función, InitLedger se utiliza para rellenar previamente el libro mayor con algunos coches. Un objeto de coche consiste en marca, modelo, color y propietario. Al agregar los objetos de coche al libro mayor, les damos a todos una clave y doctype únicos para que sea más fácil recuperarlos.

para (let i = 0; i cars.length; i + +) {

const car: any = coches [i];

car.docType = 'coche';

//car.key = `CAR ${i} `;

esperar Stubhelper.putState ('CAR' + i, coche);

this.logger.info ('Agregado -', coche);

}

1. Crear nuevo coche

Vamos a codificar una función que crea un nuevo objeto de coche en el estado mundial de Hyperledger. La función acepta una matriz de cadenas, sin embargo, solo el primer elemento de la matriz contiene un objeto JSON stringificado. Usamos una función auxiliar para verificar fácilmente argumentos usando Yup. Además de verificar argumentos, también puede analizar sus argumentos de cadena a su formato de datos requerido. Yup analizará el objeto JSON stringified de acuerdo con el esquema proporcionado que definimos con yup.object () .shape ({my-object}.

async CreateCar (StubHelper: StubHelper, args: string []) {

const verifieDArgs = wait Helpers.CheckArgs any (args [0], yup.Object ()

.shape ({

clave: yup.string () .required (),

make: yup.string () .required (),

modelo: yup.string () .required (),

color: yup.string () .required (),

propietario: yup.string () .required (),

}));

- ¿Qué?

}

A continuación, podemos utilizar este objeto formateado (constante VerifieStargs) para construir un nuevo objeto de coche. No olvide agregar el doctype. El objeto está listo para anexarse al libro mayor. Vamos a utilizar el StubHelper que contiene toda la funcionalidad para interactuar con el estado del libro mayor como recuperar, agregar, actualizar y eliminar datos.

async CreateCar (StubHelper: StubHelper, args: string []) {

const verifieDArgs = wait Helpers.CheckArgs any (args [0], yup.Object ()

.shape ({

clave: yup.string () .required (),

make: yup.string () .required (),

modelo: yup.string () .required (),

color: yup.string () .required (),

propietario: yup.string () .required (),

}));

dejar coche = {

docType: 'coche',

make: verifiedargs.make,

modelo: Verifiedargs.model,

Color: Verifiedargs.Color.

propietario: VerifiedArgs.owner,

clave: verifiedargs.key,

};

esperar Stubhelper.putState (VerifiedArgs.key, coche);

}

La función PutState acepta una clave y un objeto que se almacenarán en el libro mayor. La función putState que usamos aquí es una función wrapper ya que el libro mayor solo puede almacenar matrices de bytes y no objetos JSON. El StubHelper hace la magia por nosotros, la implementación original se puede encontrar en ChainCodeSubInterface.putState.

1.1 Validar la adición de coche

Usaremos Docker para ejecutar un comando dentro del contenedor del par ya que el par contiene la última versión del código de cadena. Para dar al par esta versión actualizada, reiniciemos la red Hyperledger Fabric con. /Scripts/startFabric.sh. ¿Por qué usar este script? Se ejecuta más rápido, ya que solo reemplazará el código de cadena en los pares y no reiniciará toda la red.

Abra un terminal y ejecute el siguiente comando: docker exec cli peer chaincode invoke -C mychannel -n fabcar -c '{“function”: “createCar”, “Args”: [“{” key “:” CAR100", “make”: “Peugot”, “model”: "307", “color”: “green”, “owner”: “John Doe”} "]'

Este comando enviará una nueva propuesta de transacción al par para que se incluya en el estado mundial del libro mayor. Llamamos a nuestra función “CreateCar” y agregamos un objeto JSON stringificado con la clave "CAR100" como el primer parámetro en nuestra matriz de cadenas. Tenemos que escapar de las comillas dobles del objeto JSON para pasarlo a nuestro código de cadena.

Observe el uso de la palabra clave invoke. Es importante conocer la diferencia entre invocar y consultar. La palabra clave invoke se utiliza cuando tratamos de modificar o agregar datos al libro mayor, mientras que la palabra clave de consulta sólo se utiliza cuando se recupera información del libro mayor.

La ejecución correcta del comando Docker debería devolver un "result: status: 200".

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

2. Lectura de Datos del Libro Mayor

Para leer los datos del libro mayor, podemos buscar una clave específica. Vamos a buscar el objeto Car recién creado con la clave "CAR100". Empezamos de nuevo validando los argumentos que recibimos en nuestro código de cadena, esta vez aceptamos sólo una clave.

A continuación, utilizamos la función GetStateasObject para recuperar un objeto JSON del libro mayor para una clave especificada. Es posible que la clave no exista. En ese caso, podemos lanzar un error personalizado con NotFounderError que es parte de los utils fabric-chaincode-, importamos en la parte superior del archivo, como StubHelper.

asíncrono QueryCar (StubHelper: StubHelper, args: string []): Promise any {

const verifieDArgs = wait helpers.checkArgs {key: string} (args [0], yup.object ()

.shape ({

clave: yup.string () .required (),

}));

const car = esperar stubhelper.getStateAsObject (VerifiedArgs.key);

si (! coche) {

lanzar nuevo NotFounderError ('El coche no existe');

}

coche de retorno;

}

2.1 Función de consulta de validación del coche

Utilice el siguiente comando Docker para consultar el coche con la tecla "CAR100", observe el uso de la palabra clave query en este comando.

docker exec cli peer chaincode query -C mychannel -n fabcar -c '{“function”: “queryCar”, “Args”: [“{” key “:” CAR100"} "]}'

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

3 Colecciones Privadas

Para empezar, primero necesitamos un archivo de configuración de colecciones collections_config.json que incluya el nombre de la colección y la política. La política es similar a una aprobación, esto nos permite utilizar la lógica de política ya existente como operadores OR, AND,....

3.1 Configuración de colecciones privadas

Una colección privada consta de un nombre y una directiva, otras propiedades están fuera del alcance de este tutorial y están optimizadas para la red Hyperledger. Utilizamos una colección llamada “PrivateCarCollection” con una política en la que solo un miembro de una organización tiene que validar la transacción.

y nbsp

[...]

{{}

“name”: “PrivateCarCollection”,

“policy”: “OR ('Org1msp.Member', 'Org2msp.Member')”,

“RequiredPeerCount”: 0,

“MaxPeerCount”: 3,

“BlockToLive”: 1000000

}

]

3.2 Agregar datos a la colección privada

Ahora tenemos nuestra colección privada, usemos esto en nuestro código. No es un gran trabajo decirle a StubHelper que guarde los datos en una colección privada en lugar de difundirlos a través de la red.

esperar Stubhelper.putState (

VerifiedArgs.key,

coche,

{privateCollection: 'PrivateCarCollection'}

);

Vamos a modificar ligeramente nuestro código para guardar el propietario del coche y su dirección en la colección de coches privados. Recuerde agregar la misma clave a este nuevo objeto de coche privado para facilitar la recuperación del objeto completo. Además de eso, cambiaremos el validador de objetos Yup para aceptar solo una clave, dirección y propiedad del propietario. Como práctica recomendada, cambiamos el tipo de documento a “PrivateCar”.

async CreatePrivateCar (StubHelper: StubHelper, args: string []) {

const verifieDBArgs = esperar ayudantes.CheckArgs (args [0], yup.Object ()

.shape ({

clave: yup.string () .required (),

dirección: yup.string () .required (),

propietario: yup.string () .required (),

}));

dejar coche = {

docType: 'PrivateCar',

dirección: Verifiedargs.Address,

propietario: VerifiedArgs.owner,

clave: verifiedargs.key,

};

esperar Stubhelper.putState (

VerifiedArgs.key,

coche,

{privateCollection: 'PrivateCarCollection'}

);

}

3.3 Consulta Coches Agregados

Para crear el objeto de coche agregado, consultaremos tanto la red Hyperledger como la recopilación de datos privados que contiene nuestro propietario y dirección del vehículo.

Primero, vamos a recuperar el coche público con:

dejar que publicCar = espere StubHelper.getStateasObject (VerifiedArgs.key);

A continuación, podemos consultar los datos del coche privado de la misma manera:

dejar que PrivateCar = espere StubHelper.getStateAsObject (VerifiedArgs.key, {privateCollection: 'PrivateCarCollection'})

Por fin, vamos a devolver el objeto de coche agregado. Estamos utilizando el objeto spread (tres puntos “...”) que es un método ECMAScript 2018 que toma todas las propiedades de cada objeto y lo combina en un nuevo objeto.

asíncrono queryAggregatedCar (StubHelper: StubHelper, args: string []): Promise any {

const verifieDArgs = wait helpers.checkArgs {key: string} (args [0], yup.object ()

.shape ({

clave: yup.string () .required (),

}));

dejar que publicCar = espere StubHelper.getStateasObject (VerifiedArgs.key);

si (! Coche público) {

lanzar nuevo NotFounderError ('El coche no existe');

}

let PrivateCar = esperar StubHelper.getStateasObject (

VerifiedArgs.key,

{privateCollection: 'PrivateCarCollection'}

);

const coche = {

... público,

... PrivateCar

};

coche de retorno;

}

3.4 Validar consulta agregada

En la bala 1.1 de este tutorial, hemos creado un nuevo coche con la llave "CAR100". Vamos a utilizar esta clave para crear un nuevo objeto de datos privado a través del comando Docker exec.

docker exec cli peer chaincode invoke -C mychannel -n fabcar -c '{“function”: “createPrivateCar”, “Args”: ["{“key”: "CAR100", “address”: “Parklane 20, Italia”, “owner”: “John Doe”} "]}'

Ahora tenemos tanto el objeto público como privado del coche, probemos la llamada agregada como esta. Recuerde usar la palabra clave de consulta ya que solo estamos recuperando datos.

docker exec cli peer chaincode query -C mychannel -n fabcar -c '{“function”: “queryAggregatedCar”, “Args”: ["{“key”: “CAR100"}"]}'

Esto debería devolver:

{“color”: “green”, “docType”: “privateCar”, “key”: "CAR100", “make”: “Peugot”, “model”: "307", “owner”: “John Doe”, “address”: “Parklane 20, Italia”}

4. ¿Qué aprendimos?

StubHelper es la herramienta más importante para interactuar con los datos del libro mayor. Es capaz de agregar, actualizar y eliminar datos. Pero, también puede ayudar a localizar y consultar objetos en el libro mayor y devolverlos como objetos JSON.

Código Cheatsheet

Hyperledger Fabric Tutorial: How to test your NodeJS chaincode using Mockstub- Part 1

¿Quieres sumergirte más en el hiperlibro? Echa un vistazo a nuestro Acelerador Hyperledger

Continúe también hacia la segunda parte aquí:

Lecturas adicionales

Aquí puede encontrar la implementación completa de la interfaz ChainCodeSubInterface que se codifica con Golang como Hyperledger se crea con este nuevo lenguaje.

API completa StubHelper.

Colección de recursos relacionados con Hyperledger Fabric en Github.

Por Michiel Mulders

@michiel_mulders

La siguiente serie de tutoriales de estructura Hyperledger consta de tres artículos que le enseñarán varios aspectos sobre el desarrollo de código de cadena de Hyperledger Fabric que van desde operaciones CRUD, protección de datos y pruebas de código de cadena. Por Michiel Mulders Una visión general de la serie: Artículo 1: Desarrollo básico de código de cadena y almacenamiento de datos privados en colecciones Artículo 2: Consultas de código de cadena avanzadas y el CouchDB GUI Artículo 3: Un tutorial para probar su código de cadena con MocksTube Requisitos 4GB de RAM (se prefiere más) Docker, Docker- Compose, editor de código (por ejemplo, Visual Studio Code), Git NodeJS versión 8.9 + (Preferido es 8.9.4 - cambie su versión con un administrador de versiones como “n”) Objetivos básicos de conocimiento de JavaScript Crear funciones básicas de código de cadena como leer y agregar datos al libro mayor. Validar la funcionalidad creada a través del comando Docker exec. Configurar recopilaciones de datos privados. Agregue datos a recopilaciones de datos privadas y recupere un objeto agregado del libro mayor. Introducción: tutorial de tejido Hyperledger En este primer artículo, nos acostumbraremos a la tabla repetitiva de Hyperledger Fabric para el código de cadena NodeJS que vamos a utilizar a lo largo de esta serie de tutoriales. La tabla repetitiva es desarrollada por una empresa de consultoría belga de blockchain llamada Theledger.be, muchas gracias por el abastecimiento abierto de este repetitivo. ¿Por qué usamos este repetitivo? ¡Te hace la vida más fácil! Por ejemplo, la repetición ajustará y serializará automáticamente la respuesta con shim.success () y shim.error (). Simplemente puede devolver el objeto javascript y hará el resto. En este tutorial, nos centraremos en el desarrollo de operaciones CRUD básicas con y sin colecciones de datos privados, que probaremos después. Además, le daremos una breve introducción al funcionamiento de las colecciones privadas. Obtener el código El código se puede encontrar en Github michielmulders/hyperledger -fabric-blockgeeks. Se recomienda usar git clone para crear un clon local del repositorio en su máquina y ver la primera parte del tutorial con git checkout tutorial-1 Boilerplate Setup Ok, por lo que Hyperledger Fabric no arranca de la nada... Primero, tenemos que extraer las imágenes Docker requeridas que son necesarias para Estructura para crear los contenedores necesarios (Autoridad de certificación, Orderer, Peer, Membership Service). La carpeta de scripts contiene un script llamado bootstrap.sh que por defecto extraerá la versión 1.2.0 de Hyperledger Fabric que admite la funcionalidad de colecciones privadas que usaremos más adelante. Asegúrese de tener suficiente espacio disponible en su disco y una conexión a Internet adecuada, ya que las imágenes son en total más de 1 GB de tamaño. Ejecute el script de esta manera. /scripts/bootstrap.sh Cuando hayamos descargado todas las imágenes necesarias, podemos seguir probando nuestro repetitivo asegurándonos de que comience sin errores. Vamos a ejecutar el script StartFabric.sh con. /Scripts/startFabric.sh Una finalización exitosa, una red de Hyperledger Fabric en ejecución, debería devolver un estado 200. Consejo: Si no puede ejecutar el script Bash (.sh), intente darle derechos ejecutables con: chmod + x bootstrap.sh Acerca de las Colecciones Privadas Hyperledger Fabric ha desarrollado este concepto de SideDBs que contienen datos privados, solo visibles para el nodo que posee el SideDB. Básicamente, se trata de información que no se ha compartido públicamente entre la red privada. Recientemente, Hyperledger ha cambiado la marca de esto como colecciones privadas que ven como una solución incorporada “compatible con el RGPD”. Antes, la confidencialidad se creó en la red Hyperledger a través de los usos de los canales. El ejemplo más común es la negociación sobre un precio por kilo para un determinado pescado. Fisher A quiere ofrecer un precio especial al Restaurante A porque son amigos cercanos, sin embargo, Fisher A no quiere que el Restaurante B vea este trato más barato con el Restaurante A. Para crear una comunicación segura, se crean dos canales desde Fisher A al Restaurante A y desde Fisher A al Restaurante B. Sin embargo, Fisher A , el proceso de creación de canales puede llegar a ser bastante complejo en una situación fintech donde hablamos de miles de clientes, cada uno con múltiples canales. Esa es la razón por la que Hyperledger Fabric desalienta la excesiva uso de canales, ya que esto ralentiza drásticamente la red, afectando el rendimiento. Jonas Snellinckx de TheEdger explica cómo los datos privados se pueden administrar mejor dentro de la red Hyperledger, “Los datos privados le permiten crear colecciones de datos utilizando políticas para definir qué partes en el canal pueden acceder a los datos. Este acceso se puede administrar simplemente agregando políticas a las colecciones. Esto permite que algunos datos sean públicos y otros sean privados para algunas partes.” Imagen 1: Desde slidedeck “Privacy Enabled Ledger” Para este tutorial, estamos definiendo coches que se almacenarán dentro de la red Fabric. Los datos sobre el propietario son privados, por lo que se agregarán a una colección privada. ¡Vamos a codificar! Hyperledger Fabric Chaincode Echemos un vistazo al código de cadena actual que puedes encontrar en ChainCode/node/SRC/MyChainCode .ts. El archivo contiene una función, InitLedger se utiliza para rellenar previamente el libro mayor con algunos coches. Un objeto de coche consiste en marca, modelo, color y propietario. Al agregar los objetos de coche al libro mayor, les damos a todos una clave única y doctype para que sea más fácil recuperarlos. for (let i = 0; i cars.length; i + +) {const car: any = cars [i]; car.docType = 'car'; //car.key = `CAR ${i} `; wait stubhelper.putState ('CAR' + i, car); this.log.info ('Agregado —', coche);} 1. Crear nuevo coche Vamos a codificar una función que crea un nuevo objeto de coche en el estado mundial de Hyperledger. La función acepta una matriz de cadenas, sin embargo, solo el primer elemento de la matriz contiene un objeto JSON stringificado. Usamos una función auxiliar para verificar fácilmente argumentos usando Yup. Además de verificar argumentos, también puede analizar sus argumentos de cadena a su formato de datos requerido. Yup analizará el objeto JSON stringified de acuerdo con el esquema proporcionado que definimos con yup.object () .shape ({my-object}. async CreateCar (stubHelper: stubHelper, args: string []) {const verifieDArgs = await helpers.checkArgs (args [0], yup.object () .shape ({key: yup.string () .required (), make: make: make: make: up.string (). required (), modelo: yup.string () .required (), color: yup.string () .required (), propietario: yup.string () .required (),});...} A continuación, podemos utilizar este objeto formateado (constante VerifieStargs) para construir un nuevo objeto de coche. No olvide agregar el doctype. El objeto está listo para anexarse al libro mayor. Vamos a utilizar el StubHelper que contiene toda la funcionalidad para interactuar con el estado del libro mayor como recuperar, agregar, actualizar y eliminar datos. async CreateCar (StubHelper: StubHelper, args: string []) {const verifieStargs = await helpers.CheckArgs (args [0], yup.Object () .shape ({key: yup.string () .required (), make: yup.string () .required (), modelo: yup.string () .required (), color: yup.string () .required (), propietario: yup.string () .required (),}); let car = {docType: 'car', make: verifieDargs.make, modelo: verifieDargs.Model, color: verifiedArgs.Color, propietario: verifieds.owner, key: VerifiedArgs.key,}; esperar Stubhelper.putState (VerifiedArgs.key, car);} La función putState acepta una clave y un objeto que se almacenarán en el libro mayor. La función putState que usamos aquí es una función wrapper ya que el libro mayor solo puede almacenar matrices de bytes y no objetos JSON. El StubHelper hace la magia por nosotros, la implementación original se puede encontrar en ChainCodeSubInterface.putState. 1.1 Validate Addition Of Car Usaremos Docker para ejecutar un comando dentro del contenedor del peer ya que el peer tiene la última versión del chaincode. Para dar al par esta versión actualizada, reiniciemos la red Hyperledger Fabric con. /Scripts/startFabric.sh. ¿Por qué usar este script? Se ejecuta más rápido, ya que solo reemplazará el código de cadena en los pares y no reiniciará toda la red. Abra un terminal y ejecute el siguiente comando: docker exec cli peer chaincode invoke -C mychannel -n fabcar -c '{“function”: “createCar”, “Args”: [“{” key “:” CAR100", “make”: “Peugot”, “model”: "307", “color”: “green”, “owner”: “John Doe”} "]}' Este comando enviar una nueva propuesta de transacción a el par que se incluirá en el estado mundial del libro mayor. Llamamos a nuestra función “CreateCar” y agregamos un objeto JSON stringificado con la clave "CAR100" como el primer parámetro en nuestra matriz de cadenas. Tenemos que hacerlo. escapar de las comillas dobles del objeto JSON para pasarlo a nuestro código de cadena. Observe el uso de la palabra clave invoke. Es importante conocer la diferencia entre invocar y consultar. La palabra clave invoke se utiliza cuando tratamos de modificar o agregar datos al libro mayor, mientras que la palabra clave de consulta sólo se utiliza cuando se recupera información del libro mayor. La ejecución correcta del comando Docker debería devolver un "result: status: 200". 2. Leer Datos del Libro Mayor Para leer los datos del libro mayor, podemos buscar una clave específica. Vamos a buscar el objeto Car recién creado con la clave "CAR100". Empezamos de nuevo validando los argumentos que recibimos en nuestro código de cadena, esta vez aceptamos sólo una clave. A continuación, utilizamos la función GetStateasObject para recuperar un objeto JSON del libro mayor para una clave especificada. Es posible que la clave no exista. En ese caso, podemos lanzar un error personalizado con NotFounderError que es parte de fabric-chaincode-utils, importamos en la parte superior del archivo, como StubHelper. async QueryCar (stubHelper: stubHelper, args: string []): Promise {const verifieDArgs = await helpers.checkArgs {key: string} (args [0], yup.object (). shape ({key: yup.string () .required (),})); const car = wait stubhelper.getStateAsObject (VerifiedArgs.key); if (! car) {throw new notFounderError ('Car not exist');} return car;} 2.1 Validation Query Car Function Use el siguiente comando Docker para consultar el coche con la tecla "CAR100", observe el uso de la palabra clave query en este comando. docker exec cli peer chaincode query -C mychannel -n fabcar -c '{“function”: "queryCar “,” Args “: [” {“key”: "CAR100"}"]} '3 Colecciones privadas Para empezar, primero necesitamos un archivo de configuración de colecciones collections_config.json que incluya el nombre de la colección y la política. La política es similar a una aprobación, esto nos permite utilizar la lógica de política ya existente como operadores OR, AND,... 3.1 Private Collection Configuration Una colección privada consta de un nombre y una política, otras propiedades están fuera del alcance de este tutorial y están optimizadas para la red Hyperledger. Utilizamos una colección llamada “PrivateCarCollection” con una política en la que solo un miembro de una organización tiene que validar la transacción. y nbsp [{“name”: “privateCarCollection”, “policy”: “OR ('org1msp.Member', 'org2msp.Member')”, “requiredPeerCount”: 0, “maxPeerCount”: 3, “BlockToLive”: 1000000}] Data to Private Collection Ahora tenemos nuestra colección privada, usemos esto en nuestro código. No es un gran trabajo decirle a StubHelper que guarde los datos en una colección privada en lugar de difundirlos a través de la red. wait stubhelper.putState (VerifiedArgs.key, car, {privateCollection: 'privateCollection'}); Vamos a modificar nuestro código ligeramente para simplemente almacenar el propietario del automóvil y su dirección en el colección de coches. Recuerde agregar la misma clave a este nuevo objeto de coche privado para facilitar la recuperación del objeto completo. Además de eso, cambiaremos el validador de objetos Yup para aceptar solo una clave, dirección y propiedad del propietario. Como práctica recomendada, cambiamos el doctype a “privateCar”. async createPrivateCar (stubHelper: stubHelper, args: string []) {const verifieDArgs = await helpers.checkArgs (args [0], yup.object () .shape ({key: yup.string () .required (), dirección: yup.string () .required (), owner: yup.string () .required (),}); let car = { DocType: 'PrivateCar', dirección: VerifiedArgs.Address, propietario: VerifieDargs.owner, key: VerifiedArgs.key,}; wait stubhelper.putState (VerifiedArgs.key, car, {privateCollection: 'privateCollection'});} 3.3 Consulta de carro agregado Para crear el objeto de coche agregado, consultaremos tanto la red Hyperledger como la recopilación de datos privados que contiene nuestro propietario y dirección del vehículo. Primero, vamos a recuperar el coche público con: let PublicCar = wait stubhelper.getStateAsObject (VerifiedArgs.key); A continuación, podemos consultar los datos del coche privado de la misma manera: let PrivateCar = wait stubhelper.getStateasObject (VerifiedArgs.key, {privateCollection: 'privateCarCollection'}) Por fin, vamos a devolver el objeto de coche agregado. Estamos usando el spread de objetos (tres puntos “...”) que es un método ECMAScript 2018 que toma todas las propiedades de cada objeto y lo fusiona en un nuevo objeto. async QueryAggregatedCar (StubHelper: StubHelper, args: string []): Promise {const verifieDArgs = wait helpers.CheckArgs {key: string} (args [0], yup.object () .shape ({key: yup.string () .required (),}),})))))))))))); let PublicCar = wait StubHelper.getStateAsObject (VerifiedArgs.key); if (! PublicCar) {throw new notFounderError ('El coche no existe');} let privateCar = wait stubhelper.getStateasObject (VerifiedArgs.key, {privateCollection: 'privateCollection'}); const car = {... publicCar,... privateCar}; return car;} 3.4 Validar la consulta agregada En la viñeta 1.1 de este tutorial, creamos un coche nuevo con llave "CAR100". Usemos esta clave para crear un nuevo objeto de datos privados a través del comando Docker exec. docker exec cli peer chaincode invoke -C mychannel -n fabcar -c '{“function”: “createPrivateCar”, “Args”: ["{“key”: "CAR100", “address”: “Parklane 20, Italia”, “owner”: “John Doe”} "]' Ahora tanto el público como objeto de coche privado, probemos la llamada agregada como esta. Recuerde usar la palabra clave de consulta ya que solo estamos recuperando datos. docker exec cli peer chaincode query -C mychannel -n fabcar -c '{“function”: “queryAggregatedCar”, “Args”: ["{“key”: “CAR100"} “]}' Esto debería devolver: {” color “:” green “,” docType “:” privateCar “,” key “:”: “:”: “:”: "100", “make”: “Peugot”, “model”: "307"," propietario “:” John Doe “,” dirección “:” Parklane 20, Italia "} 4. ¿Qué aprendimos? StubHelper es la herramienta más importante para interactuar con los datos del libro mayor. Es capaz de agregar, actualizar y eliminar datos. Pero, también puede ayudar a localizar y consultar objetos en el libro mayor y devolverlos como objetos JSON. Código Cheatsheet ¿Quieres profundizar en el hiperlibro? Echa un vistazo a nuestro Acelerador de Hyperledger Más lecturas Aquí puede encontrar la implementación de la interfaz completa de la ChainCodeSubInterface que se codifica con Golang como Hyperledger se crea con este nuevo idioma. API completa StubHelper. Colección de recursos relacionados con Hyperledger Fabric en Github. Por Michiel Mulders @michiel_mulders

Like what you read? Give us one like or share it to your friends and get +16

268
Hungry for knowledge?
New guides and courses each week
Looking to invest?
Market data, analysis, and reports
Just curious?
A community of blockchain experts to help

Get started today

Already have an account? Sign In