Cómo construir una cadena de bloques de criptomonedas simple en Node.js

 

 

 

  • ¡Registro!
  • Patrones de diseño de interfaces inteligentes, vídeo de 10h + formación UX

  • Índice
    1. Requisitos previos
  • ¿Qué es una cadena de bloques?
  • Cómo crear un bloque
  • Cómo crear una cadena de bloques
    1. 1. Método constructor
    2. 2. Creando el bloque Génesis
    3. 3. Obtención del último bloque
    4. 4. Agregar nuevos bloques
  • Probando la cadena de bloques
  • Cómo verificar la integridad de Blockchain
  • Cómo agregar prueba de trabajo
  • Terminando
  • Conclusión
    1. Recursos adicionales
  • Este tutorial demuestra cómo crear una criptomoneda simple, llamada smashingCoin, utilizando los conceptos de clases de JavaScript y Node.js. Pruébelo: ¡es más sencillo de lo que cree!

     

    El aumento sin precedentes de las criptomonedas y la tecnología blockchain que las sustenta ha tomado al mundo por sorpresa, desde sus humildes comienzos como concepto académico hace más de una década hasta su creciente adopción actual en diversas industrias.

    La tecnología blockchain está recibiendo mucha atención debido a su capacidad para mejorar la seguridad en entornos sin confianza, imponer la descentralización y hacer que los procesos sean eficientes.

    Tradicionalmente, Python ha sido el lenguaje de programación de facto para el desarrollo de blockchain. Sin embargo, con la proliferación de esta asombrosa tecnología, las opciones de desarrollo también han aumentado, y Node.js no se ha quedado atrás.

    En este tutorial, voy a hablar sobre cómo construir una cadena de bloques de criptomonedas simple en Node.js. No será demasiado sofisticado, pero sí suficiente para ayudarle a comprender cómo funciona una cadena de bloques.

     

    Llamaré a esto criptomoneda simple smashingCoin.

    Si es un desarrollador de JavaScript y quiere dar un salto al floreciente campo de las criptomonedas, este artículo le proporcionará las habilidades necesarias para empezar. O, si tiene curiosidad sobre cómo funcionan las cosas en el mundo de las criptomonedas, este tutorial puede ayudarle a responder algunas de sus preguntas.

    Lectura recomendada : Comprensión de la integridad de los subrecursos por Drew McLellan

    Requisitos previos

    Para seguir este tutorial con éxito, necesitará tener lo siguiente:

    • Node.js instalado en su máquina. Puedes descargarlo desde aquí ;
    • Un editor de código, como Visual Studio Code, Sublime Text o cualquier otro.

    Empecemos…

    ¿Qué es una cadena de bloques?

    Blockchain es la tecnología que impulsa las monedas digitales, como Bitcoin y Ethereum. Es una innovadora tecnología de contabilidad pública distribuida que mantiene una lista de registros en continuo crecimiento, conocidos como bloques, que están conectados de forma segura mediante criptografía.

    El término blockchain se ganó su nombre por la forma en que guarda los datos de las transacciones, es decir, en bloques que se conectan entre sí para crear una cadena . El tamaño de la cadena de bloques crece con el aumento del número de transacciones realizadas.

    Cualquier dato de transacción válido se registra en la red blockchain, que se rige por reglas de igual a igual que estipulan los participantes. Por ejemplo, estos datos podrían contener el "valor" del bloque, como en monedas digitales, un registro de transacciones (como cuando las partes intercambian bienes y servicios) o privilegios de derechos, como cuando la cadena registra información de propiedad.

    Además de los datos de la transacción, cada bloque puede contener su propio hash criptográfico (un identificador único o huella digital), su propio valor nonce (un número aleatorio arbitrario utilizado una vez en cálculos criptográficos), el hash del bloque anterior y una marca de tiempo reciente. transacciones autenticadas.

    Dado que cada nuevo bloque debe apuntar al bloque anterior, si un bloque se incorpora a la cadena sin contener el hash correcto del último bloque, podría invalidar toda la cadena de bloques. Esta propiedad de inmutabilidad es clave para la seguridad de las cadenas de bloques.

    Además, a menudo se aplican varios tipos de protocolos de consenso para mantener la autenticidad de la cadena de bloques. El consenso garantiza que todos los participantes estén de acuerdo con las transacciones validadas por la red.

    Por ejemplo, un protocolo de consenso comúnmente utilizado es la prueba de trabajo, cuyo objetivo es identificar un número que encuentra una solución a un problema matemático complicado después de completar una cierta cantidad de trabajo informático.

     

    La idea principal del trabajo de prueba es que cualquier participante en la red blockchain debería encontrar este número difícil de identificar pero fácilmente verificable. En consecuencia, desalienta el spam y la manipulación de la estructura de la cadena de bloques.

    En el caso de la mayoría de las criptomonedas, agregar un nuevo bloque a la cadena de bloques requiere resolver una ecuación matemática compleja, cuya dificultad aumenta con el tiempo a medida que la cadena de bloques crece. En consecuencia, cualquier persona que demuestre que ha trabajado para resolver este problema es compensada con una moneda digital, en un proceso denominado “minería”.

    Cómo crear un bloque

    Ahora, después de presentar la tecnología blockchain y cómo funciona, veamos cómo podemos aplicar los conceptos al crear un bloque. Como se mencionó anteriormente, los bloques son los que se entrelazan entre sí para formar una cadena de bloques.

    Para crear la smashingCoinmoneda, usaré clases de JavaScript , que se introdujeron en ES6.

    ¿Listo?

    Ensuciémonos las manos...

    Aquí está el código de la CryptoBlockclase:

    const SHA256 = require('crypto-js/sha256');class CryptoBlock{ constructor(index, timestamp, data, precedingHash=" "){ this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); } computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)).toString(); } }

    Como puede ver en el código anterior, creé la CryptoBlockclase y constructor()le agregué el método, tal como se hace en cualquier otra clase de JavaScript. Luego, para inicializar sus propiedades, asigné los siguientes parámetros al constructormétodo:

    index Es un número único que rastrea la posición de cada bloque en toda la cadena de bloques.
    timestamp Mantiene un registro del momento en que ocurre cada transacción completada.
    data Proporciona datos sobre las transacciones completadas, como los detalles del remitente, los detalles del destinatario y la cantidad negociada.
    precedingHash Apunta al hash del bloque anterior en la cadena de bloques, algo importante para mantener la integridad de la cadena de bloques.

    Además, utilicé el computeHashmétodo para calcular el hash del bloque en función de sus propiedades, como se indica en los datos anteriores.

    Como puede ver, importé la biblioteca JavaScript crypto-js y usé su crypto-js/sha256módulo para calcular el hash de cada bloque. Dado que el módulo devuelve un objeto numérico, utilicé el toString()método para convertirlo en una cadena.

    Para agregar la biblioteca crypto-js a su proyecto, vaya a la terminal y ejecute el siguiente comando para instalarla usando npm:

    npminstall--save crypto-js

    Después de ejecutar el comando anterior, el directorio de módulos de nodo, que contiene la biblioteca y otros archivos esenciales, se agregará a la carpeta de su proyecto.

     

    Cómo crear una cadena de bloques

    Como se explicó anteriormente, la tecnología blockchain se basa en el concepto de que todos los bloques están encadenados entre sí. Entonces, creemos una CryptoBlockchainclase que será responsable de manejar las operaciones de toda la cadena. Aquí es donde la goma se encontrará con la carretera.

    La CryptoBlockchainclase mantendrá las operaciones de la cadena de bloques utilizando métodos auxiliares que realizan diferentes tareas, como crear nuevos bloques y agregarlos a la cadena.

    Aquí está el código de la CryptoBlockchainclase:

    class CryptoBlockchain{ constructor(){ this.blockchain = [this.startGenesisBlock()]; } startGenesisBlock(){ return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain", "0"); } obtainLatestBlock(){ return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; newBlock.hash = newBlock.computeHash(); this.blockchain.push(newBlock); }}

    Permítanme hablar sobre las funciones de cada uno de los métodos auxiliares que constituyen la CryptoBlockchainclase.

    1. Método constructor

    Este método crea una instancia de la cadena de bloques. Dentro del constructor, creé la blockchainpropiedad, que hace referencia a una matriz de bloques. Observe que le pasé el startGenesisBlock()método que crea el bloque inicial en la cadena.

    2. Creando el bloque Génesis

    En una cadena de bloques, el bloque génesis se refiere al primer bloque creado en la red. Siempre que un bloque se integra con el resto de la cadena, debe hacer referencia al bloque anterior.

    Por el contrario, en el caso de este bloque inicial, no tiene ningún bloque anterior al que señalar. Por lo tanto, un bloque de génesis suele estar codificado en la cadena de bloques. De esta manera, se pueden crear bloques posteriores en él. Suele tener un índice de 0.

    Utilicé el startGenesisBlock()método para crear el bloque génesis. Observe que lo creé usando la CryptoBlockclase creada anteriormente y pasé los parámetros index, timestamp, datay precedingHash.

    3. Obtención del último bloque

    Obtener el último bloque en la cadena de bloques ayuda a garantizar que el hash del bloque actual apunte al hash del bloque anterior, manteniendo así la integridad de la cadena.

    Utilicé el obtainLatestBlock()método para recuperarlo.

    4. Agregar nuevos bloques

    Utilicé el addNewBlock()método para agregar un nuevo bloque a la cadena. Para lograr esto, configuro el hash anterior del nuevo bloque para que sea igual al hash del último bloque de la cadena, asegurando así que la cadena sea a prueba de manipulaciones.

    Dado que las propiedades del nuevo bloque cambian con cada nuevo cálculo, es importante calcular su hash criptográfico nuevamente. Después de actualizar su hash, el nuevo bloque se inserta en la matriz de blockchain.

    En realidad, agregar un nuevo bloque a una cadena de bloques no es tan fácil debido a las diversas comprobaciones que se han realizado. Sin embargo, para esta simple criptomoneda, basta con demostrar cómo funciona realmente una cadena de bloques.

     

    Probando la cadena de bloques

    Ahora, probemos nuestra cadena de bloques simple y veamos si funciona.

    Aquí está el código:

    let smashingCoin = new CryptoBlockchain();smashingCoin.addNewBlock(new CryptoBlock(1, "01/06/2020", {sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50}));smashingCoin.addNewBlock(new CryptoBlock(2, "01/07/2020", {sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100}) );console.log(JSON.stringify(smashingCoin, null, 4));

    Como puede ver en el código anterior, creé una nueva instancia de la CryptoBlockchainclase y la nombré smashingCoin. Luego, agregué dos bloques a la cadena de bloques usando algunos valores arbitrarios. En el dataparámetro, utilicé un objeto y agregué detalles del remitente, detalles del destinatario y cantidad de la transacción.

    Si ejecuto el código en la terminal, aquí está el resultado que obtengo:

    Probando para ver si nuestra blockchain funciona. ( Vista previa grande )

    ¡ Así es smashingCoincomo se ve! Es un objeto que contiene la blockchainpropiedad, que es una matriz que contiene todos los bloques de la cadena. Como puede ver en la imagen de arriba, cada bloque hace referencia al hash del bloque anterior. Por ejemplo, el segundo bloque hace referencia al hash del primer bloque. Después de probar y ver que nuestra blockchain funciona, agreguemos algunas funcionalidades más para mejorar las características de smashingCoin.

    Cómo verificar la integridad de Blockchain

    Como se mencionó anteriormente, una característica clave de una cadena de bloques es que una vez que se agrega un bloque a la cadena, no se puede cambiar sin invalidar la integridad del resto de la cadena.

    Por lo tanto, para verificar la integridad de la cadena de bloques, agregaré un checkChainValidity()método a la CryptoBlockchainclase.

    Los hashes son fundamentales para garantizar la validez y seguridad de una cadena de bloques porque cualquier cambio en el contenido de un bloque dará como resultado la producción de un hash completamente nuevo e invalidará la cadena de bloques.

    Como tal, el checkChainValidity()método utilizará ifdeclaraciones para verificar si el hash de cada bloque ha sido manipulado. A partir del primer bloque creado, recorrerá toda la cadena de bloques y comprobará su validez. Tenga en cuenta que, dado que el bloque de génesis estaba codificado, no se comprobará.

    Además, el método verificará si los hashes de cada dos bloques consecutivos apuntan entre sí. Si la integridad de la cadena de bloques no se ha visto comprometida, devuelve verdadero; de lo contrario, en caso de anomalías, devuelve falso.

    Aquí está el código:

    checkChainValidity(){ for(let i = 1; i this.blockchain.length; i++){ const currentBlock = this.blockchain[i]; const precedingBlock= this.blockchain[i-1]; if(currentBlock.hash !== currentBlock.computeHash()){ return false; } if(currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; }

    Cómo agregar prueba de trabajo

    Como se mencionó anteriormente, prueba de trabajo es el concepto que se aplica para aumentar la dificultad que implica minar o agregar nuevos bloques a la blockchain.

     

    En el caso de smashingCoin, emplearé un algoritmo simple que disuade a las personas de generar nuevos bloques fácilmente o enviar spam a la cadena de bloques.

    Entonces, en la CryptoBlockclase, agregaré otro método llamado proofOfWork().Esencialmente, este algoritmo simple identifica un número, pasado como una difficultypropiedad, de manera que el hash de cada bloque contiene ceros a la izquierda que corresponden a este difficultynivel.

    Garantizar que el hash de cada bloque comience con la cantidad de ceros establecidos en el difficultynivel requiere mucha potencia informática. Cuanto mayor sea el nivel de dificultad, más tiempo llevará extraer nuevos bloques.

    Además, agregaré un noncevalor aleatorio a cada bloque hash de modo que, cuando se realice el refrito, aún se puedan cumplir las restricciones del nivel de dificultad.

    Aquí está el código:

    proofOfWork(difficulty){ while(this.hash.substring(0, difficulty) !==Array(difficulty + 1).join("0")){ this.nonce++; this.hash = this.computeHash(); } }

    Y aquí está el computeHash()método actualizado con la noncevariable incluida:

    computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)+this.nonce).toString(); }

    Además, para implementar el mecanismo de prueba de trabajo en la generación de nuevos bloques, lo incluiré en el addNewBlock()método:

    addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); }

    Terminando

    Aquí está el código completo para crear la smashingCoincriptomoneda usando Node.js:

    const SHA256 = require("crypto-js/sha256");class CryptoBlock { constructor(index, timestamp, data, precedingHash = " ") { this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); this.nonce = 0; } computeHash() { return SHA256( this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data) + this.nonce ).toString(); } proofOfWork(difficulty) { while ( this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0") ) { this.nonce++; this.hash = this.computeHash(); } }}class CryptoBlockchain { constructor() { this.blockchain = [this.startGenesisBlock()]; this.difficulty = 4; } startGenesisBlock() { return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain", "0"); } obtainLatestBlock() { return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock) { newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); } checkChainValidity() { for (let i = 1; i this.blockchain.length; i++) { const currentBlock = this.blockchain[i]; const precedingBlock = this.blockchain[i - 1]; if (currentBlock.hash !== currentBlock.computeHash()) { return false; } if (currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; }}let smashingCoin = new CryptoBlockchain();console.log("smashingCoin mining in progress....");smashingCoin.addNewBlock( new CryptoBlock(1, "01/06/2020", { sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50 }));smashingCoin.addNewBlock( new CryptoBlock(2, "01/07/2020", { sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100 }));console.log(JSON.stringify(smashingCoin, null, 4));

    Si ejecuto el código en la terminal, aquí está el resultado que obtengo:

    ¡Por fin nuestra smashingCoincriptomoneda! ( Vista previa grande )

    Como puede ver en la imagen de arriba, los hashes ahora comienzan con cuatro ceros, que corresponden con el nivel de dificultad establecido en el mecanismo de prueba de trabajo.

    Conclusión

    ¡Eso es todo! Así es como puedes construir una cadena de bloques de criptomonedas simple usando Node.js.

    Por supuesto, la smashingCoincriptomoneda está lejos de estar completa. De hecho, si lo lanza sin realizar más mejoras, es poco probable que satisfaga las demandas actuales del mercado de una moneda digital segura, confiable e intuitiva, ¡lo que lo convierte en el único que la usa!

    No obstante, espero que este tutorial te haya equipado con algunas habilidades básicas para iniciarte en el apasionante mundo de las criptomonedas.

    Si tiene algún comentario o pregunta, publíquelo a continuación.

    Recursos adicionales

    • “ Blockchain 101 ”, CoinDesk
    • " Bitcoin: un sistema de efectivo electrónico entre pares ", Satoshi Nakamoto, Bitcoin.org

    (dm, il)Explora más en

    • Nodo.js
    • javascript
    • cadena de bloques
    • Seguridad





    Tal vez te puede interesar:

    1. ¿Deberían abrirse los enlaces en ventanas nuevas?
    2. 24 excelentes tutoriales de AJAX
    3. 70 técnicas nuevas y útiles de AJAX y JavaScript
    4. Más de 45 excelentes recursos y repositorios de fragmentos de código

    Cómo construir una cadena de bloques de criptomonedas simple en Node.js

    Cómo construir una cadena de bloques de criptomonedas simple en Node.js

    ¡Registro! Patrones de diseño de interfaces inteligentes, vídeo de 10h + formación UX Índice Requisit

    programar

    es

    https://aprendeprogramando.es/static/images/programar-como-construir-una-cadena-de-bloques-de-criptomonedas-simple-en-node-1015-0.jpg

    2024-05-21

     

    Cómo construir una cadena de bloques de criptomonedas simple en Node.js
    Cómo construir una cadena de bloques de criptomonedas simple en Node.js

    Si crees que alguno de los contenidos (texto, imagenes o multimedia) en esta página infringe tus derechos relativos a propiedad intelectual, marcas registradas o cualquier otro de tus derechos, por favor ponte en contacto con nosotros en el mail [email protected] y retiraremos este contenido inmediatamente

     

     

    Top 20