Traducción al español de Diving into Protocol Consensus
Publicado por Cardanians en su blog de Medium, el 21 de Septiembre de 2019.
Probablemente hayas oído hablar de PoW, PoS y DPoS. Son protocolos de consenso o algoritmos de consenso. En el artículo, describiré qué es exactamente el consenso, cómo se insertan las transacciones en los bloques, y cuáles son las propiedades más importantes de un consenso. Trataré de explicarlo fácilmente sin detalles profundos y sin matemáticas. Luego de la lectura de este artículo, aprenderás los principios básicos y los requisitos para llegar a un consenso dentro de un entorno distribuido.
Definición de consenso
En términos generales, la red distribuida consiste en un cierto número de nodos que tienen los mismos derechos relacionados con la creación de los datos. En el mundo de la criptografía, los datos se almacenan en un ledger (libro mayor contable distribuido). En la mayoría de los casos, el ledger es una cadena de bloques. El primer bloque de la cadena es el llamado bloque génesis. Para añadir otro bloque detrás del bloque génesis, y así cambiar el ledger, se requiere el acuerdo mutuo de los nodos de la red. El protocolo define todas las normas que deben seguirse para alcanzar el acuerdo. Si no se alcanza el acuerdo, el ledger no se modifica. Añadir un nuevo bloque siempre requiere llegar a un acuerdo sobre el bloque que se va a añadir al final de la cadena de bloques.
Una copia del ledger se encuentra en todos los nodos, y todos tienen la misma versión en un momento dado. Una vez alcanzado el acuerdo, se añade un nuevo bloque a la cadena de bloques de manera simultánea en todos los nodos. De este modo, el ledger está altamente protegido contra la manipulación. Un atacante no suele ser capaz de modificar el ledger en todos los nodos al mismo tiempo.
Ahora conoces el propósito de llegar a un consenso. Vamos a definir el consenso:
Un protocolo de consenso es un conjunto de reglas que se utilizan para tomar una decisión mutua entre partes distribuidas.
Las reglas son implementadas por los desarrolladores de los protocolos. Si un proyecto determinado es de código abierto, puedes encontrar el código fuente de dicho proyecto en GitHub. Es la denominada “implementación del protocolo”, y se construye un cliente a partir del código fuente. El cliente es una pieza de software que se instala en los nodos por sus propietarios. De este modo, los nodos pueden participar en la realización del acuerdo.
Como se mencionó anteriormente, en nuestro caso se toma la decisión sobre la adición de un nuevo bloque. Cada bloque consta de nuevas operaciones que deben ser válidas en relación con el historial de la cadena de bloques. La parte importante del acuerdo mutuo es la verificación de las transacciones en un bloque propuesto.
Reglas para la creación de un nuevo bloque
Ahora comprendes que los nodos deben estar de acuerdo en la adición de bloques. Sin embargo, no todos los nodos pueden estar de acuerdo. Imagen un nodo engañoso que estaría en desacuerdo con todos los bloques propuestos. La red nunca añadiría un nuevo bloque, por lo que no se procesaría ninguna operación. Un nuevo bloque se añade sólo cuando la mayoría de los nodos están de acuerdo con la adición. Normalmente es el 51% de los nodos en PoW o en algunos PoS (Cardano Ouroboros PoS). Es del 33% en las redes DPoS que a menudo se basan en el algoritmo “Byzantine Fault Tolerance”.
Un protocolo debe tener un conjunto de reglas dedicadas a la elección de un nodo con derecho a producir un bloque. La forma más efectiva es elegir un nodo que produzca un nuevo bloque y dejar que el resto de los nodos tomen la decisión de si el bloque será añadido a la cadena de bloques o no. Cuanto más rápida sea la selección, más rápido se podrá añadir un bloque.
Las reglas para la selección de un nodo con derecho a producir un bloque son muy diferentes en los sistemas PoW y PoS.
En PoW, hay una competencia abierta entre unos pocos grupos. Cada grupo está formado por un operador, donde todos los mineros dedican sus tasas de hash al grupo. El grupo ganador con derecho a producir un bloque se selecciona en base a la tasa de hash lograda, con un pequeño margen de aleatoriedad. Podría decirse que cuanto mayor es la tasa de hash que tiene un grupo determinado, mayor es la frecuencia con la que produce un bloque. El ganador es seleccionado aproximadamente después de 10 minutos de búsqueda. Se tarda 10 minutos en elegir un grupo de entre los aproximadamente 10 grupos más grandes existentes. No es una regla muy eficaz, sin embargo, la tasa de hash se utiliza también para la seguridad.
En PoS se pueden utilizar herramientas criptográficas más sofisticadas que son capaces de generar números aleatorios en un segundo. Por lo tanto, el nodo con derecho a producir un bloque puede encontrarse inmediatamente. Y sólo un nodo, no más.
He descrito el proceso de selección del protocolo Ouroboros PoS de Cardano, en el siguiente artículo:
La desventaja del enfoque del PoW es que la competencia dura 10 minutos. Así, sólo se añade un bloque a la cadena de bloques cada 10 minutos, lo que no es mucho y será muy difícil hacer escalable la primera capa del protocolo. Además, más nodos podrían tener éxito en la competición casi al mismo tiempo, ya que la propagación del bloque en internet lleva cierto tiempo.
Las redes P2P tienen algunas limitaciones. Mira el tiempo necesario para la transmisión de un bloque de 2Mb desde Londres vía TCP/IP:
- Paris - 0.1s
- Costa Este de EE.UU. - 1.1s
- Costa Oeste de EE.UU. - 2.5s
- Brasil - 3.0s
- Corea - 3.4s
- Australia - 5.3s
Lo que algún nodo, por ejemplo en los EE.UU., continúa y tiene éxito en la resolución de rompecabezas matemáticos en el momento en que ya se ha encontrado un bloque en China. Como resultado, se crea una bifurcación de la cadena (fork). Hay dos bloques propuestos y ambos son válidos. La adición de otros bloques eventualmente decidirá qué rama permanecerá válida (la famosa regla de la cadena más larga) y cuál será descartada (incluyendo todas las transacciones). Se propone esperar a que los siguientes 6 bloques estén absolutamente seguros de que una transacción está finalmente resuelta. La ventaja es que la adición del bloque requiere 10 minutos de trabajo, por lo que es difícil proponer un bloque fraudulento. Sin embargo, la regla “la cadena más larga gana” del PoW se refiere principalmente al poder de la tasa de hash, basando la seguridad en la suposición de que no es fácil para un individuo obtener una alta tasa de hash necesaria para el ataque. Bitcoin se descentralizó en las primeras etapas, pero hoy en día está bastante centralizada. Sucedió en pocos años gracias a los equipos mineros ASICs, y a los pools.
Los PoS/DPoS son capaces de elegir un nodo con derecho a producir un bloque en un segundo, creando un bloque rápidamente. El nodo seleccionado es capaz de producir un bloque casi inmediatamente después de saber que logró el derecho a hacerlo, y el bloque se propaga a otros nodos. Todo el consenso podría lograrse en unos pocos segundos, siendo en este caso la latencia de la red el mayor enemigo para que el proceso sea aún más rápido. Otra ventaja es que una cadena de bloques no se bifurca si todo funciona bien. Si se produce algún problema, por ejemplo con la propagación del bloque, las reglas de consenso resuelven cualquier problema rápidamente.
A menudo se dice que las redes PoS no pueden ser tan seguras como las PoW, ya que no se necesita ningún esfuerzo de cálculo para producir un bloque. Un atacante puede crear un bloque engañoso y propagarlo a otros nodos. Bueno, ¿por qué otros nodos honestos aceptarían un bloque fraudulento si no fue creado por las reglas del consenso? En el caso de Cardano, todos los nodos pueden verificar fácilmente qué nodo tiene derecho a crear un bloque en un intervalo determinado. El bloque debe contener un número especial que sólo pueda conocer el nodo que tenía derecho a producir un bloque en un intervalo determinado. El sistema basado en ciencia y matemáticas podría ser tan seguro como el PoW, y aún así ser mucho más efectivo en cuanto a escalabilidad. Un alto nivel de descentralización es lo que hace que Cardano sea seguro.
Corrección de la transacción
El objetivo de un consenso es mantener un estado global (una versión de la verdad) entre todos los nodos, lo que básicamente significa que el ledger debe ser consistente. El ledger debe ser el mismo en todos los nodos honestos y cambia simultáneamente sólo si se logra el consenso. Puede que no siempre sea así, ya que puede haber nodos fraudulentos o algunos problemas de red que impidan la propagación correcta de los bloques. Un consenso debe ser lo suficientemente resistente para hacer frente a tales casos y debe ser capaz de continuar con la búsqueda de consenso (vivo). Por lo tanto, debe haber un estado válido que pueda ser tomado como una entrada para la creación de un nuevo bloque. Después de la adición de un nuevo bloque, el estado global también cambiará.
Los usuarios de la red, como Alice y Bob, envían transacciones una y otra vez. Puede haber millones de usuarios enviando transacciones en un momento dado. Todas las transacciones son propagadas a través de todos los nodos por la red. Un nodo selecciona operaciones y las inserta en un bloque. Una vez creado el bloque se puede propagar y se puede llegar a un consenso entre los nodos. Como se puede ver, el consenso es principalmente sobre las transacciones ya alojadas en el bloque. Existen más parámetros que están siendo custodiados por el consenso, como ser, que el máximo supply no esté dañado, o que el nuevo bloque pueda añadirse correctamente al final de la cadena de bloques y contenga un enlace válido al bloque anterior. Los proyectos pueden diferir en este punto. Centrémonos en las transacciones.
Añadir nuevos bloques al final de la cadena de bloques es básicamente una forma de sincronización de transacciones. Las transacciones tienen un orden que debe ser mantenido y custodiado por el consenso. Veamos el siguiente ejemplo transaccional:
Bloque 1:
- Transacción 1: Alice envía una moneda M a Bob.
- Transacción 2: Alice envía la misma moneda M a Carol.
- Transacción 3: Bob envía la moneda M a Dave.
Como puedes ver, las tres transacciones envían una moneda M. Sin embargo, Alice intenta cometer fraude. Quiere gastar dos veces la moneda M (el llamado ataque del doble gasto). Alice usó su clave privada para firmar dos transacciones T1 y T2. Ambas transacciones son válidas. Sin embargo, lo que importa es el orden, ya que ambos no pueden ser aceptados por consenso. El consenso probablemente sólo tome T1 y rechazará insertar T2 en un nuevo bloque.
Tenga en cuenta que T3 sólo puede aceptarse si se ha aceptado T1. Si el protocolo añadiera T2 en lugar de T1, Bob no sería el propietario de la moneda M, y no podría enviarla.
Únicamente el nodo con derecho a producir un bloque debe insertar tales transacciones en un nuevo bloque que deberá será aceptado por la mayoría requerida de los demás nodos honestos que participen en el consenso. Debe ser aceptado el bloque completo. Sólo en este caso, el nodo será recompensado por la producción del bloque. Supongamos que el bloque 1 fue aceptado y que hay otras transacciones esperando ser procesadas.
Bloque 2:
- Transacción 4: Carol envía la moneda M a Dan.
- Transacción 5: Dave envía la moneda M a Eve.
Ahora probablemente ya sabes lo que va a pasar. Hay otro nodo intentando crear un nuevo bloque. Debe tener en cuenta el estado que era válido en el bloque 1 aceptado. Por lo tanto, si se añaden T1 y T3 en el bloque 1, se puede insertar T5 en el bloque 2. Si se ha añadido T2, se puede insertar T4 en el bloque 2.
Nota al margen: Todas las transacciones deben estar firmadas, y las firmas también deben estar validadas. Sólo los propietarios de las claves privadas pueden firmar las transacciones, por lo que los nodos apenas pueden hacer trampas con las transacciones.
Los nodos son responsables de insertar transacciones en un bloque nuevo. Pueden elegir en función de las comisiones. Por lo tanto, existe una mayor probabilidad de que la T2 se inserte en el bloque 1 si la comisión es superior a la de la T1.
Un bloque puede ser considerado como un método para sincronizar un grupo de transacciones. En PoW, la minería toma 10 minutos, de modo que los operadores de grupos crean bloques y luego puede comenzar la competencia. La minería juega un papel importante en la sincronización. En PoS la sincronización es un poco complicada. En la red de Cardano, sólo un nodo obtiene el derecho para la producción de bloques por cada intervalo. Todos los demás nodos deben saber cuál intervalo está activo en dicho momento, y cuándo continuar con el siguiente intervalo si el nodo no consigue producir un bloque en el intervalo activo. En PoS, la bifurcación de la cadena se puede evitar, por lo que también es una buena protección contra los ataques de doble gasto.
Todo consenso en una red pública distribuida debe recompensar el comportamiento honesto y prevenir los fraudes. Este es un tema en sí mismo, así que tal vez en un próximo artículo podamos tratarlo con mayor profundidad.
Responsabilidades en el consenso
Hay dos propiedades importantes que deben ser garantizadas por el consenso: Seguridad y operatividad.
La seguridad está garantizada si la mayoría de los nodos requeridos se comportan honestamente, y los nodos fraudulentos no pueden convencer a ningún cliente de que acepte transacciones incorrectas o inválidas. En otras palabras, la seguridad garantiza que las cosas malas nunca sucedan.
Se garantiza la disponibilidad si la mayoría de los nodos requeridos se comportan honestamente y los nodos fraudulentos no pueden retrasar indefinidamente la aceptación de las transacciones correctas. También se puede entender como un requerimiento de que eventualmente algo positivo suceda (no hay límite máximo establecido) y el protocolo progrese en el logro del consenso.
Podemos decir simplemente que el consenso debería ser capaz de añadir bloques de forma segura y nunca detenerse.
Si la seguridad y la operatividad están garantizadas, entonces el historial de transacciones no puede ser cambiado por nodos fraudulentos, y el protocolo es capaz de continuar añadiendo nuevos bloques. Los nodos honestos siempre saben cuál versión verdadera (el estado global) es la correcta, y por lo tanto se puede añadir el nuevo bloque. En caso de que las propiedades estén garantizadas, entonces desde el punto del ledger, los nodos fraudulentos no podrán cambiar la historia del ledger y los nodos honestos siempre serán capaces de recuperar la versión correcta del ledger. Nota que ambas propiedades son inseparables, y se apoyan mutuamente. Si un protocolo prefiriera la operatividad a la seguridad, entonces sería fácil añadir bloques, pero también podría ser fácil engañar. Al contrario, si un protocolo prefiriera la seguridad a la operatividad, entonces podría ser difícil añadir un nuevo bloque, y tal vez sería inteligente no añadir un nuevo bloque en absoluto. Entonces, no se trataría de un consenso. Los diseñadores de un sistema de consenso buscan el equilibrio.
En el pasado hubo un caso en el que el consenso de Stellar Lumens dejó de funcionar luego de que un nodo se rompiera. Se puede decir que el protocolo prefería la seguridad a la operatividad. Protegía los fondos de los usuarios, lo que era mejor que seguir procesando nuevas transacciones.
En el caso de Cardano, las reglas del consenso se definen de manera que se pueda demostrar que la seguridad y la operatividad estén garantizadas, incluso en el caso de que existiera una minoría de nodos fraudulentos. El consenso debe ser tolerante a las faltas.
Reglas del consenso
El consenso se trata de un conjunto de reglas que son transferidas por los programadores a un código fuente de un protocolo. Existen muchas reglas que se requieren para construir un protocolo. Las reglas deben definir cosas como las siguientes:
- El aspecto de la transacción válida.
- Orden de la operación en un bloque.
- Propiedades de un bloque.
- Normas para la propagación de transacciones y bloques.
- Cómo crear un nuevo bloque.
- Reglas para seleccionar un nodo que tiene derecho a producir un bloque.
- Cómo llegar a un acuerdo mutuo para añadir un nuevo bloque propuesto.
- Y muchos otros.
Las diferencias más significativas entre los algoritmos de consenso están relacionadas con el acuerdo mutuo para añadir un nuevo bloque propuesto. En PoW, un bloque se añade simplemente si hay una prueba de electricidad consumida. La prueba es básicamente un hash del bloque que debe ser correcto dentro del objetivo de dificultad actual. Si un nodo recibe dicho bloque y todos los demás requisitos son correctos (todas las transacciones, hash, timestamp, etc.), el nodo añade el bloque al final de la cadena de bloques.
El Ouroboros PoS de Cardano requiere una prueba de que un nodo que propaga un nuevo bloque tiene derecho a producir un bloque en un intervalo determinado. Hay más reglas y funcionalidades implementadas para eso en el protocolo. Cada nodo pregunta en cada intervalo si ahora tiene derecho a producir un bloque. Si es el caso, existe una regla que dice que el nodo debe insertar la prueba de la victoria en el bloque, junto con las transacciones y otros parámetros. Otro conjunto de reglas permite a otros nodos verificar que el bloque propuesto recibido fue realmente creado por el nodo correcto.
El consenso PoW se basa en el consumo de electricidad, mientras que el PoS se basa en las matemáticas y la ciencia. Ambos enfoques garantizan seguridad y operatividad. Tendríamos que explorar propiedades como la escalabilidad, la seguridad, la descentralización, la falta de permisos, la imparcialidad, la resistencia a la censura, la firmeza, y otras propiedades para ver las principales diferencias entre los diferentes protocolos de consenso. Lo haremos en otro artículo.
Conclusión
No se puede decir que PoW es mejor que PoS, o viceversa. Ambos tienen ventajas y desventajas. Sin embargo, el PoS puede confirmar las transacciones más rápidamente, y es más escalable. PoS puede ser aún más escalable con sharding. Sharding permite hacer más consensos paralelos al mismo tiempo y mantener un estado global válido del ledger.
Espero que hayas comprendido mejor el concepto del consenso, y entiendas que las redes descentralizadas y distribuidas necesitan llevarlo a cabo para mantener inmutable el historial de las transacciones, y añadir nuevas de forma segura y continua.
Considera la posibilidad delegar tus monedas en Cardanians. Y si te gustan nuestros artículos, puedes apoyarnos con una donación en ADA:
DdzFFzCqrhseNP1C9XEs1MA82rgnVZwNpeiNCbLxrJfRzwaceXB9VYqPFYYRYRYegc67SERjcQ1xvwB6jryp5vgGUf1cvzbeZP2a92tQe