Bitcoin explicado de forma sencilla (II)

En el último post diseñamos una forma a prueba de falsificaciones para crear transacciones con la capacidad de probar su autoría. Ahora tenemos una manera de comprobar que cada transacción en nuestro libro de transacciones, que contiene el historial completo de transacciones, es real y creado por el propietario de la dirección de envío.

Sin embargo, ¿qué sucede si alguien elimina una transacción del libro? Recuerda, no hay un lugar central para sacar el libro, está todo distribuido. Recibimos copias de otras personas que usan el libro, y viceversa. La persona que te envía el libro tiene la oportunidad de modificar lo que haya en él antes de enviártelo. Podrían, por ejemplo, borrar una transacción antigua en la que pagaban a alguien dinero. Si el dinero no se enviaba más lejos, recuperarían la propiedad completa de ese dinero según esa versión del libro.

Necesitamos una forma rápida de comprobar si el libro ha sido manipulado. Afortunadamente, la informática también tiene herramientas para eso. Presentando…

Prueba B: Funciones Hash

Las funciones de Hash le permiten tomar cualquier texto que desee y producir su “atajo” único, o “huella digital”, llamado hash. Por ejemplo, uno de los algoritmos hash más comunes se llama SHA-256, y el hash SHA-256 de la oración anterior es

24234df83a4504fbb56e3b02a7cdc569b001801c69d213828a33ae6bcfbbbff8

Puedes consultarlo aquí.

Las funciones Hash tienen un par de propiedades muy útiles:

  • Un hash tendrá siempre la misma longitud, independientemente del tamaño del texto original.
  • Para el mismo texto original, una función hash siempre producirá el mismo hash.
  • Es caótico – cambiar incluso una letra en el texto original cambiará el hash dramáticamente. Siéntete libre de experimentar.
  • Un hash se ve completamente al azar. No hay patrones en él, y por lo tanto no es posible encontrar ninguna pista sobre el texto original basado en el hash. Tampoco es posible predecir cómo será el hash de un texto, excepto por el simple hecho de computarlo y verlo por ti mismo.

Uno de los usos más extendidos de los hashes es proteger tus contraseñas. Imagina que envías tu dirección de correo electrónico y contraseña a un sitio web para registrarse. El sitio web tiene que recordar esta información para crear una cuenta para ti, por lo que la guarda en una base de datos. A partir de ahora, cada vez que envíes tu contraseña, comprobará si coincide con la que está almacenada en la base de datos.

Suena bien, ¿verdad? Excepto que cualquier persona autorizada, (que incluirá a muchos miembros del equipo de desarrollo del sitio web), y muchas personas no autorizadas si logran encontrar una forma de entrar, pueden abrirlo y leer miles de correos electrónicos y contraseñas asociadas. Todo el mundo es culpable de reutilizar contraseñas en algún momento, así que esto les da acceso a miles de correos electrónicos, Facebook, Linkedins… Es una perspectiva aterradora.

Todo sitio web que quiera proporcionar cualquier tipo de seguridad a sus usuarios no pondrá su contraseña en la base de datos. En su lugar, calculará un hash de su contraseña y lo guardará. Ahora, cada vez que inicie sesión, volverá a tener su contraseña y comprobará si el hash coincide con el de la base de datos. Funciona igual de bien, pero ahora la base de datos contiene hashes y no hay forma de saber cuál era la contraseña original que intentaba todas las combinaciones posibles de letras y números.

Por eso los sitios web no pueden recordarte tus contraseñas si las olvidas – ¡no saben tu contraseña ellos mismos! Si ves que tu contraseña es recordada, debe cuestionar instantáneamente la seguridad de cualquier cosa que hagas en ese sitio. Además, los hackers intentarán descifrar los hashes de todos modos, por lo que las contraseñas más largas, complejas e inusuales son más seguras porque toma más tiempo para llegar a ellos si está intentando todas las contraseñas posibles al azar y ver si los hashes coinciden con su hash. Por último, la duplicación de contraseñas es una gran puerta abierta que invita a los hackers a los que yo personalmente he sido víctima ya, así que usa contraseñas aleatorias largas, guárdalas en un administrador de contraseñas como LastPass y habilite la autenticación de dos factores en cualquier lugar que pueda.

Otro gran uso para los hashes es verificar la integridad de los datos. Puedes tener cualquier cosa, incluso videos de 4K – después de todo, son en última instancia sólo una cadena muy larga de unos y ceros. Si incluso uno solo se convierte en cero, o viceversa, el hash se verá completamente diferente, haciendo que los cambios de localización sean fáciles. A veces, los sitios web que ofrecen programas para descargar también publican el hash del programa para que puedas comprobar dos veces que el archivo que tienes en tu ordenador es realmente el que ofrece el sitio web, sin ningún código adicional inyectado furtivamente.

De vuelta a las criptomonedas. Como recordarás, queríamos una forma de comprobar rápidamente si alguien manipuló nuestro historial de transacciones. Los Hashes son perfectos para esto – así que, ¿qué tal si lo dejamos todo? Resulta que no nos ayuda mucho. Nuevas transacciones se añaden a nuestro libro de transacciones todo el tiempo, y cada vez que sucede, el hash cambia. Nada está impidiendo que alguien modifique algo en la historia mientras que también agrega una nueva transacción. En este caso esperamos que el hash cambie porque se agregó una nueva transacción, por lo que la manipulación pasaría desapercibida. Si sólo hubiera una forma de asegurar la historia pieza por pieza…

Llega la cadena de bloques

Podemos resolver esto añadiendo transacciones al historial en bloques en vez de una por una. Para ello, ya no podemos añadir nuestras transacciones por nuestra cuenta. Necesitamos reunir transacciones de otros para ponerlas dentro de nuestro bloque que queremos agregar a la historia. En efecto, los usuarios individuales no necesitan preocuparse por el proceso de agregar transacciones al historial – simplemente comparten sus transacciones a la red, y un grupo de voluntarios las recupera y las organiza en bloques para agregarlas.

Dado que nuestro historial de transacciones se divide ahora en bloques, ahora podemos dividir cada bloque por separado. Esto nos permite añadir nuevas transacciones sin cambiar los hashes del historial existente. Además, si ponemos el hash del bloque anterior dentro de cada nuevo bloque, podemos hacer que el nuevo bloque dependa de su ancestro. Si, por ejemplo, alguien borra una transacción de un bloque de la historia, el bloque será diferente y su hash cambiará. Para reemplazar el bloque original, necesitarán poner este hash en el siguiente bloque, que a su vez cambiará su hash. Este cambio se extenderá hasta el bloque más nuevo que todavía no tiene nada unido a él. En este caso, la manipulación es muy clara – algunos bloques tienen sus hashes cambiados y podemos decir exactamente qué bloque ha sido manipulado primero investigando dónde apareció por primera vez el cambio en la cadena. Podemos entonces descartar con confianza esta historia.

De ahí viene el nombre de “cadena de bloques” – la idea de que los bloques formen una cadena asegurada gracias al uso de los hashes. Usando una cadena de bloques, podemos preservar la integridad de las entradas antiguas mientras añadimos nuevas entradas de forma fiable.

La integridad no es todo

Ahora tenemos un sistema bastante sólido – transacciones firmadas criptográficamente, y una cadena de bloques hasheados para asegurarnos de que la historia se mantiene como estaba. Sin embargo, hasta ahora hemos estado ignorando en silencio algunos temas que surgen del hecho de que todo está descentralizado y no hay un tomador de decisiones que resuelva los dilemas. Si nuestro sistema bancario digital gana tracción, habrá mucha gente que quiera agregar bloques con nuevas transacciones simultáneamente. Es muy probable que nos encontremos con una situación en la que dos personas agregaron bloques diferentes al mismo bloque en vez de uno tras otro, porque la información de que un nuevo bloque ha sido agregado no llegó a la otra persona a tiempo.

Digamos que uno de ellos puso tu transacción en su bloque, pero no el otro. ¿Está confirmada la transacción, entonces? ¿Todavía tienes el dinero o no? ¿Qué rama debe ser la aceptada? No hay forma de saberlo. El problema es aún peor si más bloques se unen a las dos ramas y tenemos aún más divisiones.
Para mitigar esto, podemos establecer una regla que la cadena más larga de la historia se considera la correcta. Es decir, si tenemos una situación de escisión, la rama que obtiene más bloques añadidos a ella debe ser considerada la verdadera historia. Pero aunque es una buena guía, la gente que quiera dañar el sistema o simplemente trolls simples puede añadir bloques a ramas alternas y tratar de adelantar la cadena más larga, buscando una situación en la que después de 100 bloques haya repentinamente otra rama que tenga 101 bloques de longitud y los 100 bloques previamente aceptados ya no sean historia verdadera. Estos tipos de timadores no tienen cabida en un sistema bancario fiable y socavarían gravemente la confianza.
Una cosa más que necesitamos para que nuestro sistema funcione es una manera confiable de crear una historia en la que todos estén de acuerdo, y desalentar los intentos de jugar con el sistema. De esto se trata la minería de Bitcoin, y ese es el tema de la tercera parte.