Programa de ejemplo en Java sobre la filosofía del blockchain
IDE: Eclipse
Creamos un proyecto llamado Blockchain y le añadimos una clase Bloque que contendrá los siguientes apartados:
Ilustración 1 Proyecto Blockchain
Definición de bloque. Bloque se puede dividir en dos secciones: un posible encabezado con información sobre el bloque, el bloque anterior o anteriores. La otra sección, “sección de datos” contiene información de transacciones (aunque no siempre se trata de transacciones). Ejemplo gráfico de cómo sería la estructura de los bloques, con algunos de los ítems que pueden llevar
Ilustración 2 Definición de bloque
Encabezado:
- Version (marca de versión)
- Timestamp (cuando se creó el bloque hash)
- Hash
- PreviousHash
- HasOfMerkelTree (subestructura central, llamada árbol de Merkle, que supone un resumen de todas las transacciones contenidas en el bloque)
- Nonce (número arbitrario que se emplea en criptografía dentro de los denominados protocolos de autenticación. Va relacionado con el hash)
- Other info
En nuestro ejemplo definiremos alguna de esta información:
Ilustración 3 Secciones de bloque
Posteriormente declararemos un constructor para iniciar nuestras variables y calcular el hash (para el cálculo del hash se proporciona una herramienta online que nos orientará en la definición de dicho término para poder seguidamente implementar su cálculo):
Ilustración 4 Contructor Bloque
Hashes: funciones unidireccionales que toman unos datos y dan salida a otros datos, esta salida la llamaremos función hash resumen que utiliza una función sha-256 (función hash criptográfica).
Generadora online de sha-256, https://www.freeformatter.com/sha256- generator.html#sha256-explained
SHA-256 es un algoritmo que se utiliza para calcular un valor hash en criptografía. La función hash toma un bloque de datos y devuelve una cadena de bits de tamaño fijo (valor hash). En el enlace anterior los datos utilizados por las funciones hash se denominan "mensaje", irían en esta sección:
Ilustración 5 Generador hash con SHA-256 Generator
El valor hash calculado se denomina "resumen del mensaje" y nos saldría aquí:
Ilustración 6 Hash generada
A la hora de calcular el hash se ha consultado varias páginas que nos instruyen en cómo calcular una función Hash SHA-256 y la codificación de cadenas, por ejemplo, utilizando Java Base64:
Ilustración 7 Función para calcular Hash
Declaramos también en esta clase bloque todos los getters y setters de nuestros atributos para dar por concluida nuestra clase.
El segundo paso será el de crear una clase Blockchain. Veamos la estructura de bloques que vamos a implementar:
Ilustración 8 Estructura de bloques a implementar
Para crear nuestra clase Blockchain empezaremos por definir una lista de bloques
Ilustración 9 Lista de bloques
El constructor no tendrá ningún parámetro pero si inicializaremos nuestra lista como un Array y después añadiremos a nuestra cadena un bloque denominado “Genesis”, que será el primer bloque de nuestra cadena. Este bloque “Genesis” es el inicial, por lo tanto, no tendrá ningún hash previo, es decir no apuntará a ningún otro bloque anterior ya que es el inicial, el genuino, el Génesis.
Ilustración 10 Blockchain con lista de bloques
El método generarGenesis(), consistirá en la siguiente implementación (comentada):
Ilustración 11 Método generarGenesis
Crearemos dos funciones/métodos más, uno para añadir bloques a nuestra cadena “chain” y otro que muestre la información de nuestra cadena. Véase en los siguientes fragmentos:
Ilustración 12 Método para agregar bloque
Ilustración 13 Método mostrarChain
Por último, crearemos una clase de prueba, para probar el correcto funcionamiento de nuestro proyecto ejemplo de Blockchain.
Ilustración 14 Clase de prueba El resultado por consola es el siguiente:
Ilustración 15 Salida prueba
Antes de dar por finalizado el ejemplo, probaremos qué sucederá si alteramos una de las funciones hash obtenidas previamente, para constatar que cualquier alteración romperá nuestra cadena y no se podrá dar por validez dicho proceso. Crearemos un método en la clase blockchain que nos dé el bloque antecesor de otro.
Ilustración 16 Alteración función hash
Vamos pues, a alterar el último de los bloques agregados a nuestra cadena en la clase de pruebas de blockchain.
Ilustración 17 Alteración último bloque El resultado en la consola será el siguiente:
Ilustración 18 Resultado modificando hash
Como se puede observar, el bloque tres no coincide su hash previo (“Germán”) con el hash del bloque dos (“fpTs…”)
Para que nuestro ejemplo tenga cierto rigor y acciones como esta no sean posibles de hacer, necesitaremos crear en nuestro proyecto, más explícitamente en nuestra clase blockchain un método que nos valide si la cadena sufre alguna alteración como la acontecida o no.
Comprobaremos que el hash de nuestro bloque actual es el mismo que el almacenado y también comprobaremos que el hash previo de nuestro bloque actual es el mismo que el hash del bloque anterior
Ilustración 19 Método para comprobar validez de cadena
Para concluir comprobamos la validez en la clase de pruebas de nuestro proyecto.
Ilustración 20 Insección de validación de cadena
La consola nos dice que no:
Ilustración 21 Salida con validación de cadena
Si comentamos la anterior declaración que modifica el hash previo comprobamos si la cadena es válida:
Ilustración 22 Comprobación con cadena válida y comprobándolo
Ilustración 23 Cadena comentada
Ilustración 24 Salida cadena válida con comprobación PAGE8























