Biblioteca de interacción con cadena de bloques hyperledger fabric
Colección de funciones para interactuar con la cadena de bloques. Usa las librerías fabric-client o fabric-network (a elección).
Instalación
npm install --save cliente-blockchain-bo
Requerimientos
Se conecta a una cadena de bloques mediante un contrato inteligente instalado en la blockchain, el nombre del contrato inteligente (chaincode) y las credenciales para la interacción se encuentran en archivos de configuración y llaves.
- El chaincode se especifica en el archivo
config.yaml
. La ubicación de este archivo se especifica al inicializar esta biblioteca (ver ejemplos de inicialización). - Las credenciales de conexión se encuentran en los directorios
crypto-config
. La ubicación de estos directorios se especifica en el archivoconfig.yaml
. - Para conectarse se requieren credenciales de usuarios enrolados que se guardan en carpetas.
- En caso de usar fabric-network (recomendado) en una carpeta
wallet
- En caso de usar fabric-client (experimental) en una carpeta
hfc-key-store
- En caso de usar fabric-network (recomendado) en una carpeta
Inicialización
let blockchainClienteBo = ; // Inicializarconst bcCliente = await blockchainClienteBo;if bcClienteiniciado === false // caso erroneo // console.log(boCliente.errors); // ejemplo suponiendo que el archivo de configuracion config.yaml esta en el directorio actualbcCliente = await blockchainClienteBo;
Uso
Fabric Network
Usando la biblioteca de inserción/consulta recomendada.
Introducir datos
try let respuesta = await boClient; console; console; catch e console;
Consultar datos
try resp = await boClient; console; console; catch e console;
Fabric Client
Para escribir, la biblioteca selecciona al azar el peer al que envía la petición para escritura.
// escribirlet resultado;try // se indican parametros res = await boClient; if resultadofinalizado !== true // error catche // Error general // consultarlet consulta;try consulta = await bcCliente; // otras formas de consultar // La siguiente especifica un timeout de 5000 ms, 5 intentos como maximo, usa el chaincode 'n1' y la funcion 'fcn1' de ese chaincode // consulta = await bcCliente.consultarRegistro('<identificador>', 5000, 5, 'n1', 'fcn1'); if consultafinalizado !== true // caso erroneo // mostrar datos console; /* NOTA: consulta.resultado es la respuesta del chaincode y el tipo de respuesta esta definida por este. Si la respuesta fuese un buffer si es conveniente se puede convertir a cadena con: consulta.resultado.toString(); */ catche // .. caso erroeno.. // consultar detalles de una transaccion let detalles; try detalles = await bcCliente catch e // caso erroneo // Tambien existen los metodos que usan fabric-network: consultarRegistroFabricNetwork, escribirRegistroFabricNetwork, que hacen tareas similares *experimentales*.
Archivo de configuración
El <archivo de configuracion>
debe tener la estructura que se proporciona en el archivo config.sample.yaml
.
Estructura del archivo de configuración:
---name: nombre-de-la-redversion: 1.0.0user: Nombre de usuario enroladochannel: Nombre del canal# se recomiendan rutas absolutas walletPath: "<ruta del directorio wallet>" # si se usa fabric-network hfcKeyStorePath: "<ruta del directorio hfc-keysotre>" # si se usa fabric-client chaincode: name: Nombre del chaincode fcns: introducir: createDoc consultar: queryDoc fcn1: nombreOtraFuncion1 fcn2: nombreOtraFuncion2client: organization: Nombre de la Organizacion connection: timeout: peer: endorser: '300'organizations: Dominio: mspid: OrganizacionMSP peers: - peer0.dominio.gob.bo - peer1.dominio.gob.bo - peer2.dominio.gob.bo certificateAuthorities: - ca.gob.bopeers: peer0.dominio.gob.bo: url: grpcs://<ip-peer0>:<puerto> tlsCACerts: # recomendado usar rutas absolutas path: "/home/alguien/crypto-config/peerOrganizations/dominio.gob.bo/tlsca/tlsca.dominio.gob.bo-cert.pem" grpcOptions: ssl-target-name-override: peer0.dominio.gob.bo peer1.dominio.gob.bo: url: grpcs://<ip-peer1>:<puerto> tlsCACerts: # recomendado usar rutas absolutas path: "/home/alguien/crypto-config/peerOrganizations/dominio.gob.bo/tlsca/tlsca.dominio.gob.bo-cert.pem" grpcOptions: ssl-target-name-override: peer1.dominio.gob.bo peer2.dominio.gob.bo: url: grpcs://<ip-peer2>:<puerto> tlsCACerts: # recomendado usar rutas absolutas path: "/home/alguien/crypto-config/peerOrganizations/dominio.gob.bo/tlsca/tlsca.dominio.gob.bo-cert.pem" grpcOptions: ssl-target-name-override: peer2.dominio.gob.bocertificateAuthorities: ca.gob.bo: url: https://<ip-ca>:<puerto> caName: ca.gob.bo tlsCACerts: # recomendado usar rutas absolutas path: "/home/alguien/crypto-config/peerOrganizations/dominio.gob.bo/tlsca/tlsca.dominio.gob.bo-cert.pem" httpOptions: verify: false
Nota sobre resolución de dominios
En algunos casos es necesario hacer que el sistema resuelva la dirección IP de los peers por ejemplo si peer0.dominio.gob.bo
apunta a la ip: 192.168.1.100
, en Debian se puede asociar ips y dominios agregando en /etc/hosts
, por ejemplo:
192.168.1.100 peer0.dominio.gob.bo
192.168.1.102 peer1.dominio.gob.bo
192.168.1.104 peer2.dominio.gob.bo
192.168.1.103 ca.gob.bo
Ejemplos de uso básico
Primero se require instalar todas las dependencias y ajustar el archivo config.yaml
.
Fabric network (recomendado)
Script test-fabric-network.js
, se ejecuta con node test-fabric-network.js
.
const blockchainClienteBo = ; { const boClient = await blockchainClienteBo; console; let resp; // // escribir enviando un identificador const chaincodeName = 'chaincodeprueba'; let n = Math*99999999999; let hashDatos = '702996976c'; let ci = '900900900'; let nombres = 'Lucaz Monsar'; let primer_apellido = 'Tritón'; let segundo_apellido = 'Montes'; let descripcion = 'Registro-de-pruebas'; let extra = 'Algoritmo Hash Usado: sha256'; let tx_id; // // escribir datos console; console; try resp = await boClient; console; console; console; console; let respuesta = JSON; tx_id = respuestaTxId; // transaction_id console; console; console; console; console; console; catch e console; console; ;} ;
Fabric client
Script test-fabric-client.js
, se ejecuta con node test-fabric-client-js
.
const blockchainClienteBo = ; { const boClient = await blockchainClienteBo; let res; // escribir enviando un identificador console; let identificador = Math*1000000; // numero al azar // siempre un array, en este caso un array de un elemento. let datos = JSON; let tx_id; try res = await boClient; console; tx_id = resresultadotx_id; // transaction_id catch e console; console; try res = await boClient; console; catch e console; // escribir usando el transaction_id como identificador try console; datos = JSON; res = await boClient; console; tx_id = resresultadotx_id; catch e console; console; try res = await boClient; console; catch e console; console; try const util = ; res = await boClient; console; catch e console; process;} ;