Blockchain: ¿qué debemos construir PoC?

¡Los ojos tienen miedo y las manos pican!

En artículos anteriores, descubrimos las tecnologías en las que se construyen las cadenas de bloques ( ¿Para qué debemos construir una cadena de bloques? ) Y los casos que se pueden implementar con su ayuda ( ¿Qué debemos construir un caso? ). ¡Es hora de trabajar con tus manos! Para la implementación de pilotos y PoC (Prueba de concepto), prefiero usar nubes, porque se puede acceder a ellos desde cualquier parte del mundo y, a menudo, no tiene que perder tiempo en la instalación tediosa del entorno, porque Hay configuraciones predefinidas. Entonces, hagamos algo simple, por ejemplo, una red para transferir monedas entre los participantes y llamarlo modestamente Citcoin. Para esto, utilizaremos la nube de IBM y la tela universal blockled Hyperledger Fabric. Primero, veamos por qué Hyperledger Fabric se llama blockchain universal.

imagen

Tela Hyperledger: una cadena de bloques universal


En términos generales, el sistema de información universal es:

  • Un conjunto de servidores y un núcleo de software que realiza la lógica empresarial;
  • Interfaces para interactuar con el sistema;
  • Medios para el registro, autenticación y autorización de dispositivos / personas;
  • Base de datos que almacena datos operativos y de archivo:

imagen

La versión oficial de qué es Hyperledger Fabric se puede leer en el sitio y, en resumen, Hyperledger Fabric es una plataforma de código abierto que le permite construir cadenas de bloques cerradas y ejecutar contratos inteligentes arbitrarios escritos en los lenguajes de programación JS y Go. Echemos un vistazo a la arquitectura de Hyperledger Fabric en detalle y asegurémonos de que sea un sistema universal que solo tenga los detalles específicos de almacenamiento y registro de datos. La especificidad es que los datos, como en todas las cadenas de bloques, se almacenan en bloques que se colocan en la cadena de bloques solo si los participantes llegaron a un consenso y después de registrar los datos no se pueden corregir o eliminar discretamente.

Arquitectura de tela Hyperledger


El diagrama muestra la arquitectura de la tela Hyperledger:

imagen

Organizaciones : las organizaciones contienen pares, es decir blockchain existe debido al apoyo de las organizaciones. Diferentes organizaciones pueden ser miembros del mismo canal.

Canal : una estructura lógica que une a los pares en grupos, es decir Blockchain está configurado. Hyperledger Fabric puede procesar simultáneamente varias cadenas de bloques con diferentes lógicas comerciales.

El Proveedor de servicios de membresía (MSP) es una CA (Autoridad de certificación) para emitir identidades y asignar roles. Para crear un nodo, debe interactuar con MSP.

Nodos pares : verifique las transacciones, almacene la cadena de bloques, ejecute contratos inteligentes e interactúe con las aplicaciones. Los pares tienen una identidad (certificado digital) que emite un MSP. A diferencia de la red Bitcoin o Etherium, donde todos los nodos son iguales, en los nodos Hyperledger Fabric juegan diferentes roles:

  • Peer puede respaldar a peer (EP) y ejecutar contratos inteligentes.
  • Compitiendo entre pares (CP): solo guarde datos en la cadena de bloques y actualice el "Estado mundial".
  • Anchor Peer (AP): si varias organizaciones participan en la cadena de bloques, entonces los pares de anclaje se utilizan para comunicarse entre ellas. Cada organización debe tener uno o más pares de anclaje. Con la ayuda de AP, cualquier par en la organización puede obtener información sobre todos los pares en otras organizaciones. El protocolo de chismes se utiliza para sincronizar información entre AP.
  • Líder : si la organización tiene varios pares, solo el líder recibirá bloques del servicio de pedidos y se los dará a los otros pares. Un líder puede ser establecido estáticamente o seleccionado dinámicamente por sus pares en una organización. El protocolo de chismes también se utiliza para sincronizar la información del líder.

Los activos son entidades de valor que se almacenan en la cadena de bloques. Más específicamente, se trata de datos de valor clave en formato JSON. Son estos datos los que se registran en Blockchain. Tienen una historia que se almacena en la cadena de bloques y el estado actual, que se almacena en la base de datos del estado mundial. Las estructuras de datos se llenan aleatoriamente según las tareas comerciales. No hay campos obligatorios, la única recomendación es que los activos deben tener un propietario y ser valiosos.

Libro mayor : consiste en el blockchain "Blockchain" y la base de datos "Word state", que almacena el estado actual de los activos. El estado mundial usa LevelDB o CouchDB.

Contrato inteligente : mediante contratos inteligentes, se implementa la lógica de negocios del sistema. En Hyperledger Fabric, los contratos inteligentes se denominan chaincode. Con la ayuda de chaincode, se definen activos y transacciones sobre ellos. Hablando en lenguaje técnico, los contratos inteligentes son módulos de software implementados en los lenguajes de programación JS o Go.

Política de respaldo : para cada chaincode, puede especificar cuántas políticas y de quién desea esperar confirmaciones para la transacción. Si no se establece la política, se usa por defecto: "la transacción debe ser confirmada por cualquier miembro de cualquier organización en el canal". Ejemplos de políticas:

  • Cualquier administrador de la organización debe confirmar la transacción;
  • Cualquier miembro o cliente de la organización debe confirmar;
  • Debe confirmar cualquier organización de pares.

Servicio de pedidos : empaqueta las transacciones en bloques y envía pares al canal. Garantiza la entrega de mensajes a todos los pares en la red. Para sistemas industriales, el agente de mensajes Kafka se utiliza para desarrollar y probar Solo .

Flujo de llamadas


imagen

  • La aplicación interactúa con Hyperledger Fabric utilizando Go, Node.js o Java SDK;
  • El cliente crea una transacción de tx y la envía a sus pares;
  • Peer verifica la firma del cliente, completa la transacción y envía la firma de respaldo al cliente. Chaincode se ejecuta solo en el par que lo respalda, y el resultado de su ejecución se envía a todos los pares. Este algoritmo de trabajo se llama consenso de PBFT (Practical Byzantine Fault Tolerant). Se diferencia del BFT clásico en que el mensaje se envía y no se espera la confirmación de todos los participantes, sino solo de un conjunto específico;
  • Después de que el cliente ha recibido el número de respuestas correspondientes a la política de aprobación, envía la transacción al servicio de pedidos;
  • El servicio de pedidos forma un bloque y lo envía a todos los pares comprometidos. El servicio de pedidos proporciona una escritura secuencial de bloques, que excluye la denominada bifurcación de libro mayor ( consulte la sección "Bifurcaciones" );
  • Los pares reciben un bloque, verifican la política de respaldo nuevamente, escriben el bloque en la cadena de bloques y cambian el estado en el DB "Estado mundial".

Es decir Resulta la separación de roles entre nodos. Esto proporciona escalabilidad y seguridad de blockchain:

  • Los contratos inteligentes (chaincode) realizan la aprobación de sus pares. Esto garantiza la confidencialidad de los contratos inteligentes, como no es almacenado por todos los participantes, sino solo en sus compañeros de apoyo.
  • Ordenar debería funcionar rápido. Esto está garantizado por el hecho de que Ordenar solo forma un bloque y lo envía a un grupo fijo de pares líderes.
  • Los pares comprometidos solo almacenan la cadena de bloques: puede haber muchos de ellos y no requieren mucha potencia y trabajo instantáneo.

Para obtener más información sobre las soluciones arquitectónicas de Hyperledger Fabric y por qué funciona de esta manera, consulte aquí: Orígenes de la arquitectura o aquí: Hyperledger Fabric: un sistema operativo distribuido para blockchains autorizados .

Entonces, Hyperledger Fabric es un sistema verdaderamente universal con el que puede:

  • Implemente lógica comercial arbitraria utilizando el mecanismo de contrato inteligente;
  • Escriba y reciba datos de una base de datos blockchain en formato JSON;
  • Proporcione y verifique el acceso a la API utilizando la Autoridad de certificación.

Ahora que hemos descubierto los detalles de la tela Hyperledger, ¡finalmente hagamos algo útil!

Expandir Blockchain


Declaración del problema.


La tarea es implementar la red Citcoin con las siguientes funciones: crear una cuenta, obtener un saldo, reponer la cuenta, transferir monedas de una cuenta a otra. Dibujemos un modelo de objeto, que implementaremos más adelante en un contrato inteligente. Por lo tanto, tendremos cuentas que se identifican por nombres y que contienen un saldo y una lista de cuentas. Las cuentas y una lista de cuentas están en términos de activos de Hyperledger Fabric. En consecuencia, tienen una historia y un estado actual. Intentaré dibujarlo claramente:

imagen

Las cifras superiores son el estado actual, que se almacena en la base de datos del Estado mundial. Debajo de ellos hay figuras que muestran la historia que se almacena en la cadena de bloques. El estado actual de los activos se modifica por las transacciones. El activo solo cambia en su totalidad, por lo tanto, como resultado de la transacción, se crea un nuevo objeto y el valor actual del activo pasa al historial.

IBM Cloud


Creamos una cuenta en la nube de IBM . Para usar la plataforma blockchain, debe actualizarla a Pay-As-You-Go. Este proceso puede no ser rápido, porque IBM solicita información adicional y la verifica manualmente. De lo positivo, puedo decir que IBM tiene buenos materiales de capacitación que le permiten implementar Hyperledger Fabric en su nube. Me gustaron las siguientes series de artículos y ejemplos:


Las siguientes son capturas de pantalla de la plataforma IBM Blockchain. Esta no es una instrucción para crear una cadena de bloques, sino simplemente una demostración del alcance de la tarea. Entonces, para nuestros propósitos, hacemos una Organización:

imagen

En él creamos nodos: Orderer CA, Org1 CA, Orderer Peer:

imagen

Comenzamos usuarios:

imagen

Crea un canal y llámalo citcoin:

imagen

En esencia, Channel es una cadena de bloques, por lo que comienza con un bloque cero (bloque Genesis):

imagen

Escribir un contrato inteligente


/* * Citcoin smart-contract v1.5 for Hyperledger Fabric * (c) Alexey Sushkov, 2019 */ 'use strict'; const { Contract } = require('fabric-contract-api'); const maxAccounts = 5; class CitcoinEvents extends Contract { async instantiate(ctx) { console.info('instantiate'); let emptyList = []; await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(emptyList))); } // Get all accounts async GetAccounts(ctx) { // Get account list: let accounts = '{}' let accountsData = await ctx.stub.getState('accounts'); if (accountsData) { accounts = JSON.parse(accountsData.toString()); } else { throw new Error('accounts not found'); } return accountsData.toString() } // add a account object to the blockchain state identifited by their name async AddAccount(ctx, name, balance) { // this is account data: let account = { name: name, balance: Number(balance), type: 'account', }; // create account: await ctx.stub.putState(name, Buffer.from(JSON.stringify(account))); // Add account to list: let accountsData = await ctx.stub.getState('accounts'); if (accountsData) { let accounts = JSON.parse(accountsData.toString()); if (accounts.length < maxAccounts) { accounts.push(name); await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(accounts))); } else { throw new Error('Max accounts number reached'); } } else { throw new Error('accounts not found'); } // return object return JSON.stringify(account); } // Sends money from Account to Account async SendFrom(ctx, fromAccount, toAccount, value) { // get Account from let fromData = await ctx.stub.getState(fromAccount); let from; if (fromData) { from = JSON.parse(fromData.toString()); if (from.type !== 'account') { throw new Error('wrong from type'); } } else { throw new Error('Accout from not found'); } // get Account to let toData = await ctx.stub.getState(toAccount); let to; if (toData) { to = JSON.parse(toData.toString()); if (to.type !== 'account') { throw new Error('wrong to type'); } } else { throw new Error('Accout to not found'); } // update the balances if ((from.balance - Number(value)) >= 0 ) { from.balance -= Number(value); to.balance += Number(value); } else { throw new Error('From Account: not enought balance'); } await ctx.stub.putState(from.name, Buffer.from(JSON.stringify(from))); await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to))); // define and set Event let Event = { type: "SendFrom", from: from.name, to: to.name, balanceFrom: from.balance, balanceTo: to.balance, value: value }; await ctx.stub.setEvent('SendFrom', Buffer.from(JSON.stringify(Event))); // return to object return JSON.stringify(from); } // get the state from key async GetState(ctx, key) { let data = await ctx.stub.getState(key); let jsonData = JSON.parse(data.toString()); return JSON.stringify(jsonData); } // GetBalance async GetBalance(ctx, accountName) { let data = await ctx.stub.getState(accountName); let jsonData = JSON.parse(data.toString()); return JSON.stringify(jsonData); } // Refill own balance async RefillBalance(ctx, toAccount, value) { // get Account to let toData = await ctx.stub.getState(toAccount); let to; if (toData) { to = JSON.parse(toData.toString()); if (to.type !== 'account') { throw new Error('wrong to type'); } } else { throw new Error('Accout to not found'); } // update the balance to.balance += Number(value); await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to))); // define and set Event let Event = { type: "RefillBalance", to: to.name, balanceTo: to.balance, value: value }; await ctx.stub.setEvent('RefillBalance', Buffer.from(JSON.stringify(Event))); // return to object return JSON.stringify(from); } } module.exports = CitcoinEvents; 

Intuitivamente, todo debe quedar claro aquí:

  • Hay varias funciones (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) que el programa de demostración llamará utilizando la API de Hyperledger Fabric.
  • Las funciones SendFrom y RefillBalance generan eventos (Evento) que recibirá el programa de demostración.
  • Función instanciar: se llama una vez durante la creación de instancias de un contrato inteligente. De hecho, se llama no una vez, sino cada vez que se cambia una versión de un contrato inteligente. Por lo tanto, inicializar la lista con una matriz vacía es una mala idea, porque Ahora, al cambiar la versión de un contrato inteligente, perderemos la lista actual. Pero nada, solo estoy aprendiendo).
  • Las cuentas y una lista de cuentas (cuentas) son estructuras de datos JSON. Para la manipulación de datos, se utiliza JS.
  • Puede obtener el valor actual de un activo llamando a la función getState y actualizarlo usando putState.
  • Al crear una cuenta, se llama a la función AddAccount, en la que se realiza una comparación para el número máximo de cuentas en la cadena de bloques (maxAccounts = 5). Y hay una jamba (¿notado?), Que conduce a un aumento infinito en el número de cuentas. Tales errores deben ser evitados)

A continuación, suba el contrato inteligente a Channel e instálelo:

imagen

Observamos la transacción para instalar Smart Contract:

imagen

Vemos los detalles sobre nuestro canal:

imagen

Como resultado, obtenemos el siguiente diagrama de red blockchain en la nube de IBM. También hay un programa de demostración que se ejecuta en la nube de Amazon en un servidor virtual (consulte la siguiente sección para más detalles):

imagen

Crear una GUI para llamadas de API de Hyperledger Fabric


Hyperledger Fabric tiene una API que se puede usar para:

  • Canal de creaciones;
  • Conexiones entre pares al canal;
  • Instalación e instanciación de contratos inteligentes en el canal;
  • Llamada de transacción;
  • Solicitar información sobre la cadena de bloques.

Desarrollo de aplicaciones


En nuestro programa de demostración, usaremos la API solo para invocar transacciones y solicitar información, porque Ya hemos tomado los pasos restantes con la plataforma de blockchain de IBM. Escribimos una GUI usando una pila de tecnología estándar: Express.js + Vue.js + Node.js. Puede escribir un artículo separado sobre cómo comenzar a crear aplicaciones web modernas. Aquí dejaré un enlace a la serie de conferencias que más me gustó: la aplicación web Full Stack usando Vue.js y Express.js . El resultado es una aplicación cliente-servidor con una interfaz gráfica familiar al estilo de Material Design de Google. La API REST entre el cliente y el servidor consta de varias llamadas:

  • HyperledgerDemo / v1 / init: inicializa la cadena de bloques;
  • HyperledgerDemo / v1 / accounts / list: obtenga una lista de todas las cuentas
  • HyperledgerDemo / v1 / account? Name = Bob & balance = 100 - crea una cuenta Bob;
  • HyperledgerDemo / v1 / info? Account = Bob: obtenga información sobre la cuenta de Bob;
  • HyperledgerDemo / v1 / transacción? De = Bob & to = Alice & volume = 2 - transfiere dos monedas de Bob a Alice;
  • HyperledgerDemo / v1 / disconnect: cierra la conexión a la cadena de bloques.

Puse la descripción de la API con ejemplos en el sitio web de Postman , un programa conocido para probar la API HTTP.

Aplicación de demostración de Amazon Cloud


La aplicación se cargó en Amazon, porque Hasta el momento, IBM no ha podido actualizar mi cuenta y permitir la creación de servidores virtuales. Cómo la cereza adjuntó el dominio: www.citcoin.info . Mantendré el servidor encendido por un momento, luego lo apagaré, porque los centavos de alquiler están goteando, y las monedas de citcoin aún no se cotizan en el intercambio). Puse capturas de pantalla de la demostración en el artículo para que la lógica del trabajo sea clara. La aplicación de demostración puede:

  • Inicializa la cadena de bloques;
  • Crear una cuenta (pero ahora no cree una nueva cuenta, porque la cantidad máxima de cuentas prescritas en el contrato inteligente se ha alcanzado en la cadena de bloques);
  • Obtenga una lista de cuentas;
  • Transfiera monedas de citcoin entre Alice, Bob y Alex;
  • Recibir eventos (pero ahora no hay forma de mostrar eventos, por lo tanto, para simplificar, la interfaz dice que los eventos no son compatibles);
  • Registrar acciones.

Primero, inicialice la cadena de bloques:

imagen

A continuación, inicie su cuenta, no juegue con saldo:

imagen

Obtenemos una lista de todas las cuentas disponibles:

imagen

Seleccionamos al remitente y al destinatario, obtenemos sus saldos. Si el remitente y el destinatario son iguales, su cuenta se repondrá:

imagen

En el registro, monitoreamos la ejecución de transacciones:

imagen

En realidad, con un programa de demostración, eso es todo. A continuación, puede ver nuestra transacción en blockchain:

imagen

Y la lista general de transacciones:

imagen

Con esto, completamos con éxito la implementación de PoC para crear la red Citcoin. ¿Qué más se necesita hacer para que Citcoin se convierta en una red de transferencia de monedas completa? Solo un poco:

  • En la etapa de creación de una cuenta, implemente la generación de una clave privada / pública. La clave privada debe almacenarse en la cuenta de usuario, pública en la cadena de bloques.
  • Realice una transferencia de monedas en la que se use una clave pública para identificar al usuario, no un nombre.
  • Cifre las transacciones que van del usuario al servidor con su clave privada.

Conclusión


Hemos implementado la red Citcoin con funciones: agregar una cuenta, obtener un saldo, reponer su cuenta, transferir monedas de una cuenta a otra. Entonces, ¿cuánto nos costó construir PoC?

  • Necesitamos estudiar blockchain en general y Hyperledger Fabric en particular;
  • Aprenda a usar las nubes IBM o Amazon;
  • Aprenda el lenguaje de programación JS y algunos marcos web;
  • Si es necesario almacenar algunos datos no en la cadena de bloques, sino en una base de datos separada, aprenda a integrarse, por ejemplo, con PostgreSQL;
  • Y por último, pero no menos importante, ¡sin conocimiento de Linux en el mundo moderno, en ninguna parte!)

Por supuesto, no es ciencia espacial, ¡pero debes sudar!

Fuentes de GitHub


Puso el código fuente en GitHub . Una breve descripción del repositorio:
Directorio " servidor " - servidor Node.js
Directorio " cliente " - Cliente Node.js
El directorio " blockchain " (los valores y las claves de los parámetros, por supuesto, no funcionan y solo se dan como ejemplo):

  • contrato - fuente del contrato inteligente
  • billetera: claves de usuario para usar la API de Hyperledger Fabric.
  • * .cds: versiones compiladas de contratos inteligentes
  • Archivos * .json: archivos de configuración de muestra para usar la API de Hyperledger Fabric

¡Es solo el comienzo!

Source: https://habr.com/ru/post/466157/


All Articles