Internet ha transformado muchas cosas, y una de ellas es nuestra forma de ver el dinero. Ha pasado de ser algo físico a ser un bien intangible, un número en una página. Sabemos que está ahí porque confiamos en la autoridad de los bancos, creemos en su valor porque sabemos que las entidades lo gestionan como si fuese dinero físico y tangible, sin que podamos sacarlo del aire.
Sin embargo, con Bitcoin, la moneda P2P en auge, el asunto es diferente. No hay entidades en las que confiemos. No hay un banco que nos asegure "este dinero es _real_". En su lugar, la validez de Bitcoin reside en su tecnología, en todas las técnicas que aseguran que funciona como si fuese una moneda real.
Vamos a explicaros en qué consiste esa tecnología. Es un tema considerablemente complejo, así que primero dibujaremos un esquema simplificado de cómo funciona y después iremos entrando en los detalles, que en realidad son lo más importante y lo que asegura la validez de Bitcoin.
Conceptos previos
Ya he dicho que la tecnología de Bitcoin es muy compleja, y vamos a utilizar algunos términos técnicos como _hash_ o _firma digital_. Antes de empezar, vamos a ver en qué consisten para que podáis entender sin problemas de lo que vamos a hablar. Si ya conocéis estos términos, podéis pasar a la siguiente sección.
- Hash. Un hash de un objeto (una cadena de texto, un número o cualquier cosa que se pueda representar en bits) es el equivalente de nuestra huella dactilar. Es una identificación única y constante. Dos objetos distintos tienen (teóricamente) _hashes_ distintos. Además, tiene la peculiaridad de que es una función "de una vía". Es decir, si tienes el objeto es muy fácil obtener su _hash_. Sin embargo, si tienes el _hash_ es extremadamente difícil obtener el objeto original del que proviene. En el caso de Bitcoin, el algoritmo es SHA256.
- Firma digital. Se trata de un proceso que permite a cualquiera verificar la originalidad de un objeto. De forma similar a cuando pones tu firma en un documento, la firma digital certifica que eres tú quien ha creado, verificado, o aceptado ese objeto. Para ello se usan dos claves, una pública y una privada. La clave privada se "combina" con el mensaje a firmar y se obtiene la firma. Después, para verificar la firma se "combina" la clave pública del firmante con la firma, que debería dar como resultado el mensaje original. Bitcoin utiliza ECDSA, firma digital de curva elíptica, también un algoritmo muy seguro.
Transacciones y bloques, los pilares de Bitcoin
Bitcoin se basa en dos pilares fundamentales: uno es la transacción, y otro el bloque. La transacción es, como ya habréis imaginado, el envío de bitcoins de un usuario a otro.
Una transacción tiene entradas y salidas: de donde viene el dinero y a dónde va. Su ID (identificación) es un _hash_ combinado del ID de las entradas y del ID del destinatario (su clave pública). Así se fija de forma inequívoca quién es el destinatario y de dónde han salido las monedas. Después, ese ID se firma con la clave privada del emisor de la transferencia, quedando certificado que el dinero lo ha transferido su propietario.
Las transferencias se agrupan en bloques. Cada bloque tiene, además, un sello de tiempo, un número de verificación (veremos más tarde en qué consiste) y el ID del bloque anterior. De esta forma, se genera una cadena de bloques, que contiene toda la historia de transferencias de bitcoins.
Los bloques los generan los _miners_, y antes de crearlos verifican la validez de todas las transferencias (es decir, que un usuario no haya gastado dinero que ya había transferido). Una transferencia que se ha quedado fuera de la cadena de bloques no es válida, y del mismo modo una transferencia dentro de la cadena se considera válida sin más operaciones.
Cuando un nodo genera un bloque, lo emite al resto de nodos. Estos verifican que el bloque esté construido correctamente y que sus transferencias sean válidas. Si no hay ningún problema, empezarán a trabajar con ese nuevo bloque como el final de la cadena.
Es posible que en un momento dado haya dos ramas de la cadena: un nodo ha emitido un bloque y en el mismo momento otro nodo ha emitido otro bloque distinto. En este caso, se conservan las dos ramas hasta que una de ellas sea más larga: esta será la que se mantenga, y la otra se desechará.
La creación de la cadena de bloques: proof-of-work
El enfoque de arriba no tendría ningún problema si todos los nodos que están creando bloques fuesen honestos. Pero todos sabemos que eso es imposible. Tal y como hemos explicado la creación de bloques, un nodo malicioso podría crear un bloque con una transferencia inválida (con dinero que se ha gastado dos veces) y después generar más bloques de forma masiva.
Al generar bloques válidos rápidamente, la transferencia inválida queda enterrada en la cadena. Cuando el resto de los nodos reciban esta cadena, que será la más larga de todo el entorno, verificarán como mucho los últimos bloques, darán la rama como válida y esa transacción inválida pasará desapercibida.
Por lo tanto, hay que implementar un método que evite que se puedan generar bloques de forma indiscriminada, algo que obligue a los nodos a invertir tiempo en generar el bloque. Esto se conoce como _proof-of-work_.
El trabajo consiste en encontrar el _nonce_, el número de verificación que comentábamos antes, de tal forma que el _hash_ del bloque sea menor que un determinado valor (valor _target_ o objetivo). La búsqueda de ese número es prueba y error: empezamos en cero y calculamos el _hash_. Si es menor que el objetivo, perfecto, lo hemos encontrado. Si no, aumentamos en uno el _nonce_ y volvemos a verificar. Para que os hagáis una idea del trabajo necesario, con el _target_ actual la probabilidad de encontrar un _nonce_ válido es de uno entre 2 por 10 elevado a 16 (un dos seguido de dieciséis ceros).
El valor objetivo se elige de tal forma que se tarde unos 10 minutos en generar un bloque. Para que este tiempo se mantenga ajustado se recalcula cada 2016 bloques: los nodos cogen el tiempo que se ha tardado en generar esos bloques y lo comparan con el tiempo teórico que tendrían que haber tardado (aproximadamente 2 semanas) y se reajusta el objetivo. Así, se consigue que el tiempo de generación de un bloque se mantenga estable a lo largo del tiempo independientemente de la capacidad de proceso de los nodos.
Esos 10 minutos que se tarda en verificar cada bloque son la barrera que impide a los atacantes tomar el control de Bitcoin. De esta forma, no pueden generar bloques rápidamente para ocultar transacciones y gastar dinero dos veces.
¿Cómo almacenamos toda la historia de transacciones?
Siguiente problema con el que nos encontramos en Bitcoin: el espacio de almacenamiento. ¿Cómo podemos guardar toda la cadena de bloques (que es considerablemente larga) sin desperdiciar espacio en disco?
Recordemos que, para verificar una transacción, tenemos que comprobar que las entradas de monedas ya han sido verificadas. Normalmente, los clientes verifican varias transacciones atrás y consideran que el resto son válidas.
Es decir, que necesitamos una forma de guardar las transacciones y comprobar que están en los bloques. Como decíamos antes, cada bloque contiene el hash combinado de las transferencias: verificarlo entonces es tan simple como coger el hash de la transferencia a verificar, combinarla con el resto de hashes de las transferencias del bloque y comprobar que tenemos la misma salida.
Pero este enfoque tiene un problema: mantenemos muchas transferencias que no nos sirven para nada. Por ejemplo, supongamos que, en un bloque, se ha gastado y verificado el dinero de todas las transferencias menos una. No vamos a necesitar el resto para verificar nada porque no vamos a llegar a tanta profundidad en la cadena. Sin embargo, tenemos que mantenerlas para que al verificar esa transferencia que no ha sido gastada, el hash siga siendo el mismo.
La solución es usar un árbol de _hashes_ o un árbol Merkle. Los hashes de las transferencias se van combinando dos a dos en forma de árbol binario (cada nodo tiene dos hijos), como veis en la figura. Así, cuando no necesitamos dos hermanos (dos nodos que comparten el mismo padre), podemos borrarlos y quedarnos con el nodo padre sin perder la posibilidad de verificar el resto de nodos del árbol. Esto reduce considerablemente el espacio necesario para almacenar toda la historia, y de hecho nos permite quedarnos sólo con las transferencias más recientes y olvidarnos del resto.
Mining: la generación de monedas
Bitcoin es una moneda sin una entidad central que controle la inflación ni la introducción de más dinero en el mercado. Por lo tanto, de nuevo hay que confiar en la técnica para controlar este aspecto: es el _mining_ de monedas.
Cuando un nodo crea un bloque, además de todas las transferencias que haya verificado incluye otra más: una transferencia sin entradas. Cada vez que se verifica un bloque, se introducen nuevas monedas en el sistema. La tasa a la que se liberan nuevas bitcoins está controlada de tal forma que cada 4 años se reduce en el 50%. Así, está calculado que el número de bitcoins en circulación nunca pasará de los 21 millones.
Esto es un incentivo para los nodos de la red: cuantos más bloques verifiquen, más bitcoins ganan. Además, este enfoque hace en muchos casos más rentable ser un nodo honesto que malicioso (un nodo que permite el doble gasto de bitcoins). Además, permite controlar el aspecto de "escasez" que planteaba ayer Alejandro como requisito para considerar a Bitcoin como una moneda.
En resumen, Bitcoin cuenta con una tecnología considerablemente compleja detrás, y que garantiza que se pueda usar como moneda: sin que cualquiera pueda crear dinero por las buenas, asegurando que sólo puedes gastar tu dinero una vez y no reutilizarlo, y controlando la introducción de nuevas monedas en el mercado. Además, al basarse en tecnologías seguras (SHA256, ECDSA) parece difícil (tampoco me atrevería a asegurar nada en ningún sentido) que sea vulnerable.
Ver 54 comentarios