Escribir una pequeña cadena de bloques en JavaScript - Primera Parte


Casi todo el mundo ha oído hablar de las criptomonedas como Bitcoin y Ethereum, pero pocas personas realmente saben cómo funciona la tecnología detrás de estas. En esta publicación de blog crearé una cadena de bloques simple en JavaScript para demostrar cómo funcionan internamente. ¡Lo llamaré SavjeeCoin!

              


Un blockchain es una base de datos pública que consta de bloques que cualquiera puede leer. Nada especial, pero tienen una propiedad interesante: son inmutables. Una vez que se ha agregado un bloque a la cadena, ya no se puede cambiar sin invalidar el resto de la cadena.
Esa es la razón por la cual las criptomonedas se basan en blockchains. ¡No quieres que las personas cambien sus transacciones después de que las hayan hecho!

Construyendo un bloque


Una cadena de bloques consiste en muchos bloques que están unidos entre sí (eso tiene mucho sentido, ¿no?). El encadenamiento de bloques ocurre de una manera que nos permite detectar cuándo alguien ha manipulado cualquiera de los bloques anteriores.
Entonces, ¿cómo aseguramos la integridad? Bueno, cada bloque contiene un hash que se calcula en función de su contenido. También contiene el hash del bloque anterior.
Esto es lo que podría parecer una clase Block en JavaScript:
 const SHA256 = require ( "crypto-js/sha256" ); class Block { constructor ( index , timestamp , data , previousHash = '' ) { this . index = index ; this . previousHash = previousHash ; this . timestamp = timestamp ; this . data = data ; this . hash = this . calculateHash (); } calculateHash () { return SHA256 ( this . index + this . previousHash + this . timestamp + JSON . stringify ( this . data )). toString (); } } 
Empiezo requiriendo la biblioteca crypto-js porque la función hash sha256 no está disponible en JavaScript. Después de eso, defino un constructor que inicializa las propiedades de mi bloque. Cada bloque recibe un index que nos dice en qué posición se encuentra el bloque en la cadena. También incluimos una marca de tiempo, algunos datos para almacenar en nuestro bloque y finalmente el hash del bloque anterior.

Construyendo la cadena


¡Ahora podemos comenzar a encadenar bloques juntos en una clase Blockchain! Esto es lo que podría verse en JavaScript:
 class Blockchain { constructor () { this . chain = [ this . createGenesisBlock ()]; } createGenesisBlock () { return new Block ( 0 , "01/01/2017" , "Genesis block" , "0" ); } getLatestBlock () { return this . chain [ this . chain . length - 1 ]; } addBlock ( newBlock ) { newBlock . previousHash = this . getLatestBlock (). hash ; newBlock . hash = newBlock . calculateHash (); this . chain . push ( newBlock ); } isChainValid () { for ( let i = 1 ; i < this . chain . length ; i ++ ){ const currentBlock = this . chain [ i ]; const previousBlock = this . chain [ i - 1 ]; if ( currentBlock . hash !== currentBlock . calculateHash ()) { return false ; } if ( currentBlock . previousHash !== previousBlock . hash ) { return false ; } } return true ; } } 
En el constructor inicializo la cadena creando una matriz que contiene el bloque de genesis. El primer bloque es especial porque no puede apuntar a un bloque anterior. También agregué dos métodos:
  • getLatestBlock() devuelve el último bloque en nuestra cadena de bloques.
  • addBlock() es responsable de agregar un nuevo bloque a nuestra cadena. Para hacer eso, agregamos el hash del bloque anterior a nuestro nuevo bloque. De esa forma conservamos la integridad de la cadena.Debido a que cambiamos los contenidos de nuestro nuevo bloque, necesitamos recalcular su hash. Cuando se hace eso, empujo el bloque hacia la cadena (matriz).
Finalmente, he creado un método isChainValid() para asegurarme de que nadie haya interferido con la cadena de bloques. Pasa por todos los bloques y comprueba si el hash de cada bloque es correcto. También verifica si cada bloque apunta al bloque anterior correcto comparando el valor previousHash Hash. Si todo sale bien, devuelve verdadero y si algo está mal, devuelve falso.

Usando el blockchain


¡Con nuestra clase Blockchain terminada, podemos empezar a usarla!
 let savjeeCoin = new Blockchain (); savjeeCoin . addBlock ( new Block ( 1 , "20/07/2017" , { amount : 4 })); savjeeCoin . addBlock ( new Block ( 2 , "20/07/2017" , { amount : 8 })); 
Aquí estoy creando una nueva instancia de Blockchain y llamándola SavjeeCoin. Luego agrego algunos bloques ficticios en la cadena. Los bloques pueden contener cualquier información que desee, pero en este caso opté por un objeto con una propiedad de amount .

Tratando de manipularlo


En la introducción dije que las cadenas de bloques son inmutables. Los bloques no se pueden cambiar una vez que se agregan. ¡Probemos eso!
 // Check if chain is valid (will return true) console . log ( 'Blockchain valid? ' + savjeeCoin . isChainValid ()); // Let's now manipulate the data savjeeCoin . chain [ 1 ]. data = { amount : 100 }; // Check our chain again (will now return false) console . log ( "Blockchain valid? " + savjeeCoin . isChainValid ()); 
Comenzaré por verificar la integridad de nuestra cadena ejecutando isChainValid() . No he manipulado ningún bloque por lo que vuelve true .
Después de eso tomo el primer bloque de la cadena (índice = 1) y manipulo la cantidad. Luego vuelvo a verificar la integridad de la cadena y esta vez detecta que algo anda mal. Nuestra cadena ya no es válida.

Conclusión


Esta implementación está lejos de ser completa. No implementa prueba de trabajo o una red P2P para comunicarse con otros mineros.
Sin embargo, demuestra cómo funciona una cadena de bloques. Mucha gente piensa que es muy complejo, pero esta publicación demuestra que los conceptos básicos de una cadena de bloques son fáciles de comprender e implementar.

About Hora de Libertad

Este intenta ser un magazine generalista que se enfoca en reivindicar los valores de la libertad individual y economíca, en contra de colectivismos e identitarismos y cualquier tipo de opresión directa que coaccióne a las libertades personales y civiles. Este magazine revisará muchos ambitos de la vida diaria, desde Colombia, velando por la libertad siempre en peligro.

0 comments:

Publicar un comentario