spinner

Introducción a BlockChain: Crea tus propios bloques con javascript

El blockChain o la cadena de bloques plantea una enorme revolución no solo en la economía, sino en todo tipo de ámbitos. En este post vamos a ver una introducción a este concepto, cuales con sus principales características y cómo implementar tu propia cadena de bloques con javascript.

Conceptos generales de BlockChain

Como concepto general, una cadena de bloques o BlockChain es una base de datos descentralizada y segura, que almacena la información en forma de transacciones. Estos datos son compartidos de manera pública a todos los usuarios de esta “red”.

Cada grupo de transacciones comunes se almacena en un bloque, y se genera una función criptográfica que garantice la seguridad del mismo y de las transacciones (contenido) mediante una clave conocida como hash. El cometido principal del hash es enlazar el “current block” (hash) con el bloque anterior (previousHash).

En general cada transacción almacena los datos de una operación, y suele estar formado por el hash mencionado anteriormente y otros parámetros como por ejemplo el timestamp, que es un dato único generado por la fecha y hora actual en milisegundos, el nonce que es un número aleatorio que garantice que cada hash generado no se repite y el hash del bloque previo (previousHash), que normalmente es público.

¿Qué es Ledger?

Básicamente una cadena de bloques es un Ledger. Comparando las transacciones de una cadena de bloques con transacciones bancarias o físicas estándar, un Ledger es una especie de libro contable digital, que almacena todas las transacciones firmadas por los usuarios de la red (pagos, contratos, …) de una manera inmutable.

Su funcionamiento base podemos asemejarlo a un libro contable en la cual se registran todos los movimientos o transacciones de una organización. En cada uno de estos registros, cada bloque tiene un lugar único y específico dentro de la cadena (conteniendo información única), y a su vez la cadena completa se guarda en cada nodo de la red.

A medida que se crean nuevos registros, estos se validan previamente por los nodos de la red y más tarde son añadidos como un nuevo bloque que se enlaza en la cadena. Al tratarse de una tecnología distribuida y redundante, cada nodo de la red/cadena almacena una copia exacta de la misma, lo que garantiza la disponibilidad de la información en todo momento. De esta manera se garantiza que la información almacenada en la cadena no se puede perder, modificar o eliminar.

Es necesario para entender este concepto, revisar las características y diferencias de un sistema centralizado y uno descentralizado.

Sistema Centralizado

  • Una entidad central almacena la información
  • Todas las decisiones son tomadas por esta entidad (reglas, comisiones, …) Esta unidad central almacena toda la confianza del sistema

Sistema Descentralizado

  • Todos los nodos/miembros del sistema almacenan la información
  • Cada nodo tiene el mismo poder, y por tanto las decisiones dependen de que se alcance una mayoría entre estos nodos
  • Es un sistema más transparente y por ende más justo

Teniendo en cuenta todos estos datos, se aprecian algunas de las principales ventajas de un sistema basado en BlockChain :

  • La descentralización provoca un sistema confiable ( deberían ser atacados miles o millones de nodos para hacerse con el control de la red y/o la información )
  • La falta de intermediarios facilita las reglas, restricciones, comisiones, …
  • El reparto de responsabilidad aumenta la seguridad y hace que la información sea confiable
  • Cada operación es validada por consenso entre los miembros de la red
  • La escritura del bloque es única y no se puede alterar, cualquier modificación no valida, no sería aceptada por el resto de nodos

Transacciones

La base de la cadena de bloques son las transacciones. Para entender mejor el concepto de transacción, supongamos que dos usuarios A y B en una red BlockChain quieren realizar una operación entre ellos. El usuario A quiere retirar por ejemplo 1 bitcoin de su cuenta para transferirlo al usuario B. Lo primero que necesita es la aprobación de la red, de manera que debe comunicárselo a cada miembro de la misma, con la particularidad de que nadie de la red sabrá quien es A ni que es B, solo saben que desde una cartera digital (equivalente a una cuenta), se quiere transferir una cantidad desconocida. El usuario que quiera realizar una transacción devela sus intenciones pero no su identidad, y el resto de usuarios validan la operación comprobando si tiene balance suficiente, dando por válido el procedimiento en lo que se conoce como transacción por consenso. Con el paso del tiempo, más y más transacciones se añaden al bloque, una vez que este se llena llega la validación definitiva, entrarían en este punto los mineros y la minería, Proof of work, temas que dan para tratar en otros artículos.

Recordemos que una red BlockChain es una especie de base de datos distribuida entre muchos participantes, y que la red en su libro de registro almacena todas las transacciones ejecutadas en dicha red. A cada participante se le llama nodo, y estos nodos se conectan entre ellos mediante el protocolo Peer to Peer más conocido como P2P, cumpliendo así otro de los requisitos de BlockChain que es que todos los miembros utilicen el mismo protocolo de comunicación.

Como crear tu propio bloque con Javascript

Una vez expuestos los principios teóricos sobre BlockChain, su funcionamiento y peculiaridades, es el momento de crear el código necesario para poder añadir bloques a la cadena.

Los requisitos, y el entorno necesario para poder crear estos bloques son:

  • Javascript
  • Babel
  • yard / npm

(opcionales)

  • nodemon
  • jest
  • eslint

Para poder desarrollar el ejemplo es recomendable aunque no obligatoria instalar Babel y su preset de environment, habilitando así el uso de ES6 y módulos de javascript (export/import).

Se instala mediante yarn add babel/core @babel/node @babel/prese-env —dev (puede perfectamente utilizarse npm, npm install …), de manera que el fichero babelrc tendrá el siguiente aspecto.

Y por otro lado el fichero packakge.json con las dependencias:

La única dependencia de terceros que se va a utilizar es crypto.js, para poder realizar cifrado, en este caso mediante SHA256.

En esta primera parte del ejemplo, lo ficheros principales son índex.js, que es el fichero de entrada de la app. En este fichero se realiza la importación de nuestra clase Block, y se genera un nuevo bloque (minado) a partir del bloque original, conocido como bloque genesis o genesis Block.

Veamos ahora el código principal, la clase Block . La case Block consta de un constructor y cuatro métodos estáticos principales, genesis, mineBlock, hash y print.

Constructor

Se establecen/asignan los cuatro valores que debe tener un bloque:

  • timestamp
  • hash
  • previousHash
  • data

Genesis

Sirve para generar el bloque original, conocido en blockchain como bloque genesis.

Es la primera pieza de la cadena, y desde donde colgarán el resto de elementos de la misma.

Mine Block

Es el método mediante el cual se generan nuevos bloques y se añaden a la cadena, es decir se minan.

Hash

Mediante la librería de terceros crypto.js, se cifra mediante protocolo SHA256 cada unos de los has generados.

Print

Y por último el método público print, para poder ver los bloques de una manera legible en tiempo de desarrollo.

El resultado final de la clase principal Block, es el siguiente:

Creando la clase BlockChain

Una vez desarrollada la clase Block, es hora de crear la clase BlockChain. Esta clase tienes las siguientes características principales:

  • Hereda de la clase Block
  • Cada instancia se genera a partir de un bloque genesis o genesis block
  • Provee un método para facilitar la creación de nuevos bloques

Como primer paso se genera una función validadora, que se encarga de comparar los “hashes” del bloque actual y del bloque anterior, para garantizar la integridad de la cadena.

Con ayuda de esta función validadora, se puede en la nueva clase BlockChain, realizar las validaciones necesarias antes de añadir un nuevo bloque a la cadena, para garantizar la integridad de la misma. A continuación, la clase resultante:

Próximos pasos … y recursos interesantes

Como continuación a esta introducción a BlockChain y la generación de bloques con javascript, una posibilidad es realizar una app que permita crear bloques a varios usuarios de manera concurrente y compartir todas las transacciones de la cadena entre sus miembros.

También puede ser interesante una aproximación a componentes, haciendo que cada una de estas “piezas” se genere a través de un web component o similar, haciendo muy escalable el proceso, ya que sería posible integrar todas las características del bloque en cualquier app con la mera importación del componente.

Recursos

BlockChain: la revolución industrial de internet

La nueva economía BlockChain y criptomonedas en 100 preguntas

Aprende BlockChain – Javier Villar

Imagen principal: Unsplash

Las opiniones vertidas por el autor son enteramente suyas y no siempre representan la opinión de BBVA Next Technologies.

¿Quieres saber que más cosas hacemos en BBVA Next Technologies?