Para construir una cadena de bloques básica en JavaScript, vamos a comenzar codificando la clase Bloque
. Esta es la unidad más fundamental en una cadena de bloques y es más sencilla que las otras clases. Aquí es donde encapsularemos la lógica para almacenar los datos (por ejemplo, las transacciones), el hash del bloque anterior y el hash del bloque actual. Todo el código que vamos a crear, lo haremos usando Visual Studio Code y tendremos instalado Node.js en nuestro ordenador, de momento no vamos a incluir nada más porque lo que pretendemos es hacer la parte de codificación de la cadena, más adelante, encapsularemos todo esto dentro de un API que nos permita interactuar con las funciones de la cadena para pintar en nuestra web el resultado de lo que sucede en la trastienda.
Existen muchos tutoriales para instalar Node.js en tu ordenador, pero los pasos resumidos son los siguientes:
En Windows y MacOS:
- Dirígete al sitio web oficial de Node.js en https://nodejs.org/.
- Verás varias versiones de Node.js disponibles para descargar. Generalmente, hay dos versiones recomendadas: LTS (Long Term Support) y Current. La versión LTS está probada a fondo y es la mejor opción para la mayoría de los usuarios ya que ofrece mayor estabilidad. La versión Current tiene las características más recientes, pero puede tener algunos problemas ya que aún está en fase de pruebas.
- Haz clic en el botón de descarga para la versión que prefieras. Esto descargará un instalador en tu computadora.
- Ejecuta el archivo de instalación descargado y sigue las instrucciones en pantalla. En la mayoría de los casos, puedes simplemente aceptar las opciones predeterminadas.
- Una vez completada la instalación, puedes abrir una nueva ventana del terminal (o línea de comandos en Windows) y escribir
node -v
y luegonpm -v
para verificar que Node.js y npm (Node Package Manager, que se instala automáticamente con Node.js) se han instalado correctamente. Ambos comandos deben mostrarte la versión instalada.
En Linux (Ubuntu):
Puedes usar un gestor de paquetes para instalar Node.js. Para Ubuntu, el gestor de paquetes es apt
. Aquí están los comandos que necesitas ejecutar en la terminal:
- Primero, actualiza tu sistema con el siguiente comando:
sudo apt update
- Luego, puedes instalar Node.js con este comando:
sudo apt install nodejs
- También querrás instalar npm, que es el gestor de paquetes de Node.js. Puedes hacer esto con este comando:
sudo apt install npm
- Después de la instalación, puedes verificar que todo esté en orden con los siguientes comandos:
node -v
ynpm -v
. Esto te mostrará las versiones de Node.js y npm respectivamente.
Y eso es todo. Ahora deberías tener Node.js instalado en la computadora y estar listo para empezar a desarrollar.
La Clase «Bloque»
La clase Bloque
debe incluir un método para calcular su propio hash, y antes de seguir, ¿qué es un hash? En términos simples, un hash es una función que toma una entrada (o ‘mensaje’) y devuelve una cadena de caracteres de longitud fija que es única para cada entrada única. Si cambias incluso un solo carácter en la entrada, el hash resultante será completamente diferente.
Estas son algunas características clave de una función de hash:
- Determinista: Para cualquier entrada específica, la salida (hash) será siempre la misma.
- Rápida de computar: Para cualquier entrada dada, el hash debe ser rápido de calcular.
- Preimagen resistente: Es computacionalmente inviable generar la misma entrada original a partir de su hash. En otras palabras, la función de hash es un camino de una sola vía.
- Pequeñas modificaciones en la entrada producen cambios drásticos en el hash: Incluso un cambio minúsculo en la entrada (como cambiar una letra) produce un hash totalmente diferente.
- Resistente a colisiones: Es computacionalmente inviable encontrar dos entradas diferentes que resulten en el mismo hash.
Las funciones de hash son una parte fundamental de la informática y son especialmente importantes en áreas como la seguridad informática y la criptografía. En una blockchain, las funciones de hash se utilizan para enlazar los bloques entre sí, ya que cada bloque contiene el hash del bloque anterior, lo que asegura la integridad y la autenticidad de la cadena de bloques completa.
Si quisieras relacionar esto con algo más tangible, podrías pensar en un hash como una especie de huella digital digital para los datos. Al igual que las huellas dactilares son únicas para cada individuo, un hash es único para cada conjunto de datos específico.
Como decíamos, la clase Bloque
debe incluir un método para calcular su propio hash y este método tomará los datos dentro del bloque y creará un hash único. En términos de la seguridad de la cadena de bloques, este hash es crucial porque cualquier cambio en los datos del bloque alterará el hash, haciendo evidente la manipulación.
Claro, aquí tienes un ejemplo de cómo podrías implementar una clase Bloque
básica en JavaScript utilizando el módulo crypto de Node.js para el cálculo del hash. He añadido comentarios en cada línea para explicar lo que hace:
// Importamos el módulo de criptografía de Node.js
const crypto = require('crypto');
// Definimos la clase Bloque
class Bloque {
// Constructor para el bloque
constructor(indice, datos, hashPrevio = '') {
// El índice del bloque en la cadena
this.indice = indice;
// La marca de tiempo de cuándo fue creado el bloque
this.timestamp = Date.now();
// Los datos almacenados en el bloque. Podría ser cualquier tipo de datos.
this.datos = datos;
// El hash del bloque anterior en la cadena
this.hashPrevio = hashPrevio;
// El hash del bloque actual
this.hash = this.calcularHash();
}
// Método para calcular el hash del bloque
calcularHash() {
// Creamos un objeto de tipo hash con el algoritmo sha256
const sha256 = crypto.createHash('sha256');
// Actualizamos el hash con los valores del bloque
// Convertimos cada parte a cadena para asegurarnos de que podemos calcular el hash
sha256.update(this.indice.toString() + this.timestamp.toString() + this.hashPrevio + JSON.stringify(this.datos));
// Calculamos el hash y lo devolvemos en formato hexadecimal
return sha256.digest('hex');
}
}
// Exportamos la clase Bloque para que pueda ser utilizada en otros módulos
module.exports = Bloque;
Esta clase la iremos enriqueciendo poco a poco a medida que vayamos incluyendo más información, como es el caso de las transacciones, pero de momento con esto es más que suficiente por hoy.
Te dejo una relación de mis entradas, relacionadas con el mundo cripto y la Web3.0
- WTF, Ledger
- Zero Trust Chain A Design Pattern for Improved Interoperability and Security in Polkadot
- Bye Bye Satoshi Nakamoto, 12 años y contando…
- Patrones de Diseño para Contratos Inteligentes (Parte 2)
- Patrones de Diseño para Contratos Inteligentes (Parte 1)
- Sobre el Manifiesto Criptoanarquista
- Niveles Blockchain
- BSN. Blockchain Service Network
- Crea Tu propia Blockchain (Parte 2)
- Crea Tu propia Blockchain (Parte 1)