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

es un magazine generalista de ideas que se erige como una trinchera intelectual en la Batalla Cultural, reconociendo la centralidad que ha adquirido la cultura en la política contemporánea. Nuestro propósito es la reivindicación incondicional de los valores fundamentales de la libertad individual y económica, basándonos en la ética de que cada ser humano es un fin en sí mismo. Defendemos el capitalismo de laissez-faire como el único sistema ético compatible con la libertad individual, que además genera la mayor prosperidad. Sostenemos que el respeto a la libertad de todos los individuos, quienes se relacionan y cooperan de forma voluntaria y no impuesta, debe ser defendido prioritariamente en términos morales, no meramente prácticos. Nos posicionamos firmemente en contra de toda forma de colectivismo, identitarismo, y cualquier tipo de opresión que coaccione las libertades personales y civiles. Adoptamos el Axioma de No-Agresión como principio central de nuestro credo, oponiéndonos al inicio del uso o amenaza de violencia física contra la persona o la propiedad de otro. En este contexto, consideramos que el Estado es el agresor supremo, eterno y mejor organizado contra las personas y las propiedades del público. Nos oponemos a la violencia impositiva, al control gubernamental y a la esclavitud en gran escala que representa el servicio militar obligatorio. Además, rechazamos la noción de los "mal llamados derechos positivos" (como el derecho al trabajo o a la sanidad) que implican la obligación de otros individuos de sufragar esos gastos, lo que consideramos una destrucción de los derechos de propiedad y libertad de terceros. Nuestro magazine abordará múltiples ámbitos de la vida diaria –desde la economía y los derechos de propiedad hasta las libertades personales (como la libre expresión, la prensa, y la postura ante temas de moralidad sin víctimas)– aplicando una visión consistente de la libertad. Desde Colombia y con un enfoque en la realidad hispanoamericana, buscaremos visibilizar los desafíos que impone el globalismo como un orden político que traslada la soberanía de las naciones a entidades supranacionales, promoviendo un nuevo orden uniformizador y posnacional. Nuestra labor es velar por la libertad siempre en peligro y desenmascarar las narrativas hegemónicas que buscan moldear la mente pública. Proveeremos la teoría y el debate necesarios para que la causa de la libertad no muera estéril, y para que se logre una articulación de fuerzas libertarias no progresistas, conservadoras y patriotas, delineando un nuevo "nosotros" político.

0 comments:

Publicar un comentario