Iniciando la cadena de bloques

Toda cadena de bloques empieza por el bloque 0, que tiene unos datos predefinidos:

  • Nadie ha podido hacer transacciones ya que no se han generado monedas aun.
  • No hay un resultado del problema criptografico, ya que no existe un bloque anterior.
  • Como no hay solucion de problema, no hay monedas acreditadas a ninguna cuenta (algunos diseñadores usan este bloque para asignar cierta cantidad de monedas a una cuenta ya existente de su propiedad: a esto se le denomina preminado)
En cualquier caso, el bloque 0 debe tener la misma estructura que tendran todos los siguientes bloques, es por eso que primero debemos desarrollar el procedimiento que crea bloques nuevos y despues usarlo para el crear el primer bloque.

Hagamos una pausa para explicar lo que es una funcion hash, ya que a partir de ahora seran de suma importancia.

Una funcion hash es aplicar una serie de procedimientos matematicos a algo (puede ser una cadena de texto, un archivo, casi cualquier tipo de informacion) que da como resultado una cadena relativamente corta de caracteres, con la caracteristica de que el mas minimo cambio en la fuente produce resultados totalmente diferentes en el hash.

Veamos el siguiente ejemplo, usando la funcion hash MD5

Frase: Hoy es mi cumpleaños
Hash MD5: 68a00371ed825f8f10ff9ae6db7e849b

Frase: hoy es mi cumpleaños
Hash MD5: fea434969eaba0b35d891fbe781a30a2

Como podemos ver, el solo cambio de H a h da como resultado un hash completamente diferente. La utilidad de los hash es que el proceso no es reversible, es decir, es imposible saber a partir de un hash cual es la informacion que lo genero.

Paskal usara MD5 y SHA-256 como doble capa de proteccion.

Volvamos a los bloques...

Los bloques deben contener una informacion necesaria para el buen funcionamento de la cadena ya que cada uno depende directamente del bloque anterior.
  • El numero del bloque. Aunque parezca redundante, ya que los bloques se guardan como archivos independientes en formato 'xxx.blk', donde xxx es el  numero, sirve como proteccion en caso de que el nombre del archivo se corrompa o cambie accidental (o intencionadamente).
  • El momento en el que fue creado (Unix timestamp para nuestro caso)
  • El problema que habia que solucionar para minarlo.
  • La solucion a dicho problema.
  • La direccion del minero que lo resolvio, donde se acreditara la recompensa.
  • La recompensa por minado del bloque.
  • El numero de transacciones que seran incluidas.
  • Las comisiones generadas por las transacciones que seran incluidas en el bloque.
  • Todas las transacciones incluidas en el bloque
  • Por ultimo, mediante una mezcla de toda esta informacion (que desde luego, sera unica), generar el problema para el siguiente bloque.
Que es el problema de mineria? Se trata de buscar una expresion en formato conocido que su Hash SHA256 cumpla las caracteristicas exigidas en el problema. Esto, que parece complicado, se ve sencillo con un ejemplo:

El bloque 1019 tiene las siguientes caracteristicas
  • Momento en el que fue generado: 1608586868
  • Direccion del minero: P4F6FE69E5A808A4097C8FE7C77E90863B2
  • Numero de transacciones: 189
Ponemos todo esto en una sola linea separado por espacios y obtenemos:
1608586868 P4F6FE69E5A808A4097C8FE7C77E90863B2 189

Le aplicamos SHA256 y obtenemos:
2A112AFDA5862260DF41A2E6820D38D68C0B956DEC663C3F8D04507BFF3DA493

Dependiendo de la dificultad que queramos para el siguiente bloque, tomamos los ultimos caracteres de este SHA256. Si el tiempo promedio de los ultimos 20 bloques baja de cierto tiempo establecido, aumentamos la dificultad, en cambio, si el tiempo promedio es mas alto , disminuiremos la dificultad. Pongamos que la dificultad se mantiene en 14, asi que tomamos los ultimos 14 caracteres:

04507BFF3DA493

Y ya tenemos el problema para el siguiente bloque. Que debe hacer el minero para resolverlo?

Debe encontrar una cadena de texto cuyo hash SHA256 contenga integramente el problema planteado, todos los mismos caracteres y consecutivos, sin importar el lugar. Pero no cualquier cadena de texto, esta debe cumplir con un formato predeterminado:
Encabezado + Direccion a la que desea acreditar la recompensa + un numero entero de 9 digitos mayor que 100000000.
El encabezado son 6 letras mayusculas cualesquiera.
Este formato posibilita que cada direccion pueda obtener la cantidad de aproximadamente 247.132.620.800.000.000 (casi 1/4 de trillon) hashes diferentes en busca de uno que contenga la cadena buscada.
Veamos un ejemplo de solucion: (la direccion se ve en negrillas)

KALHMGP4F6FE69E5A808A4097C8FE7C77E90863B2561908714

Como la solucion ya contiene la direccion del minero, es imposible realizar robos de mineria, que consiste en reenviar la solucion alegando que es otro el minero.

Nada mas encontrada la solucion, el minero debe compartirla con la red; todos los pares comprueban que la solucion es valida y proceden a construir el nuevo bloque y empezar el ciclo una vez mas.

Hay desde luego problemas en el mundo real que la teoria no ve: dos mineros pueden encontrar soluciones diferentes en un momento similar y publicar sus resultados. Como la trasmision de informacion entre los pares no es instantanea (se pierde de promedio medio segundo entre que se recibe una informacion y se vuelve a enviar) pueden circular por la red dos soluciones diferentes que construirian 2 bloques diferentes, rompiendo la cadena de bloques y creando una bifurcacion. Pero de los mecanismos para evitar esto y corregir bifurcaciones hablaremos en otro momento.

Ya que la cadena de bloques contiene todas las transacciones realizadas, es posible revisandola saber donde se encuentra cada moneda creada. Pero un problema surge cuando la cadena empieza a ser demasiado larga y hay que revisar bloque a bloque para obtener el saldo de determinada direccion; para evitar esto entra en juego el sumario de direcciones.

Comentarios

Entradas populares de este blog

Funcionamiento interno

Como funciona una criptomoneda?

Año nuevo, nuevo nombre