Construyendo Blockchain Web API usando Swift y Vapor

http://media2.govtech.com/images/940*464/shutterstock_blockchain.jpg

ACTUALIZACIÓN : Me enorgullece anunciar que mi nuevo curso "Blockchain Programming in iOS Using Swift" ya está disponible. Inscríbase ahora por solo $ 10.99.

En mi última publicación , discutí la implementación básica de Blockchain en Swift. En esta publicación llevaré la implementación de Blockchain a la nube utilizando el marco Swift del lado del servidor, Vapor. Desarrollaremos la API web de Blockchain sobre los protocolos HTTP, proporcionando la funcionalidad necesaria usando diferentes rutas. Esta publicación asume que ha instalado Vapor framework en su computadora y tiene conocimientos básicos de Swift Language.

Implementando Modelos

El primer paso es crear modelos necesarios para la API web de Blockchain. Estos modelos consistirán en lo siguiente.

Bloque : una clase de bloque representa un solo bloque que puede contener entradas y salidas representadas por transacciones.

Las propiedades de la clase Block se explican a continuación:

  • índice – La posición del bloque en la cadena de bloques. El índice de 0 significa que el bloque es el primer bloque en la cadena de bloques. El índice de 1 significa que es el segundo bloque en el blockchain … ¡entiendes bien la idea!
  • dateCreated : la fecha en que se creó el bloque
  • previousHash – El valor hash del bloque anterior
  • hash – El hash actual del bloque
  • mensaje – Memo adjunta a cada bloque. Esto es solo para nuestros propósitos
  • nonce – Número incrementado automático que juega un papel importante para extraer el hash
  • transacciones : una matriz de transacciones. Cada transacción representa una transferencia de bienes / valor
  • clave – Esta es una propiedad calculada que se pasa a la función hash

Transacción : la transacción consiste en el remitente, el destinatario y la cantidad que se transfiere. La implementación se muestra a continuación:

La clase Transaction se explica por sí misma. Está formado por los campos from, to y amount. En aras de la simplicidad, utilizaremos nombres ficticios para los campos desde y hacia, en realidad estos campos consistirán en la identificación de la billetera.

Blockchain : Blockchain es la clase principal que representa una lista de bloques. Cada bloque apunta al bloque anterior de la cadena. Cada bloque puede contener múltiples transacciones, que representan el crédito o débito.

Cada modelo se adhiere al protocolo codificable que le permite convertir fácilmente a un objeto representado JSON. Si ha seguido el último artículo, la implementación anterior es muy similar. El siguiente paso es configurar las rutas para nuestra API web, esto se implementa en la nueva sección utilizando el marco Vapor.

Implementando la API web usando Vapor

Hay varias formas diferentes de implementar la API web usando Vapor. En lugar de agregar todo el código en la clase Routes, procedí agregando un controlador personalizado que manejará todas las solicitudes de Blockchain. La implementación de BlockchainController se muestra a continuación:

Comenzaremos por tres puntos finales básicos para la API web.

  • Minería : este punto final iniciará el proceso de minería. La minería nos permitirá satisfacer la prueba de trabajo y agregar el bloque a Blockchain.
  • Transacción : este punto final se usa para agregar una nueva transacción. La transacción contendrá información sobre el remitente, el receptor y la cantidad.
  • Blockchain : este punto final devuelve la cadena de bloques completa.

BlockchainController usa BlockChainService para realizar las operaciones requeridas. La implementación de BlockChainService se muestra a continuación:

Avancemos y revisemos los puntos finales de la API web. Inicie el servidor de Vapor y envíe una solicitud para " extraer " el punto final.

Minería un nuevo bloque

El algoritmo de prueba de trabajo genera un valor hash que comienza con " 000 ". Una vez que se ha extraído el bloque, lo devolvemos convirtiéndolo en formato JSON. Esto se realiza mediante el uso de los protocolos codificables Swift 4.0.

Ahora, podemos agregar nuestra transacción a la cadena de bloques. Aquí hay una transacción simple que transfiere $ 10 de Alex a Mary.

Nueva transacción

El último paso es verificar nuestra cadena de bloques con el bloque recién agregado. Visite el punto final " blockchain " para ver la cadena completa.

Blockchain

¡Hurra! Nuestro Blockchain Web API ahora está funcionando correctamente.

Desafortunadamente, el objetivo de la cadena de bloques es descentralizar y, actualmente, no tenemos ningún mecanismo para agregar nuevos nodos. En la siguiente sección vamos a actualizar nuestra implementación de blockchain para que pueda soportar múltiples nodos.

Agregar nodos a Blockchain

Antes permite que blockchain agregue nuevos nodos, debemos definir cómo se ve un nodo. La implementación de un modelo de nodo se muestra a continuación:

La clase BlockChainNode simplemente consiste en una propiedad de dirección que representa la URL del servidor de nodo. Actualizamos BlockchainController para agregar la capacidad de registrar nuevos nodos. Esto se muestra a continuación:

El BlockchainService también se actualiza para acomodar el registro de los nuevos nodos.

Vamos y probémoslo. Inicie el nuevo servidor de Vapor e intente registrar nuevos nodos.

Registre un nuevo nodo

Una vez que los nodos se hayan registrado, puede buscarlos utilizando el punto final de los nodos como se muestra a continuación:

Obteniendo todos los nodos

Ahora que podemos registrar nuevos nodos, debemos centrarnos en resolver los conflictos entre los nodos. Un conflicto ocurre cuando la cadena de bloques en un nodo se hace más grande en comparación con los otros nodos. En este escenario, siempre tomamos los nodos vecinos y los actualizamos con la cadena de bloques más grande.

Resolviendo conflictos entre nodos

Para crear un conflicto, necesitamos ejecutar un segundo servidor o ejecutar el servidor en un puerto separado. Vamos a usar el enfoque posterior e iniciar el servidor Vapor en un puerto diferente. Una vez que se inicien los dos nodos, crearemos transacciones en ambos nodos que agregarán bloques a la cadena de bloques. Finalmente, llamaremos a un punto final de resolución que resolverá los conflictos entre nodos y actualizará el nodo a la cadena de bloques más grande.

BlockchainController se ha actualizado para agregar un nuevo punto final para resolver conflictos.

Hemos utilizado la función de respuesta asíncrona del framework Vapor que nos permitirá procesar la respuesta de forma asincrónica. El BlockchainService también se ha actualizado para admitir la resolución de conflictos. La implementación se muestra a continuación:

La función de resolución pasa por una lista de nodos y recupera la cadena de bloques de cada nodo. Si la cadena de bloques es más grande que la cadena de bloques actual, reemplaza la cadena de bloques por la cadena mayor, de lo contrario, devuelve la cadena de bloques actual, que también es la más grande.

Para probarlo, iniciemos dos servidores en un puerto separado y agreguemos dos transacciones en el puerto 8080 y tres en 8090 . Puede iniciar un servidor de Vapor utilizando el terminal emitiendo el siguiente comando.

 vapor run serve - puerto = 8090 

Agregamos tres transacciones en el nodo del puerto 8080 como se muestra a continuación:

Blockchain en el puerto 8080

Después de eso, agregamos dos transacciones en el nodo del puerto 8090 como se muestra a continuación:

Blockchain en el puerto 8090

Asegúrese de registrar el nodo con la dirección 8090 como se muestra a continuación:

Registrando un Nodo

Finalmente, es hora de probar nuestro punto final de conflicto de resolución. Invoca el punto final " resolver " visitándolo en tu cartero como se muestra a continuación:

Resolver el punto final que vuelve una cadena de bloques más grande

Como puede ver, el punto final de resolución devuelve la cadena de bloques más grande y también actualiza la cadena de bloques para los otros nodos. Esto completa nuestro escenario de resolución de conflictos.

[ Github ]

Esta publicación se basa en una publicación increíble de Daniel Van Flymen " Aprende Blockchains by Building One ".

Espero que te guste la publicación. Actualmente estoy en el proceso de hacer un curso de Udemy sobre " Programación de Blockchain en iOS ". Puede suscribirse aquí para recibir una notificación cuando se lance el curso.

Si desea apoyar mi escritura y donar, visite mi página de cursos y compre mis increíbles cursos en Udemy.

Gracias y feliz programacion!