Consenso

14 febrero 201729 mayo 2017

Este nuevo anexo sobre el consenso, con el que pretendemos ampliar y consolidar los conocimientos adquiridos por los lectores del libro, también se lo tenemos que agradecer al brillante trabajo de Jaime Núñez Miller, socio fundador de Bankabit y de Zentank, veterano de la comunidad Bitcoin y responsable del capítulo “Criptografía y consenso aplicado a la blockchain”. Como bien sabemos, el término consenso es inherente a la tecnología blockchain pero ¿cómo lo logramos? ¿cómo funcionan los sofisticados mecanismos que lo hacen posible? ¿pueden surgir nuevas propuestas mejoradas en este ámbito concreto? Como nos explica Jaime, las constantes propuestas innovadoras del universo blockchain tampoco escapan a las reglas del consenso.

***

La innovación en el terreno de las blockchains no ha sido exclusivamente de tipo técnica. También se han propuesto mejoras para reemplazar las pruebas de trabajo basadas en SHA256, pero también se han diseñado y puesto en marcha blockchains alternativas que exploran distintos aspectos sociales y económicos. Algunas como Ethereum se orientan a la ejecución de contratos complejos, otras a los mercados de valores o de predicciones y otras como Monero o Dash a la privacidad. En todas ellas se necesita definir la forma en la que se establece un consenso sobre el estado de la blockchain.

Para poder llegar a un consenso en un sistema descentralizado de tipo blockchain se necesita conocer con anterioridad cuáles serán las reglas de consenso, es decir, las que deberán cumplir los bloques para ser admitidos en una cadena. En este punto sería interesante recordar el anexo que hemos escrito sobre el dilema de los generales Bizantinos.

Los nodos que forman la red son los responsables de actualizar la blockchain y son ellos quienes verifican los bloques antes de incorporarlos a la cadena.  Los mineros por su lado son los encargados de crear los bloques y por tanto quienes ostentan el poder último para decidir cuál es la cadena legítima en caso de discrepancia.

En el caso de las blockchains públicas cualquiera puede ser minero y bastará con reunir los requisitos y recursos necesarios. En las blockchains privadas en cambio el consenso depende de las instituciones participantes, que actuarán como partes de un contrato privado que es el que en última instancia regula las relaciones entre ellos.

El consenso en cadenas públicas es en donde encontramos un cambio de paradigma capaz de transformar todo aquello que conocemos hasta el momento. Como en el consenso descentralizado no existe ninguna autoridad a la que recurrir, son las propias reglas del juego las que deben incorporar los incentivos necesarios para lograr que a las partes les compense actuar de forma honesta. Mejor dicho, hay que partir de la presunción de que los participantes en la red no se comportarán de forma “honesta” y tomarán sus decisiones pensando únicamente en maximizar su rentabilidad. Si los incentivos están bien planteados, será su propio interés quien les lleve a actuar de forma honesta. Este principio tiene su base en la teoría de juegos y en el equilibro de Nash, y es la clave para la estabilidad de todo el sistema. Cualquier cambio que se realice en las reglas de consenso y concretamente en aquellos que establecen los incentivos es por tanto sumamente delicado.

En una blockchain privada no se requiere un consenso mayoritario y basta con que intervengan exclusivamente las partes intervinientes con arreglo al estatuto o contrato que hubieran firmado. En una blockchain de consenso descentralizado todos los cambios requieren la aceptación de la mayoría, y en consecuencia se necesita un protocolo que defina en qué consiste esa mayoría. Para ello se utilizan principalmente dos tipos de algoritmos:

 

  1. Pruebas de trabajo (Proof of Work), en donde tienen más voto los que realizan una mayor cantidad de trabajo. Es el sistema que ya hemos visto en hashcash y el principal mecanismo de consenso en las blockchains públicas más conocidas como Bitcoin y Ethereum.
  2. Pruebas de participación (Proof of Stake) , en donde tienen más voto quienes poseen un mayor porcentaje de los tokens emitidos. Se utiliza por Nxtcoin, Peercoin, Bitshares o otras criptomonedas.

 

Pruebas de trabajo (Proof of Work)

Para entender las reglas de consenso basadas en pruebas de trabajo recurrimos a algoritmos como hashcash que surgieron como una medida de tipo económico para evitar el spam. Como ya hemos visto en su correspondiente anexo, Hascash exigía al usuario incurrir en un coste (tiempo de proceso) para poder enviar un correo. El correo debía llevar una prueba de ese trabajo. Pero ¿por qué no utilizar esas mismas pruebas de trabajo también para otros servicios online? Esta es la pregunta que debió hacerse el criptógrafo norteamericano Hal Finney cuando comenzó a desarrollar su sistema de pruebas de trabajo reutilizables (RPOW, Reusable Proof of Work). La idea de Finney radicaba en que los usuarios pudieran generar tokens universales (“fichas” o “claves” en formato digital)  y utilizarlos luego para consumir también otro tipo de servicios, y no sólo el correo electrónico. Una ventaja adicional sería poder acumular esos tokens para usarlos más tarde o vendérselos a otros. Los proveedores seguirían sin ganar “dinero real” con ello pero sí que evitarían los abusos en su servicio.

Esas pruebas de trabajo reutilizables y universales es lo que hoy día llamamos criptomonedas.

La idea era buena, pero viable sólo si esos tokens eran capaces de conservar su valor en el tiempo, o dicho de otra manera, si no se podían falsificar. Finney andaba resolviendo algunos flecos con la seguridad de sus tokens cuando a finales de 2008 alguien con el alias Satoshi Nakamoto propuso un sistema llamado Bitcoin. El protocolo Bitcoin resolvía varios de esos problemas mediante una red descentralizada de tipo P2P (Peer to Peer) en conjunción con hashcash.

Bitcoin en el fondo no es más que un registro inmutable con la historia de todos los tokens desde su creación inicial. Sería algo parecido a esto:

 

Movimientos del token Propietario del token
1.Creación del token por Usuario A
2.Transferencia a Usuario B
3.Transferencia a Usuario C
4.etc.

En vez de usuarios con una identidad física el sistema utilizaría claves digitales, claves asimétricas (pública y privada) creadas por los propios usuarios. En el cuadro de arriba sustituiríamos “Usuario A” por “Clave A”, “Usuario B” por “Clave B”, etc.. Esas claves son las que luego permiten hacer transacciones mediante un sencillo sistema de firma electrónica.  Como el historial de todas las transacciones es público se facilita que cualquiera pueda verificar tanto el origen válido o legítimo de cada token como el cumplimiento de las normas, de la misma forma que en un campeonato de ajedrez todos pueden verificar que los jugadores mueven las fichas correctamente.

En una cadena de bloques basada en pruebas de trabajo se podrían crear situaciones de conflicto en las reglas de consenso por ejemplo cuando alguien con suficiente potencia de minado quisiera atacar la red modificando las reglas de forma hostil, es decir, sin antes alcanzar un consenso, o cuando una actualización del protocolo produzca un cambio imprevisto en esas reglas de consenso.

En cualquiera de estos casos los usuarios de la red se podrían llegar a encontrar con dos registros (blockchains) distintos. ¿Cómo determinamos entonces cuál de ellos es la blockchain “real”, la respaldada por la mayoría? Como ya vimos antes, la solución de Satoshi consistía en crear una cadena de hashes para acumular pruebas de trabajo. La blockchain más votada será aquella que tenga acumulada un mayor número de pruebas de trabajo.

Veamos un ejemplo. En este gráfico vemos las tres funciones básicas de la red Bitcoin.

Los nodos son los encargados de validar los bloques y las transacciones, y de actualizar la blockchain. Hay que tener en cuenta que en muchos casos se habla de nodos refiriéndose también a los mineros, pero las funciones son distintas.

Los wallets generan las transacciones, las firman y las envían a los nodos para ser validadas y puestas en una lista de espera (mempool) a disposición de los mineros.

Los mineros generan los bloques de la cadena. Para ello obtienen el merkle tree de las transacciones que quieran escoger entre aquellas que se ya se encuentran en la lista de espera. El root hash de ese árbol de merkle lo usan como parte del mensaje a hashear con un algoritmo de prueba de trabajo tipo hashcash. El minero que logra encontrar el hash válido se lo comunica a los demás nodos, que lo verifican y actualizan la blockchain. Sólo entonces los mineros reinician sus procesos y comienzan a generar el siguiente bloque incentivados por los nuevos bitcoins que obtendrán si logran dar con el hash requerido por el nivel de dificultad.

En caso de encontrarnos con dos cadenas, la “real” será la más larga, la respaldada o votada por la mayoría al igual que en el supuesto de los generales Bizantinos en el dilema resuelto por Satoshi.

Mientras los mineros honestos mantengan la mayor parte de la capacidad de proceso (hashrate), su cadena crecerá más rápido que cualquier otra. Si un atacante llegara a tener más potencia que todos los demás juntos, podría cambiar las reglas de forma unilateral, pero en ese mismo momento o probablemente mucho antes, el sistema se devaluará hasta el punto en el que dicho ataque no sea rentable. Los inversores habrán abandonado el sistema hasta que la situación se solucione.

Los mineros son quienes obtienen las pruebas de trabajo y por tanto los únicos con “derecho” a voto. Es su potencia de cálculo y el gasto que realizan para obtenerla la que les otorga ese derecho. Pero los mineros no están sólos en la red, dependen también de los nodos para validar las transacciones de los usuarios y mantener la blockchain. Los usuarios por su lado son quienes dan valor al servicio y por tanto quienes ponen precio a los tokens. Todos ellos son esenciales y todos tienen sus propias estrategias en el juego. Es comprensible que los cambios en el protocolo provoquen bastante preocupación, pues alguno de esos cambios podría, voluntaria o involuntariamente por ejemplo, desequilibrar el sistema, llevar a una mayor centralización o perjudicar la privacidad de los usuarios.

Supongamos que una actualización en las reglas provoca la bifurcación de la cadena. Durante un tiempo coexistirían dos blockchains esperando a que los mineros se decidieran por una de ellas. Sabemos que esa elección la harán pensando en la mejor estrategia para sus propios intereses económicos y por tanto minarán en la cadena que contenga los tokens más valiosos. Como el valor de los tokens no lo determinan los mineros, sino el mercado, los usuarios y los inversores tienen también la posibilidad de influir en la decisión que tomen los mineros. Basta con que algunos inversores vendan los tokens de una cadena para adquirir los de la otra para ejercer una influencia decisiva.

Por otro lado están también los desarrolladores que tampoco tienen voto y sin embargo todos reconocen que su capacidad para enfocar y abordar ciertos problemas es determinante a la hora de decidirse por una opción u otra . Aunque cualquiera puede hacer un fork del código e iniciar una nueva cadena, es obvio que no llegaría muy lejos sin el respaldo de un reputado grupo de desarrolladores.

En definitiva, un cambio en el protocolo sólo se llega a proponer si tiene de antemano el apoyo de una gran mayoría y especialmente el de los usuarios inversores. Llegados a ese punto, son los desarrolladores quienes publicarán una actualización del software incorporando las nuevas reglas. Esas reglas que no se aplican de forma inmediata. En el propio código se agrega un sistema de activación automática para cuando se alcance un determinado porcentaje de aceptación.  La aceptación se mide por la cantidad de mineros que han adoptado el nuevo software y ese porcentaje se fija por los desarrolladores en función del tipo de modificación que se haya realizado. Cuanto más conflictivo sea el cambio, mayor deberá ser ese porcentaje.

El nivel de difusión se puede observar en la red a medida que los nodos se actualizan, por lo que una vez que se alcance el porcentaje requerido y ese porcentaje se mantenga durante un tiempo predeterminado, las nuevas reglas se activarán de forma automática .

Las propuestas de mejoras en el protocolo Bitcoin se suelen presentar a la comunidad en documentos llamados Bitcoin Improvement Proposals (BIP) y están numerados secuencialmente. La comunidad discute entonces la viabilidad y la conveniencia de cada propuesta y si conviene implementarla. Los debates son públicos y se llevan a cabo en foros online y en conferencias.

Por la forma en la que impactan la red se distinguen dos tipos de cambios en las reglas: los que se hacen con un softfork y los que implican un hardfork.  Un fork (bifurcación o escisión) es un término hace referencia a un proyecto de software que se divide en dos cuando surgen diferencias incompatibles e irreconciliables. En la práctica consiste en que habrá dos copias similares del software que comienzan a desarrollarse de forma independiente a partir de la bifurcación. Los términos softfork hardfork en el ámbito de Bitcoin se refiere en ambos casos a cambios en el código que producen algún tipo de incompatibilidad y por tanto una nueva cadena.

Softfork

Es una escisión temporal de la cadena que se produce por la activación de reglas más restrictivas. El nuevo software valida parte de los bloques creados con el software antiguo e ignora el resto. Los nodos antiguos seguirán validando todos los bloques. Los mineros que trabajan con nodos sin actualizar estarán construyendo una cadena más débil. En este caso lo que importa es que los mineros actualizados sean mayoría.

Este tipo de fork no es problemático. Como hemos visto, los cambios se activan cuando ya está aceptado por una mayoría de mineros y los incentivos juegan a favor de una rápida adopción por parte del resto. Pero si se diera el caso de una activación prematura sin contar con la mayoría, el fork se comportaría como un hardfork y se crearían dos cadenas en conflicto.

Hardfork

Se trata de una bifurcación definitiva de la cadena que se produce por cualquier relajación en las reglas que haga válidos algunos bloques que en la versión anterior serían rechazados.

Los nodos actualizados validarán todos bloques, pero quienes no hayan aceptado los cambios no podrán validar los nuevos bloques. Por tanto, a diferencia del softfork, se requiere que todos los nodos, y no sólo los mineros,  se actualicen. Este tipo de fork debe evitarse siempre que se pueda, pues crearía dos cadenas válidas excluyentes entre sí. Para realizar con éxito un hardfork hace falta que todos los usuarios, nodos y mineros se hayan actualizado antes.

Proof of Work en Ethereum y otras blockchains

Bitcoin implementa un algoritmo de tipo hashcash que consiste en encontrar un hash SHA256 de una determinada dificultad.  Como cabía esperar, la fuerte competencia ha impulsado el desarrollo de procesadores específicos de tipo ASIC (acrónimo de Circuito Integrado para Aplicaciones Específicas o Application-Specific Integrated Circuit en inglés), que sirven para optimizar esta función y realizar cálculos más rápidamente. En la actualidad uno sólo de estos procesadores es capaz de obtener más de mil millones de hashes por segundo.

El riesgo con las pruebas de trabajo es que un pequeño grupo de fabricantes de hardware y de mineros pudieran llegar a tener una parte significativa del poder de computación de la red y llegar a controlarla. Si algún día se diera ese caso, la comunidad cambiaría el algoritmo de consenso mediante un hardfork con el objetivo de inhabilitar a los mineros hostiles.

Ethereum es una plataforma que ha implementado un sistema de consenso distinto con la idea de evitar ese riesgo. Su algoritmo también se basa en pruebas de trabajo como en Bitcoin, pero está modificado para evitar el uso de procesadores ASIC, procesadores que resultan caros de fabricar y que por tanto favorecen la centralización.  El algoritmo usado ahora por Ethereum (Ethash) hace uso de una propiedad llamada en inglés “memory hardness” que provoca que el rendimiento del procesador dependa de la rapidez con la que puede mover datos en la memoria en lugar de por la rapidez con la que realiza operaciones de cálculo. Un experto diseñador de procesadores no podría mejorar mucho lo que ya se logra con las actuales tarjetas gráficas (GPUs) que están al alcance de cualquiera. Si alguien lograra encontrar la forma de mejorar el rendimiento de las memorias, le resultaría más rentable vender la idea a los fabricantes de tarjetas gráficas que fabricar sólo procesadores de minado. Por otro lado ya existe en la industria informática un gran interés en mejorar la velocidad de las memorias y por tanto ya se están dedicando grandes recursos y equipos a ello.

El sistema de prueba de trabajo usado por Ethereum evita parte de la centralización pero sigue sin resolver el problema del todo.  Ethereum tiene previsto cambiar a un nuevo algoritmo de tipo “Proof of Stake” (PoS) cuando se hayan resuelto algunas de las dificultades detectadas y que veremos más adelante.

Casi todos los nuevos algoritmos de pruebas de trabajo, al igual que el usado por Ethereum, intentan evitar el uso de procesadores ASIC y así reducir el coste de minado y la centralización. Algunos ejemplos de esos nuevos algoritmos los podemos ver en casos como Litecoin o Dogecoin que utilizan scrypt, el de Monero que usa cryptonight o Dash que se basa en el X11. Los primeros utilizan una estrategia propia para dificultar el uso de ASICs al igual que hace Ethash y otros como X11 encadenan hasta 11 algoritmos distintos.

Proof of Stake

Las pruebas de participación (PoS o Proof of Stake en inglés) son la principal alternativa a las pruebas de trabajo. Con las pruebas de trabajo los mineros pueden crear una cantidad de bloques proporcional a su potencia de proceso. Con las pruebas de participación, sin embargo, los bloques se crean en una proporción relativa a la cantidad de tokens que tenga cada participante. Existen dos formas de asignar un nuevo bloque a alguno de los participantes en la red:

 

  1. Selección aleatoria. El minado de cada bloque se asigna aleatoriamente por la red a cualquiera de los tokens existentes. Si el propietario de ese token está online, recogerá las transacciones y las comisiones, creará el bloque y lo enviará al resto de la red. Si no está online, la red seleccionará otro token. Con este sistema quien tenga más tokens estará más incentivado a tener su sistema online y así recibir las comisiones que de otra forma perdería. Este sistema es el que usa Nxt (Nxtcoin).
  2. Selección por antigüedad de la moneda. Con este sistema se asigna el bloque a quien haya realizado una transacción con las monedas que acumulen más tiempo desde la última vez que se transfirieron. Se utiliza por Peercoin que lo combina también con un sistema de selección aleatoria.

 

En este tipo de blockchains basadas en PoS no se suelen generar nuevos tokens por lo que la recompensa de los bloques consiste exclusivamente en las comisiones.

Las pruebas de participación ofrecen una ventaja fundamental sobre las pruebas de trabajo y es su menor coste de minado. Con PoS se usan procesadores de consumo ampliamente disponibles en el mercado que tienen un precio mucho más bajo que los ASIC utilizados en la minería Bitcoin. Esto hace que el coste de mantener la red sea menor y por tanto las comisiones a pagar por las transacciones puedan ser también menores.

Otra de las ventajas aludidas es que se reduce el riesgo de un ataque del 51% al requerir que el atacante tenga que hacerse antes con un 51% de los tokens. Sin embargo, aunque se aumenta la seguridad por un lado, también se reduce por el otro. Cualquiera que fuese capaz de negociar la posesión, aunque sólo fuera temporal, de un 51% de tokens, no necesitaría mucho más `para llevar a cabo su ataque. Por el contrario, en la red Bitcoin la adquisición de recursos para iniciar un ataque del 51% tendría un coste real enorme en tiempo y dinero.

En cualquier caso el problema más importante de los sistemas PoS puros es que no sirven para alcanzar el consenso en caso de una bifurcación de la cadena. Los mineros podrían seguir minando en ambas cadenas porque eso no les supone un gasto extraordinario, no tienen ningún incentivo para decidirse por una de ellas. En cambio minar en las dos cadenas de una bifurcación con un sistema de pruebas de trabajo sería muy perjudicial para el minero. Para mitigar este tipo de problemas la mayoría de los nuevos algoritmos de consenso PoS no son puros y resultan de una combinación de PoS y PoW.

Una de las más recientes variantes de las pruebas de participación son las pruebas de participación delegadas (DPoS o Delegated Proof of Stake en inglés). El sistema fué desarrollado para la blockchain de BitShares y algunas variantes del mismo ya se usan por otras criptomonedas. Este sistema es más eficiente que el PoS puro y permite a los pequeños wallets obtener cierto beneficio indirecto aún sin tener su equipo siempre conectado. Con DPoW los wallets pueden delegar sus derechos de participación votando a un determinado minero. Este último se quedará parte de las comisiones y el resto las destruirá aumentando por tanto el valor de todos los demás tokens que siguen en circulación. El porcentaje que se queda el minero delegado lo establecen ellos mismos y es un mecanismo para favorecer la competencia y obtener más votos. Un delegado que se quede con el 80% de las comisiones y destruya el otro 20% probablemente obtendrá más votos que uno que se quede con el 90% y sólo destruya el 20%. También puede obtener más votos si en su “programa electoral” promete dedicar los beneficios obtenidos a una tarea necesaria para la red como desarrollo, marketing, etc., o si representa a una u otra comunidad. En caso de no satisfacer a sus votantes éstos podrán retirarle el voto. Se crea de esta forma un interesante sistema de incentivación política que puede tener otras muchas aplicaciones en el futuro.