Si observamos las tendencias de los años anteriores, hemos oído hablar de blockchain todo el tiempo, pero no mucho sobre los detalles.
Todos somos conscientes de que las criptomonedas como Bitcoin, Ethereum, Dogecoin, Matic y otras dependen de la tecnología blockchain. Blockchain lideró los eventos significativos que revolucionaron numerosas industrias en 2021 y allanaron el camino para nuevos logros.
Blockchain es un medio para almacenar datos de una manera que es difícil o imposible de editar, piratear o estafar. Es un libro de contabilidad digital de transacciones que se duplican y se distribuyen en toda la red de sistemas informáticos de la cadena de bloques.
Es la tecnología de base de datos innovadora que impulsa prácticamente todas las criptomonedas. Blockchain hace que sea increíblemente difícil piratear o engañar al sistema al distribuir copias idénticas de una base de datos en toda la red.
Si bien Bitcoin es ahora el uso más destacado de blockchain, la tecnología puede servir para una variedad muy amplia de aplicaciones.
Las criptomonedas y las cadenas de bloques han sido cada vez más populares en los últimos años y se espera que esta tendencia continúe.
Haremos una cadena de bloques simple con JavaScript en este tutorial. Le proporcionará una comprensión básica de cómo funciona una cadena de bloques.
¡Llamémoslo MelodyCoin y entremos en acción!
Crear un bloque
Para comenzar, crearemos un nuevo archivo JavaScript en el que colocaremos todo nuestro código.
Llamémoslo main.js y comencemos con una descripción de cómo deben verse una cadena de bloques y bloques.
Cree una clase Block y asígnele una función Object() { [código nativo] } para empezar.
Debes dar una fecha y el hash del bloque anterior al crear un nuevo bloque:
Aquí están las definiciones para cada propiedad:
- La marca de tiempo indica cuándo se realizó el bloqueo. Puede usar cualquier formato que elija (en este caso, una marca de tiempo UNIX).
- Cualquier forma de datos que desee conectar a este bloque se puede incluir en el parámetro de datos. Si desea crear una criptomoneda, puede guardar aquí los datos de la transacción, como el remitente/receptor y la cantidad de dinero movida.
- El anteriorHash es una cadena que contiene el hash del bloque anterior. Esto es lo que generará la cadena de bloques, que será fundamental para proporcionar la integridad de nuestra cadena de bloques más adelante.
Creación de hashes
Cada bloque se vincula con el bloque anterior (por lo tanto, la propiedad anteriorHash). Es decir, cada bloque requiere un hash. Un hash es similar a una huella digital. Es distinto para cada bloque.
El hash de un bloque se puede calcular pasando todo su contenido a través de una función hash.
Entonces, comencemos implementando una función que calcule el hash del bloque actual.
Entonces, bajo la clase Block, definimos la función de calcularHash:
Sin embargo, el hash SHA256 no es compatible con JavaScript y debe obtenerse de una biblioteca externa.
Crypto-js es un paquete fantástico que incluye implementaciones seguras de varios algoritmos hash.
Luego podemos importarlo a nuestro código main.js.
Ahora que tenemos nuestra función de calcularHash(), vamos a ponerla en uso en la función de nuestro bloque:
Después de describir cómo se ve un bloque, podemos definir cómo debería verse una cadena de bloques. Así que vamos a crear una nueva clase.
En este escenario, la cadena de bloques es un objeto muy simple que tiene una cadena de propiedades. Esta es una matriz que contiene todos los bloques de la cadena.
Antes de que podamos agregar bloques, primero debemos crear lo que se conoce como un "bloque de génesis". Este es el primer bloque de la cadena, y es único en el sentido de que no puede apuntar a un bloque anterior (¡es el primero!).
Entonces, para construir el bloque de génesis, agregaré una función a nuestra clase llamada createGenesisBlock (). De vuelta en la función Object() { [código nativo] } de nuestra clase Blockchain.
Ahora podemos incluir el bloque de génesis cada vez que construimos una nueva instancia de Blockchain:
Métodos de cadena de bloques
Ahora, agreguemos métodos a nuestra clase Blockchain que nos permitirán hacer cosas como agregar nuevos bloques y obtener el bloque más reciente.
La función getLatestBlock es la más básica. Simplemente devuelve el miembro final de la matriz de cadenas:
La técnica addBlock es un poco más complicada.
Antes de que podamos agregar un nuevo bloque a nuestra cadena, primero debemos configurar adecuadamente el campo Hash anterior de ese bloque.
Debe establecerse en el hash del bloque agregado más recientemente a nuestra cadena. También necesitamos calcular el hash del nuevo bloque:
Pruebas
A ver qué tal nos ha salido nuestra MelodyCoin.
Cree una instancia de blockchain para lograr esto. Agreguemos un par de bloques más:
Hemos hecho dos nuevos bloques allí. Echemos un vistazo a cómo se ve nuestra cadena de bloques actualmente.
MelodyCoin se encadenará y formateará con cuatro espacios:
Verifique la integridad de la cadena de bloques
Las cadenas de bloques son fantásticas porque una vez que se agrega un bloque, no se puede modificar sin invalidar el resto de la cadena.
Sin embargo, no tengo ningún método para comprobar la integridad de nuestra cadena de bloques con esta implementación.
Introduzcamos una función isChainValid en nuestra cadena de bloques. Si la cadena es legítima, devolverá verdadero; de lo contrario, devolverá falso:
Prueba de integridad
Ahora podemos poner a prueba la integridad de nuestra cadena de bloques. Si lo ejecutamos ahora, confirmará que nuestra cadena es genuina.
Intentemos ahora manipular nuestra cadena de bloques. Modifiquemos el bloque 2 y sobrescribamos su contenido (supongamos que transferimos 100 monedas en lugar de cuatro).
Cuando ejecutamos esto, podemos ver que el software reconoce nuestro esfuerzo por manipular la cadena.
Sin embargo, puedes creer que hay otro método para entrometerme en esto. Alteré los contenidos en el bloque pero no recalculé el hash. Así que puedes intentar ser inteligente y recalcular el hash de ese mismo bloque.
¡Eso es todo lo que había en nuestra pequeña configuración de blockchain! Nos permite agregar nuevos bloques y detectar la manipulación de datos dentro de la cadena.
Hay dos problemas con nuestra pequeña cadena de bloques que debemos abordar:
- Las computadoras modernas son extremadamente rápidas y pueden agregar miles de bloques a nuestra cadena en segundos. Obviamente, no queremos que nadie envíe spam a nuestra cadena de bloques.
- Nuestra cadena de bloques sigue siendo vulnerable a la manipulación. Puede actualizar el contenido de un bloque y luego simplemente recalcular los hashes (y los hashes anteriores) para todos los bloques siguientes. Incluso si te metes con él, terminarás con una cadena legítima.
Para abordar estas preocupaciones, las cadenas de bloques utilizan una técnica conocida como "prueba de trabajo". Debe demostrar que utilizó una cantidad significativa de recursos computacionales para crear un bloque utilizando este enfoque. Esto también se llama minería.
La prueba de trabajo requiere que el hash de un bloque comience con una cantidad específica de ceros. Pero, ¿cómo puedes saber si tu hash se ajusta a esta regla?
El contenido de un bloque determina su hash. Así obtenemos siempre el mismo hash, siempre que no modifiquemos el contenido.
Cada bloque debe tener un valor nonce agregado como solución. Básicamente, se trata de algunos datos aleatorios que podemos actualizar hasta que el hash de nuestro bloque comience con suficientes ceros. Debido a que no puede alterar la salida de una función hash, debe probar muchas combinaciones diferentes y esperar lo mejor.
Introducir la minería a The Blockchain
Comencemos por incluir un nonce en nuestra clase Block. El nonce es el valor único dentro de nuestro bloque que podemos modificar para impactar el hash del bloque.
No podemos alterar la marca de tiempo o los datos.
A continuación, escribamos una función mineBlock() que realizará la extracción real de un bloque. A esta función se le enviará como parámetro la dificultad necesaria y seguirá ejecutándose hasta que el hash de nuestro bloque comience con suficientes ceros.
Acabo de hacer un ciclo while básico que se ejecutaría hasta que nuestro hash comience con suficientes ceros. Usamos la dificultad para determinar cuántos ceros se necesitan. Con una dificultad de 5, nuestro hash debe comenzar con 5 ceros.
Cuando nuestro hash no contiene suficientes ceros, elevamos el nonce en uno y volvemos a calcular el hash. Y si encontramos un hash que corresponde a la dificultad, lo registramos en la consola.
Hay una cosa más que tenemos que hacer. Realmente no tomamos en cuenta la variable nonce en nuestro método de cálculo de hash, así que aquí está:
Clase de cadena de bloques
Pongamos a prueba este nuevo enfoque en nuestra clase de blockchain y veamos cómo funciona.
Para empezar, definiré la dificultad de nuestra cadena de bloques en la función Object(). Lo definimos aquí ya que podemos usarlo en algún lugar más adelante.
Luego, la función addBlock debe modificarse para que extraiga el bloque antes de agregarlo a nuestra cadena.
Usa la cadena de bloques
Ahora, pongamos nuestra nueva cadena de bloques en uso con el algoritmo de prueba de trabajo. Aquí, agregue un par de declaraciones de console.log.
Cuando ejecutamos este código, podemos observar que el proceso de minería ya no es particularmente rápido.
El algoritmo tarda un tiempo en generar bloques con hashes que comienzan con tres ceros (según lo configurado por dificultad).
Así que ese fue el final de nuestra configuración básica de blockchain.
Podemos regular la rapidez con la que se añaden nuevos bloques a nuestra cadena de bloques gracias al mecanismo de prueba de trabajo.
Es la característica de seguridad más importante de las cadenas de bloques. Y ahora que entiendes cómo funciona, ¡sigue creando el tuyo propio!
Deje un comentario