Blockchain explicado usando JavaScript - Conceptos de codificación N

En este artículo, vamos a aprender cómo implementar Blockchain usando Javascript.

Índice
  1. requisitos previos
  2. cadena de bloques
  3. Bloquear
  4. Paso 1: Crea un bloque (block.js)
  5. Paso 2: crea una cadena de bloques (blockchain.js)
  6. Paso 3: prueba la cadena de bloques (server.js)
  7. Salir de Observaciones
  8. Resumen

requisitos previos

No se preocupe si no tiene experiencia previa con JavaScript, NodeJSNamey Código VSC. Solo sígueme y aprenderás los conceptos básicos de Blockchain que luego puedes implementar en cualquier otro idioma.

cadena de bloques

Blockchain no es más que un libro de contabilidad digital, distribuido, inmutable y confiable que se puede usar para registrar cualquier cosa, desde transacciones financieras hasta documentos gubernamentales, títulos de propiedad o incluso órdenes de compra.

Cada registro de transacción es un bloque, que están vinculados cronológicamente para formar una cadena de bloques. Si desea cambiar registros en un bloque en particular, no lo reescriba. En su lugar, el cambio se guarda en un nuevo bloque.

Lea también Conceptos básicos de Blockchain y sus casos prácticos de uso

Bloquear

Veamos en qué consiste un bloque típico en la cadena de bloques:

  1. Timestamp es la fecha y hora en que se realizó la transacción.
  2. Record generalmente contiene detalles de una transacción como remitente, destinatario, cantidad. Usaremos los nombres reales de remitente y recipiente en nuestro programa pero en un caso de uso práctico como bitcoinslos nombres reales no se revelan, un firma digital de remitente y recipiente se utiliza en su lugar.
  3. Hash es una huella digital que representa la transacción en el bloque y es completamente única. Si hay un cambio en los detalles de la transacción, el hash también cambiará. Por lo general, es una secuencia alfanumérica generada mediante la aplicación de un algoritmo de cifrado como SHA-256 sobre los detalles de la transacción.
  4. Previous Hash es el Picar del bloque anterior en la cadena de bloques. Esto también se usa para generar el hash del bloque.
  5. Nonce es una abreviatura de "número de un solo uso", que es un número agregado a un bloque en una cadena de bloques que, cuando se reorganiza, cumple con las restricciones del nivel de dificultad. Lo discutiremos más tarde.

Paso 1: Crea un bloque (block.js)

Ahora que sabemos qué es el bloque, vamos a crearlo.

const SHA256 = require('crypto-js/sha256');

class Block {
    constructor(timestamp, previousHash, record, difficultyLevel) {
        this.timestamp = timestamp;
        this.record = record;
        this.previousHash = previousHash;
        const proofOfWork = this.proofOfWork(difficultyLevel);
        this.hash = proofOfWork.hash;
        this.nonce = proofOfWork.nonce;
    }

     /* Genesis Block */
    static genesis() {
        return new this(new Date(), 
            "",
            "GENESIS"
        );
    }

    /* Block Mining */
    static mineBlock(previousBlock, record, difficultyLevel) {
        const timestamp = new Date();
        const previousHash = previousBlock.hash;
        return new Block(timestamp, previousHash, record, difficultyLevel);
    }

    /* Generate Hash using SHA256 */
    static computeHash(message){
        return SHA256(message).toString();
    }

    /* Proof of Work */
    proofOfWork(difficultyLevel) {
        const message = this.timestamp + JSON.stringify(this.record) + this.previousHash;
        if(difficultyLevel){          
            const leadingZeros = "0".repeat(difficultyLevel);
            let nonce = 0;
            while(true){
                let hash =  Block.computeHash(message + nonce);
                if(hash.substring(0, difficultyLevel) == leadingZeros){             
                    return {
                        hash,
                        nonce
                    };
                }
                nonce++;
            }
        }else{
            return {
                hash: Block.computeHash(message),
                nonce: 0
            }
        }       
    }
}

module.exports = Block;

Entendamos algunos términos más

  1. Genesis Block es el primer bloque en la cadena de bloques que no contiene detalles de transacciones anteriores o hashes. Esto generalmente se agrega en el momento de la creación de blockchain. También conocido como bloque cero
  2. Difficulty Level es la restricción para generar el hash del bloque. Más nivel de dificultad, más tiempo necesario para generar un hash.
  3. Block Mining es un proceso de agregar un nuevo bloque a la cadena de bloques. Quien agrega un nuevo bloque se llama Block Minertambién conocido como minero de bitcoins en el caso de bitcoin. Cualquiera puede registrar su computadora para convertirse en uno de los minero de bitcoins en el caso de una cadena de bloques pública como bitcoin. Todos los mineros de bitcoin en la red de bitcoin reciben una copia de la cadena de bloques completa, y cada uno recibe una notificación cuando se agrega un nuevo bloque a la cadena de bloques.
  4. Proof of Work es un rompecabezas hash criptográfico en el que cada minero de bloques en la cadena de bloques está tratando de resolver. Tan pronto como uno de minero de bloques resuelve el rompecabezas, básicamente significa que generó el picar del bloque con dicho nivel de dificultad, lo transmiten en la red blockchain y el hash es validado por todos los demás bloquear menores en la red.
¿Qué es la Prueba de trabajo para nosotros?

Fuera de prueba de trabajo es generar un hash con ceros a la izquierda dependiendo del nivel de dificultad.
El nivel de dificultad de 5 significa generar un hash con 5 ceros a la izquierda, por ejemplo 00000b4d7m3h1s0k2s8bw0hn382

¿Cómo vamos a lograr esto?

Calcularemos el hash aplicando SHA-256 algoritmo sobre los detalles de la transacción y el valor de nonce. vamos a empezar con nuncio apostólico valor de 0 y seguir incrementándolo hasta que encontremos el hash con ceros a la izquierda en el nivel de dificultad.

Paso 2: crea una cadena de bloques (blockchain.js)

Ahora que hemos aprendido muchos términos, creemos rápidamente una cadena de bloques

const Block = require('./block');

class Blockchain {

    constructor() {
        this.difficultyLevel = 1;
        this.chain = [Block.genesis()];
    }

    addBlock(record) {
        const newBlock = Block.mineBlock(this.chain[this.chain.length-1], record, this.difficultyLevel);
        this.chain.push(newBlock);
    }
}

module.exports = Blockchain;

Paso 3: prueba la cadena de bloques (server.js)

Vamos a crear algunos bloques de transacciones con detalles aleatorios de remitente, destinatario y cantidad. Además, aumentemos el nivel de dificultad cada 2 transacciones.

const Blockchain = require('./blockchain')
const { performance } = require('perf_hooks');

const blockchain = new Blockchain();

const userList = ["Alice", "Bob", "Charlie", "David", "Eric", "Franklin", "Gavin", "Harry", "Iris", 
                "Joey", "Kate", "Leo", "Monica", "Nancy", "Oscar", "Phoebe", "Quinn", "Ross", 
                "Sofia", "Tyler", "Umar", "Victor", "Wilson", "Xena", "Yasmine", "Zara"];

const addNBlocks = (n) => {
    for(let i = 0; i < n; i++) {
        blockchain.addBlock({
            sender: userList[Math.floor(Math.random() * userList.length)],
            receiver: userList[Math.floor(Math.random() * userList.length)],
            amount: Math.floor(Math.random() * 1000)
        });
    }
}

const t0 = performance.now();
addNBlocks(2);
var t1 = performance.now()
console.log("[Difficulty Level 1] Added first 2 blocks in  " + (t1 - t0) + " milliseconds.")

blockchain.difficultyLevel = 3;
addNBlocks(2);
var t2 = performance.now()
console.log("[Difficulty Level 3] Added next 2 blocks in  " + (t2 - t1) + " milliseconds.")

blockchain.difficultyLevel = 5;
addNBlocks(2);
var t3 = performance.now()
console.log("[Difficulty Level 5] Added next 2 blocks in  " + (t3 - t2) + " milliseconds.")

/* Print Blockchain*/
console.log(blockchain.chain);

Ahora que todo está listo, ve a la terminal y ejecuta los siguientes comandos

npm install --save crypto-js
node server

Verá una salida como esta.

Output

[Difficulty Level 1] Added first 2 blocks in 6.2153230011463165 milliseconds. [Difficulty Level 3] Added next 2 blocks in 175.92524899542332 milliseconds. [Difficulty Level 5] Added next 2 blocks in 2065.910447001457 milliseconds. [ Block { timestamp: 2020-05-18T17:05:37.501Z, record: 'GENESIS', previousHash: '', hash: '9636ccb176c9f4825d24e1b8db51e3ffb5d448ba112ec0db9672e80f6dc855c3', nonce: 0 }, Block { timestamp: 2020-05-18T17:05:37.504Z, record: { sender: 'Xena', receiver: 'Umar', amount: 770 }, previousHash: '9636ccb176c9f4825d24e1b8db51e3ffb5d448ba112ec0db9672e80f6dc855c3', hash: '0329bb14cb5d59a2ddce485019de8041c6790b4483afbad91516ec78e21a70f4', nonce: 24 }, Block { timestamp: 2020-05-18T17:05:37.509Z, record: { sender: 'Harry', receiver: 'Wilson', amount: 601 }, previousHash: '0329bb14cb5d59a2ddce485019de8041c6790b4483afbad91516ec78e21a70f4', hash: '05187dd8fa18b1ebd50565f1607e43ab9ad081955a71fb6f542cb91755192b49', nonce: 12 }, Block { timestamp: 2020-05-18T17:05:37.512Z, record: { sender: 'David', receiver: 'Quinn', amount: 600 }, previousHash: '05187dd8fa18b1ebd50565f1607e43ab9ad081955a71fb6f542cb91755192b49', hash: '000a0f95e605831a1fa0178351a195fc6f60752fd59e251ea56b1c0d464b8920', nonce: 7947 }, Block { timestamp: 2020-05-18T17:05:37.620Z, record: { sender: 'Yasmine', receiver: 'Umar', amount: 918 }, previousHash: '000a0f95e605831a1fa0178351a195fc6f60752fd59e251ea56b1c0d464b8920', hash: '000e8a70d4b6673f3a10cc68fdc21e0cda7a71aa0fe56d31a13cf95832596a45', nonce: 5384 }, Block { timestamp: 2020-05-18T17:05:37.686Z, record: { sender: 'Phoebe', receiver: 'Victor', amount: 336 }, previousHash: '000e8a70d4b6673f3a10cc68fdc21e0cda7a71aa0fe56d31a13cf95832596a45', hash: '000005b737aaa4faa3b87b56474dec9537eee843c2881cb5f6432ca9708bd7b5', nonce: 45944 }, Block { timestamp: 2020-05-18T17:05:38.178Z, record: { sender: 'Umar', receiver: 'Oscar', amount: 239 }, previousHash: '000005b737aaa4faa3b87b56474dec9537eee843c2881cb5f6432ca9708bd7b5', hash: '0000057a7a4c7caea164b4e5672a3c38fcf12c6c8bfb4b1c503ca876664f2660', nonce: 150796 } ]

Salir de Observaciones

  1. A medida que aumentamos el nivel de dificultad de 1.3 a 5, tomó más tiempo para generar el hash y agregar nuevos bloques. Las tecnologías de cadena de bloques como bitcoin requieren que resuelvas acertijos hash con un nivel de dificultad que va de 18 a 30. Puedes imaginar el tiempo necesario para resolver estos acertijos.
  2. El primer bloque de la cadena de bloques es GÉNESIS bloque sin información de transacción y sin valor hash previo
  3. Ver hash generado con 1, 3 y 5 ceros a la izquierda dependiendo del nivel de dificultad
  4. ver variables nuncio apostólico el valor sigue aumentando con el nivel de dificultad, también nos dice el número de intentos nuestro algoritmo hash tomó para generar hash.

Resumen

Espero que ahora tenga una comprensión básica de la tecnología Blockchain y cómo podemos implementarla. Tenga en cuenta que el ejemplo anterior es una implementación de Blockchain muy básica. Los ejemplos concretos son muy complicados, pero es el primer paso para entrar en el mundo de Blockchain.

Encuentre el código fuente de este ejemplo en github

Si quieres conocer otros artículos parecidos a Blockchain explicado usando JavaScript - Conceptos de codificación N puedes visitar la categoría Tutoriales.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Esta página web utiliza cookies para analizar de forma anónima y estadística el uso que haces de la web, mejorar los contenidos y tu experiencia de navegación. Para más información accede a la Política de Cookies . Ver mas