Antecedentes

El Hashcash, inventado por el criptógrafo inglés Adam Back en 1997, nace como consecuencia de combatir el correo basura -o spam-. La idea de Back era imponer un costo de tiempo (mínimo) por el envío de cada correo. El imponer este costo a alguien que envía unos pocos correos al día esto no le afectaría en lo absoluto; sin embargo, para una persona que quisiera enviar unos millones de correos al día, el costo de tiempo impuesto por Back por envío seria significativo.

La aplicación más importante del Hashcash fue su implementación como núcleo de minería  del Bitcoin, realizado por su creador Satoshi Nakamoto, haciendo de ella una moneda criptográfica segura, característica que la hizo ganar popularidad durante los últimos años.

Lo anterior quiere decir que todos los mineros Bitcoin están gastando su esfuerzo creando pruebas de trabajo Hashcash que actúan como un voto en la evolución de Blockchain y validan el registro de estas transacciones.   

Hashcash

Hashcash es un algoritmo de prueba de trabajo (PoW por sus siglas en inglés, Proof-of-Work) escrito en distintos lenguajes de programación. En este artículo haremos referencia a la  librería Hashcash escrita en python, la cual fue desarrollada por David Mertz y es de libre acceso.

 

Hashcash en Prescrypto

Basados en la clase creada por Mertz, en Prescrypto desarrollamos una clase escrita en Python llamada “Hashcash”. En comparación con la de Mertz, las ventajas de nuestra clase son el uso de la función sha256 para crear el hashcash en la función “Check Sha” y añadir un tiempo de expiración a los hashcash en la función “Check Hashcash”.         

La clase Hashcash

La clase Hashcash cuenta con tres funciones principales:

Create Challenge

Esta función recibe un valor del tipo string, por ejemplo “Prueba”, y genera un hashcash incompleto del tipo string como se muestra a continuación:

Prescrypto1.1*8*06/04/18 13:00:00*Prueba*l-abzeyw*

Cada elemento de este hashcash incompleto tiene el siguiente significado:

– Prescrypto1.1: es la versión de hashcash a utilizar.

– 8: Son los bits de dificultad que tendrá la PoW.

– 06/04/2018 13:00:00: es la fecha y hora de creación del hashcash incompleto con un formato “DD/MM/AAAA HH.MM.SS”.

– Prueba: Es la palabra inicial para comenzar a generar el hashcash.

– l-abzeyw: Es el arreglo aleatorio de palabras con longitud ocho.

 

Check Sha

Esta función recibe un hashcash incompleto generado por la función Create Challenge y   calcula:

Sha256(hashcash incompleto + intento),

donde intento es un número entero hexadecimal. Si el resultado no es correcto, la función no regresa valor alguno y aumenta el intento en uno. Si el resultado es correcto, la función regresa un hashcash válido. Por ejemplo:

Prescrypto1.1*8*06/04/18 13:00:00*Prueba*l-abzeyw*FA

Recordemos que FA es el intento válido, es decir, al aplicar:

Sha256(Prescrypto1.1*8*06/04/18 13:00:00*Prueba*l-abzeyw*FA)

obtenemos los bits necesarios para aprobar la prueba de trabajo (PoW).

 

Check Hashcash

Esta función recibe un hashcash y determina si es válido o inválido; si fuese válido también es posible agregarle un tiempo de caducidad. Como se explica a continuación:

 

La documentación completa a esta clase puede ser consultada en aquí.

 

Implementación de Hashcash en Prescrypto.

La clase hashcash que desarrollamos tiene como objetivo implementar una PoW en la generación de cada bloque en RxChain y validar la PoW implementada en la misma, es decir, cada que se crea una receta nueva en RxChain se realiza el cálculo de generar un hashcash, si este es válido, se genera un bloque; en el caso contrario se espera la creación de una nueva receta y se vuelve a hacer el cálculo una vez más hasta encontrar un hashcash válido y así generar un bloque con todas las recetas anteriores.

Lo anterior se refleja en el siguiente diagrama de flujo:

Por último, al implementar la PoW en Prescrypto buscamos obtener un número aleatorio de recetas por bloque creado en RxChain, de una manera similar como ocurre en el Bitcoin.

 

Bibliografía

[1] http://www.hashcash.org/

[2] https://en.bitcoin.it/wiki/Hashcash

[3] http://www.gnosis.cx/download/gnosis/util/hashcash.py

[4] https://github.com/Prescrypto/hashcash

Leave a Reply

Your email address will not be published. Required fields are marked *