Problema a resolver: Cómo evitar que una activo digital sea gastado dos veces al mismo tiempo?

Imaginemos que tenemos un archivo y queremos monitorear y retener todos los cambios que se le hagan. Además, queremos tener la capacidad de verificar el historial completo de todos los cambios que se le hicieron. Cómo verificamos que un archivo corresponda a la versión correcta?

Una solución para verificar archivos se llama función hash criptográfica. (Ese era el link de wikipedia, pero en resumen es un algoritmo que transforma un bloque de datos en una serie de caracteres de longitud fija.)
Una función hash criptográfica tiene que tener estas propiedades:
  •  Ser determinística: El mismo mensaje siempre produce el mismo Hash.
  •  Es rápida en determinar el valor de hash para cualquier mensaje.
  • Es casi imposible generar un mensaje a partir de su valor hash, la única forma es intentar con todos los mensajes posibles.
  • Un pequeño cambio en el mensaje original cambia tanto el valor del hash que el nuevo hash es totalmente diferente al hash original. No parecen tener correlación.
  • Es muy poco probable encontrar dos mensajes con el mismo valor de hash.
Ejemplo:
Si yo uso el algoritmo SHA-256 para generar el hash de Pura Vida!
el hash es: 4808B37224F1C8D4AA491D8EDFD0370D05FABC34533A0D45A22EEFE50E788324
Si me equivoqué y puse Pura Vida1 ahora sería:
949DE0800F10E08FAA486F4AD3C457EDA0C6F91594473A6CBC897A29FB46147A
>>> Pueden jugar con generadores hash en http://onlinemd5.com/

Y… para qué se usa el hash?

Se usa para comprobar que un archivo es exactamente igual al original. Si tengo el hash de mi archivo, y el hash del original y los comparo y son el mismo, excelente. Si son diferentes, entonces hubo algún cambio. En ningún momento tengo acceso al archivo original. Ni puedo calcularlo a partir del hash.

Este proceso lo usan para confirmar la integridad de un software. El creador de software publica un hash del archivo de actualización. Cuando los usuarios descargan la actualización, pueden confirmar que el archivo recibido es el correcto. Como? Simplemente se corre el algoritmo sobre el archivo descargado y se compara con el hash publicado por el creador.

Ya sabemos que es un hash. Cómo se usa en Blockchain?

Aquí voy a simplificar un poco, es más complicado, pero vamos poco a poco…

Tenemos la primera versión de un archivo, es una base de datos. A este archivo sólo podemos adjuntarle transacciones. Append-only se dice esto en inglés. Tomemos la primera versión, que probablemente esté vacía y le calculamos el hash. Entonces tendríamos:

hashVersion1 = hash(version1)

Cómo agregamos transacciones sin perder el hilo del historial del archivo?
Le agregamos el hash del bloque anterior a la información utilizada para calcular el hash siguiente. Es decir, el hash del bloque anterior es una entrada para el cálculo del hash del bloque siguiente. Algo así:

hashVersion2 = hash(cambiosVersion2 + hashVersion1)

Y así sucesivamente…

hashVersion3 = hash(cambiosVersion3 + hashVersion2)
hashVersion4 = hash(cambiosVersion4 + hashVersion3)
Esto hace posible verificar el hilo completo del historial de bloques. También, al ser el hash del bloque anterior una entrada del hash del próximo bloque, no es posible crear un bloque nuevo sin conocer el hash correcto del bloque anterior. Estoy obligado a adjuntar mi bloque al historial correcto.

Ahora tenemos una cadena de bloques conectados por hashes. Excelente!

En el caso de Bitcoin, tenemos bloques transaccionales. Son bloques con una serie de transacciones en un orden específico.
Pero, cómo decidimos el orden correcto?