De Bizancio y la virtualidad de lo cotidiano

NOTA: Este texto lo escribí para el concurso de divulgación científica de la revista JotDown el año pasado. Fue seleccionado para formar parte de un libro que se publicó después. Lamentablemente, en el proceso de edición fue descartado por razones que desconozco pero que tampoco me interesa saber.

Lo bueno es que ahora puedo publicarlo aquí. Espero que os guste.

En estos días que corren aún hay gente que cree que su dinero sigue estando referenciado a unas reservas de oro. Como lo oyes. Hay gente que piensa que el dinero son pequeñas porciones de un montón de toneladas de oro que su país almacena y definen la riqueza de éste.

Tampoco te sorprendas tanto, también hay gente que cree que el dinero es un fin, y no un medio para facilitar el trueque. No sé quién les habrá metido esta idea en la cabeza.

El caso es que los talegos estuvieron referenciados al oro in the past pero durante el siglo XX dejó de ser así.

¿Y entonces, su valor de dónde sale? Niaaananiaaaaaa… De los mercados, querida amiga o amigo. Su valor está fijado por la oferta y la demanda o, dicho de otra forma, de lo chulo que parezca el país para invertir en él. Mejor que te enteres por mí ahora mientras nos tomamos esta caña que por un susto en un mal momento ¿No te parece?

Te cuento todo este rollo porque vengo a hablarte de las criptomonedas, concretamente del Bitcoin, la pionera, y no quiero que pierdas el interés cuando diga que es un dinero virtual, porque, como acabo de contar, el dinero «normal» también lo es. No tienes excusa para dejar de prestar atención.

Bitcoin es una criptomoneda, inventada por alguien tras el alias Satoshi Nakamoto y publicada en un paper sencillo, claro y conciso en 20091, con el objetivo de crear un dinero en metálico nuevo que no estuviera regulado por ninguna entidad central como un banco.

A parte de la propia criptomoneda también es la infraestructura diseñada para que esta moneda pueda funcionar. Bitcoin es una red peer-to-peer, es decir, no tiene servidores centrales. Está formada por un montón de equipos (7808, ahora mismo2) conectados a Internet hablando entre ellos y gestionando el dinero de todos los usuarios, actualmente 41,368,110,726 USD 3. Una pasta gansa.

Primero te cuento cómo funciona a nivel general y luego nos metemos en… la ciencia.

Le quieres pagar a tu colega una deuda que tienes por cosas que no vamos a desvelar ahora así que abres una aplicación que sirve como cartera e introduces el importe que quieres mandar y la dirección de tu colega, a la que quieres mandarlo. La aplicación añade un poco más para pagar las tasas. A tu colega le llega la pasta menos las tasas que van a parar a uno de los nodos que he mencionado antes. Ya está.

Bitcoin funciona con un libro de cuentas o libro mayor (en inglés ledger, ¡aprende la jerga!), como el de un banco, donde se guardan todas las transacciones que se realizan. Todo el mundo puede ver ese libro mayor4.

El libro mayor tiene registros que, resumiendo y simplificando, tienen una dirección de destino, una de origen y la cantidad. Para saber cuanto dinero tiene cada dirección, basta con sumar todas las entradas y restar todas las salidas a ésta. Punto.

La magia empieza con qué es una dirección. Las direcciones son un número, como una cuenta bancaria, que normalmente se representan usando Base58, un sistema de representación inventado para Bitcoin a partir de Base64, una codificación para representar datos binarios en texto. Base58 hace que la dirección sea fácil de copiar a mano evitando caracteres como la I mayúscula y la L minúscula, entre otros. Tienen esta pinta:

 19ufsc9Q72HJrhmkZNUQC6G7PjEJX5dpNk

A nivel de información, ese número tiene 20bytes, lo que resultaría en un número gigantesco, por eso se representa así.

Pero no te he explicado de dónde viene. Antes tengo que explicar un concepto, que es el que hace que Bitcoin sea una criptomoneda: criptomoneda = criptografía + moneda.

Bitcoin, como casi todo Internet, usa parejas de claves pública-privada, AKA criptografía asimétrica5. Que básicamente son una pareja de números muy grandes con unas propiedades muy jodidas entre ellos: lo que se encripta con uno, sólo puede ser desencriptado con el otro.

Estos números se generan de forma que no se repitan nunca las parejas (aleatoriedad y caos, ¡cómo me gusta!) y la gracia está en que guardes la clave privada para ti y la otra la repartas. Así hacemos magia con esas propiedades chungas y conseguimos esto:

  • Cuando encripto con mi clave privada, quien lo desencripte sabrá que lo encripté yo, y que sólo yo puedo encriptarlo. Es como firmar el mensaje.
  • Cuando me quieran mandar un mensaje privado, encriptándolo con la clave pública se asegurarán de que sólo yo puedo leerlo, porque soy el único que posee la clave privada.

Ya sé que es chungo comérselo así, pero recuerda aquella vez que te relacionaron con ese atraco en Harlem porque el arma que usaste para disparar a tu cuñado se la habías comprado a un tío implicado. Eso pasó porque la policía, aunque nunca hallaran la pistola, tenía las balas. Las balas tenían unas marcas que sólo tu pistola hace. Esto es un poco parecido.

Las direcciones se obtienen desde la clave pública. Así que cuando te generes tus claves, se generará una dirección asociada a la que te podrán mandar pagos.

Cuando vas a hacer un pago en Bitcoin, tu clave privada, que sólo tú conoces y debes guardar bien, hasta escrita en un papel por si acaso, se utiliza para asegurar que has sido tú el que ha decidido mandar el dinero. Firmas tu transacción.

Cada usuario puede utilizar un número infinito de direcciones. De hecho, se recomienda que se genere una por transacción si lo que se busca es anonimidad. De esta forma, las relaciones entre direcciones son imposibles de descubrir y no se puede saber realmente cuanto dinero tiene cada persona si ésta no quiere que se sepa.

Todo este rollo de las direcciones se hace internamente en un programa conocido como wallet (cartera en inglés), el intermediario que le pide a la red que haga las transacciones. Hay muchas implementaciones diferentes pero, como tu clave es lo único que necesitas, la cartera que utilices da igual y puedes cambiar de una a otra. En realidad la cartera no guarda tu dinero, eso está en el libro de cuentas, pero te da acceso a él.

Si todavía no te he quemado el cerebro, espérate a esto: al no tener una entidad central, Bitcoin necesita de algo que haga las veces de mediador y que se asegure de que la gente no gaste el mismo dinero dos veces (double-spend en la jerga). El cómo se accede al libro de cuentas es lo que solventa este problema, junto con otro par de detalles.

El libro de cuentas es una base de datos muy especial conocida como Blockchain (cadena de bloques en inglés). También definida por Satoshi, la Blockchain es una bestia que sólo crece, inexorable. Las transacciones son irreversibles y nunca se borran. Es una base de datos escrita en la roca.

Los nodos de la red guardan una copia, que ahora ya supera los 100GB de datos, y se encargan de alimentarla con las nuevas transacciones que van realizándose. Como todos tienen una copia, si un nodo se desconecta y vuelve más tarde, descargará de otro nodo los cambios ocurridos mientras estaba ausente y seguirá con ello. Tolerancia a fallos: nivel avanzado.

A medida que van llegando nuevas transacciones los nodos las almacenan y las agrupan en grupos conocidos como bloques que son lo que se añade a la Blockchain y es de donde viene su nombre. Cada bloque tiene un identificador y también hace referencia a cuál es el bloque anterior a él en la cadena. Así es como crece.

Para poder añadir bloques a la Blockchain los nodos deben pasar una prueba antes, conocida como proof-of-work, para demostrar que tienen buenas intenciones. Si lo pasan y su bloque es aceptado reciben dinero. Ahora entiendes por qué hay nodos, ¿verdad? En realidad, no todos hacen eso, algunos sólo se dedican a comprobar que las transacciones son correctas y han pasado la prueba.

Los nodos que insertan transacciones se llaman miners (minero en inglés) porque cuando terminan, crean nuevos Bitcoins para sí mismos, como si los sacasen de una mina, a modo de incentivo. El premio recibido también incluye las tasas que se le cobran al usuario. La cantidad del premio se irá reduciendo hasta llegar a una cifra total de Bitcoins en circulación, punto a partir del que los miners sólo ganarán las tasas de transacción, pero se entiende que habrá muchísimas transacciones y les seguirá mereciendo la pena. Hoy en día el premio está en 12.5 Bitcoins, unos 25.000€.

Eso del proof-of-work es una especie de sudoku. La dificultad de la prueba se ajusta automáticamente pretendiendo que se tarde como 10 minutos en resolver.

¡Criptografía de nuevo!

Los bloques tienen un apartado que guarda un número especial llamado nonce. El proof-of-work consiste en encontrar un nonce para el que el hash del bloque completo empiece por una cantidad de ceros definida por la dificultad. El hash es un número que se obtiene tras aplicar una operación matemática a unos datos, en este caso al propio bloque. Viendo unos datos a primera vista no se puede saber qué hash tendrán y tampoco es posible cambiar unos datos y saber cómo afectará eso a su respectivo hash. Por eso, para encontrar el nonce adecuado sólo se pueden probar y probar números a fuerza bruta.

Este es el hash del bloque número 475499 y el nonce que se encontró:

hash:
  00000000000000000021a99d45d7459fe380f0675776ab470f6dcba0bce67820
nonce:
  475499

Como ves, contar el número de ceros del hash y comprobar que el bloque, con su nonce, cumple la condición es simple, con aplicar la función de hash es suficiente. Mientras que encontrar el nonce lleva un montón de iteraciones porque se hace a lo bestia.

Igual que con un sudoku, es fácil de comprobar que está bien pero es difícil de hacer si no tienes práctica.

Piensa en algo igual pero para evitar que tu cuñao te de la chapa en el email. Le dices: «cuando me quieras mandar un email te mandaré un sudoku y me lo tienes que devolver resuelto para que lo abra». Si el cabrón coge callo y te los resuelve rápido, le haces que resuelva uno más grande. Así te aseguras que no te manda emails a lo tonto porque no le sale rentable el esfuerzo.

Magia pura. Aplícaselo a tu cuñado.

El proceso completo resumido es que las transacciones generadas por la cartera se mandan a los nodos a los que la cartera se conecte y éstos las extienden por toda la red. Los nodos las agrupan en un bloque e intentan pasar la prueba simultáneamente, intentando ser los primeros en pasarla para que sea su bloque el elegido. Cuando la resuelven, envían el bloque al resto. Los otros nodos aceptan el bloque si todas sus transacciones son correctas y no se han gastado antes. Si a los nodos les mola el bloque, lo hacen saber añadiendo los próximos bloques detrás de éste en el Blockchain como he explicado antes y el nodo acertante se lleva el premio.

Pero no te he contado que la Blockchain no sólo crece de forma lineal, se separa como un árbol con diferentes opciones. Diferentes realidades.

Bitcoin tolera fallos en la red, que las transacciones no se extiendan completamente y que se pierdan mensajes. Es muy potente. Imaginad que porque se ha perdido una transacción, por un error en la red, los nodos hacen bloques distintos: algunos nodos tendrían un Blockchain y otros tendrán otro diferente. Eso no es problema, el Blockchain crece en forma de árbol, guardando ramas diferentes pero siempre considerando como válida la más larga. Si por un casual, un nodo se actualizase con una copia con una rama más larga, descartaría su línea de trabajo y continuaría esa. Los nodos siempre guardan las ramas para asegurarse de no perder nada. Tolerancia a fallos: nivel ninja.

Esto es una locura porque las transacciones nunca se consideran reales del todo. ¡Siempre puede llegar una rama más larga! Pero en la práctica sí que vale, porque es muy difícil que un bloque con varios bloques encima se descarte por otro. Para que esto ocurriera, la mayor parte de la red tendría que estar en desacuerdo y éste resolverse en la dirección opuesta a la que se va.

El sistema de bloques solventa el problema del double-spend que te he contado antes. Sirve para sólo tener una versión de la base de datos, una versión del resumen de cuentas. Como todos los bloques van en orden, las transacciones también, así que, si un bloque tiene una transacción que gasta unos fondos que han sido gastados anteriormente, las transacciones anteriores tienen que estar en los bloques antiguos, por obligación. Si esto pasa el bloque es descartado. Los bloques ordenados sellan temporalmente las transacciones.

El sistema de árboles es más complejo. Si por un casual, un atacante malicioso fuese capaz de reunir capacidad de computación suficiente para ser el primero en sacar bloques (¡recuerda el proof-of-work!), tendría que hacerlo a un ritmo mayor que el resto de la red completa para que su rama del árbol fuera siempre la más larga y forzar que se aceptase, ya que los nodos honestos nunca aceptarán un bloque incorrecto por sí mismos y seguirán trabajando en la cadena que les parece la correcta. Incluso si lo consiguiera, no podría robar dinero a otros, sólo podría gastar dos veces dinero propio (¡recuerda las claves!). Demasiados problemas. Teniendo un sistema de incentivos, con tanta potencia de computación se haría rico en cuestión de tiempo sin esfuerzo. No le merecería la pena ser malo.

Recopilando…

  • Criptografía para firmar transacciones que hace imposible robar.
  • Un libro de cuentas que sólo crece y está replicado en todos los nodos por si acaso.
  • Bloques ordenados que sellan en el tiempo y crean consenso forzando a los nodos a pasar una prueba y eligiendo la cadena más popular.
  • Competencia basada en el trabajo que asegura que mientras la mayor parte de la red sea honesta la información lo sea.
  • Sistema de incentivos que consigue que si alguien se hace con capacidad de computación como para corromper la red y hacer dobles gastos no merezca la pena hacerlo y sea más rentable ser honesto.

En fin, y así es cómo se resuelve el problema de los generales Bizantinos 6.

Ahora dime que te fías más de tu banco o de unos billetes que se puede llevar el viento.

Pagas tú esta ronda.


  1. Venga, echa un ojo, ¡está traducido al español!https://bitcoin.org/files/bitcoin-paper/bitcoin_es.pdf
  2. Referencia:https://bitnodes.21.co/
  3. Referencia:https://bitcoincharts.com/bitcoin/
  4. Tú también puedes. Aquí, por ejemplo:https://blockchain.info/blocks
  5. La wikipedia en español lo explica de puta madre:https://es.wikipedia.org/wiki/Criptograf%C3%ADa_asim%C3%A9trica
  6. De nuevo la wikipedia es oro puro:https://es.wikipedia.org/wiki/Problema_de_los_generales_bizantinos

 

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.