Presentación del P2P dinámico de Cardano: un salto adelante en la descentralización
Autor: Armando Santos, Ingeniero del equipo de redes IOG.
Introducción
A medida que el ecosistema Cardano continúa creciendo y evolucionando, los colaboradores del ecosistema Cardano se comprometen a refinar y optimizar continuamente la infraestructura de red de Cardano. El lanzamiento de la red dinámica peer-to-peer (P2P), entregado con el nodo v.1.35.6, fue un esfuerzo de colaboración del equipo de redes de IOG, Well-Typed, PNSol y la Fundación Cardano y representa un producto de alto rendimiento y un hito importante en el camino de Cardano hacia el establecimiento de una plataforma blockchain totalmente descentralizada y segura.
Dado que Cardano funciona como un sistema estocástico en tiempo real, su rendimiento y seguridad están intrínsecamente interconectados. El equipo de redes sigue empeñado en encontrar el equilibrio ideal entre diversos factores, incluidas consideraciones topológicas y topográficas, para mejorar la puntualidad y la conectividad.
Esta entrada de blog te lleva a través del viaje de ingeniería que hay detrás del desarrollo del diseño Dynamic P2P de Cardano. Profundiza en los principios básicos del diseño, destaca los retos encontrados en el camino y desvela las soluciones que el equipo ideó para establecer un sistema de red robusto y escalable.
Qué es el P2P dinámico
La implementación de P2P Dinámico refina de forma continua y dinámica la topología activa mediante un proceso de selección de pares, con el objetivo de reducir el tiempo de difusión global en toda la red. Los resultados de la investigación sugieren que la utilización de una política basada únicamente en información local puede dar lugar a un resultado global casi óptimo. Esto se consigue controlando la puntualidad y frecuencia de los pares que proporcionan una cabecera de bloque, que en última instancia se incorpora a la cadena.
El objetivo principal es eliminar a los pares altamente “no óptimos”, manteniendo al mismo tiempo una fuerte conectividad. Para lograrlo, los pares considerados menos útiles según esta métrica se “expulsan” periódicamente y se sustituyen por alternativas seleccionadas al azar. Los resultados de la simulación indican que este método de optimización converge hacia un resultado global casi óptimo en un número relativamente pequeño de iteraciones.
En la práctica, el P2P dinámico sustituye a la configuración manual de la selección de pares (por ejemplo, mediante la herramienta de actualización de la topología).
Con la configuración manual, los operadores de validadores (SPO) debían establecer conexiones con un número significativo de pares (50, por ejemplo) para mantener un mínimo de 20 conexiones activas de forma constante. Este enfoque era necesario debido a la naturaleza estática de los pares configurados y a la disponibilidad variable de los repetidores de los SPO.
Sin embargo, con P2P Dinámico, los nodos pueden configurarse para mantener un número específico de conexiones activas entre pares (por ejemplo, 20) y seleccionar entre todos los repetidores SPO registrados en la cadena. En caso de que se pierda la conexión con un peer, el nodo seleccionará automáticamente peers alternativos e intentará conexiones de forma persistente hasta alcanzar el objetivo deseado.
Como resultado, el P2P Dinámico elimina la necesidad de sobre aprovisionamiento de conexiones, ofreciendo una solución de red más eficiente y adaptable.
La visión del diseño
Cardano funciona como un sistema cooperativo compuesto por nodos autónomos. No está diseñado como un modelo cliente-servidor, lo que significa que no existe un punto central de control ni una clase privilegiada de servidores gestionados centralmente. Aunque la topología de la red puede haber comenzado inicialmente como federada durante la fase de desarrollo de Byron, el objetivo era convertirla en un sistema de red distribuida totalmente fiable capaz de satisfacer las demandas cambiantes del ecosistema Cardano, garantizando al mismo tiempo una conectividad y un rendimiento óptimos.
Cuando el equipo de redes se embarcó en esta aventura de ingeniería, era muy consciente de que se encontraría con numerosos retos y complejidades en el camino. Sin embargo, se enfrentaron a estos retos de frente, perfeccionando continuamente las ideas centrales que, en última instancia, darían forma al diseño del sistema P2P dinámico:
-
Modularidad y extensibilidad: el sistema se diseñó teniendo en cuenta la modularidad, lo que facilita la sustitución o mejora de componentes individuales según sea necesario. Esta extensibilidad permite integrar sin problemas nuevas funciones y mejoras, garantizando que el diseño se adapte a las necesidades cambiantes del ecosistema Cardano. La modularidad es especialmente útil cuando se aplican métodos formales para probar la corrección de los diseños de bajo nivel en relación con las especificaciones de alto nivel. Al dividir el sistema en componentes más pequeños y manejables, es posible aplicar pruebas basadas en propiedades a cada módulo de forma más eficaz, asegurando que el comportamiento de cada parte está bien definido y se adhiere a las propiedades esperadas. Por supuesto, la elección de la programación funcional con Haskell como lenguaje de programación principal desempeñó un papel importante en la consecución de este nivel de modularidad y extensibilidad.
-
Escalabilidad: a medida que crece la red, también aumenta la demanda de un sistema capaz de gestionar un mayor número de nodos y transacciones respetando las restricciones de tiempo de Ouroboros. Para abordar este requisito de escalabilidad en la visión del diseño P2P, el equipo tuvo en cuenta las propiedades de escalabilidad desde el principio e incorporó estrategias como la selección inteligente de pares.
-
Seguridad y resiliencia: en una red descentralizada, la resiliencia y la seguridad son de vital importancia. El objetivo era construir un sistema capaz de resistir interrupciones internas y externas. Para lograrlo, el equipo de redes implantó sólidos mecanismos de gestión de errores diseñados para resistir los abusos, garantizando que los usuarios no puedan atacar el sistema mediante ataques asimétricos de denegación de servicio que agoten los recursos de la red para otros usuarios. Con el enfoque P2P, cada nodo puede dar prioridad a su conexión con pares configurados localmente. Esto garantiza que el nodo mantenga una conexión con pares de confianza y pueda progresar en la red. Las conexiones entrantes están limitadas en cuanto a velocidad, y los objetivos de pares configurables permiten al nodo ajustar su consumo de recursos. Además, la gestión cuidadosa de los estados de conexión permite reutilizar las conexiones dúplex, lo que permite a los nodos situados detrás de cortafuegos mejorar su conectividad de forma segura al tiempo que se reduce la superficie de ataque global.
-
Rendimiento: una red de alto rendimiento es crucial para garantizar una experiencia de usuario fluida. Se ha invertido un gran esfuerzo en optimizar el diseño empleando técnicas como la transmisión eficiente de datos mediante multiplexación y la utilización de protocolos compatibles con la canalización. Además, la selección inteligente de pares es vital para reducir la latencia y garantizar una red fiable y con capacidad de respuesta.
Establecer una comunicación efectiva dentro de la red Cardano requiere lograr una baja latencia y una buena conectividad. Para cumplir con estos requisitos esenciales, P2P Dinámico fue diseñado para garantizar una base sólida, escalable y resistente para el crecimiento continuo del ecosistema. Sin embargo, es importante reconocer que la confianza entre pares es un factor crítico para mantener una red segura y fiable. Aunque ahondar en los detalles de la fiabilidad está fuera del alcance de esta entrada de blog, vale la pena señalar que el diseño P2P incorpora múltiples medidas para mitigar los riesgos potenciales y salvaguardar la red.
Análisis de la selección de pares para enlaces en bloque en Ouroboros
Garantizar el rendimiento y la seguridad de Ouroboros es crucial, y un aspecto crítico de ello es la retransmisión puntual de nuevos bloques a través de la red. Lo ideal sería que las conexiones dentro de la red P2P se organizaran de forma que se minimizara el tiempo necesario para que un bloque fuera retransmitido desde cualquier nodo a todos los demás nodos de la red.
Sin embargo, la realización de este objetivo plantea un reto complejo, y los trabajos previos disponibles aplicables en un entorno sin confianza son limitados. Para abordar eficazmente este problema era necesario desarrollar soluciones innovadoras que pudieran lograr un equilibrio entre la rapidez de la comunicación y el mantenimiento de la integridad y la seguridad de la red descentralizada.
Enunciado del problema
Una solución eficaz para optimizar el rendimiento consiste en minimizar el número de “saltos” que un bloque debe recorrer a través de la red. En términos gráficos, esto se traduce en reducir el número medio de aristas que atraviesa un bloque. Además, la longitud de cada salto o arista es crucial. Los enlaces locales presentan menor latencia que los intercontinentales, aunque algunos enlaces intercontinentales son necesarios para la retransmisión global de bloques. Por ejemplo, una solución subóptima implicaría un exceso de enlaces intercontinentales, como el encaminamiento de Europa a Asia y viceversa.
Los algoritmos de red existentes pueden generar “árboles de expansión” óptimos que podrían servir como rutas para la retransmisión en bloque. Sin embargo, estos algoritmos dependen de que los nodos confíen los unos en los otros para intercambiar información precisa, lo que resulta inadecuado para una red P2P de cadenas de bloques en la que los nodos no pueden confiar intrínsecamente los unos en los otros.
Una solución ideal debería basarse en información “local” más que “global”, es decir, información que los nodos puedan evaluar individualmente sin depender de datos compartidos y de confianza. No obstante, disponer de una solución óptima que dependa de una información global perfecta puede servir como valioso punto de referencia.
Investigación preliminar
El equipo de redes del IOG colaboró con investigadores de redes de la Universidad de Atenas, especializados en sistemas descentralizados y sus protocolos, para llevar a cabo una tarea crucial: simular distintas políticas de red y estudiar las compensaciones en el tiempo de difusión.
La cuestión central de la difusión es determinar qué nodos deben reenviarse bloques entre sí o, más exactamente, qué enlaces de difusión deben establecerse entre los nodos para mejorar la velocidad de difusión.
Para abordar esta cuestión, junto con los investigadores seguimos dos enfoques principales:
- El primer enfoque supone que los enlaces son independientes del proceso de difusión. Se trata de simular una superposición estática en la que los enlaces se establecen según reglas predefinidas. A continuación, se ejecutan múltiples difusiones para medir el rendimiento.
- El segundo enfoque consiste en ajustar dinámicamente la superposición. En este enfoque, los nodos establecen inicialmente conexiones con nodos aleatorios de la red y supervisan continuamente las estadísticas de rendimiento de sus vecinos. Periódicamente, cada nodo ajusta su conjunto de vecinos basándose en estas estadísticas, decidiendo qué vecinos conservar y cuáles sustituir.
El gráfico muestra la rápida difusión de un bloque por la red, que llega a todos los nodos. En este experimento, todos los nodos utilizan exactamente la misma política Cercano-Aleatorio; por ejemplo, C6R4 significa que los nodos se conectan a seis pares cercanos y a cuatro pares aleatorios. Inicialmente, todos los nodos están desinformados, lo que significa que aún no han recibido el bloque específico. Sin embargo, se les informa en algún momento del experimento. La línea de puntos representa la solución óptima teórica, suponiendo que todos los nodos informados poseen un conocimiento completo de cuáles son los pares más ventajosos, lo que permite este tipo de conexiones (política de vista de dios).
Es importante aclarar que la política Cercana-Aleatoria no se aplicó directamente. Más bien, se empleó como herramienta teórica práctica. Consigue un equilibrio al incorporar factores no locales y, al mismo tiempo, ser lo suficientemente sencilla como para poder aproximarse utilizando únicamente información local.
Este análisis demuestra lo cerca que se puede estar de una solución ideal utilizando principalmente información local. Lo intrigante es que esta aproximación supera las expectativas. Lograr un resultado a un factor de dos de la perfección habría sido encomiable, pero el equipo descubrió que es posible superarlo incluso.
La figura anterior compara los resultados de los dos enfoques descritos anteriormente. En la simulación, cada nodo tenía seis vecinos cercanos (según el tiempo de ida y vuelta, RTT en inglés) y cuatro nodos aleatorios. Estos enlaces se mantuvieron estáticos durante todo el experimento (de ahí las líneas azules constantes). En la política de “dos grupos (<=100ms y >100ms)”, cada nodo mantiene un número fijo de enlaces cercanos y remotos: ‘cercano’ significa que el RTT a ese vecino es menor o igual a 100 ms, mientras que ‘remoto’ implica que el RTT es superior a 100 ms. Los nodos comienzan con todos los enlaces aleatorios y los calibran periódicamente. Durante esta calibración, retienen hasta un número fijo de vecinos que tienen un RTT inferior a 100 ms, y sustituyen algunos de los vecinos restantes por nodos aleatorios recién elegidos.
Esta política de dos grupos sirve como aproximación directa y eficaz para evaluar el comportamiento de la política de puntuación. Sin embargo, cabe señalar que esta política no es la que se emplea actualmente.
En esta última figura se presenta un análisis comparativo entre los resultados de la política Cercana-Aleatoria y otra política de puntuación de pares. Esta política alternativa evalúa a los pares en función de la frecuencia con la que suministran una nueva cabecera de bloque al nodo antes que los demás. En esta configuración experimental, los nodos comienzan con enlaces aleatorios y se someten periódicamente a calibración. Durante estos intervalos de calibración, el 20% o el 40% de los pares con peores resultados son sustituidos por nuevos nodos seleccionados al azar.
La línea azul del gráfico representa la política que se está utilizando actualmente (en la sección siguiente se ofrecen más detalles al respecto). La línea verde ilustra el óptimo teórico.
Al examinar detenidamente este gráfico y compararlo con el anterior, podemos identificar variaciones clave en la eficacia de las distintas políticas de puntuación. No obstante, es fundamental tener en cuenta que estas variaciones no son directamente comparables debido a los diferentes parámetros aplicados en cada experimento. Algunos experimentos miden el tiempo de difusión completo, mientras que otros consideran el percentil 99, que representa un valor ligeramente inferior. Además, las trazas de latencia entre nodos difieren entre experimentos, lo que da lugar a resultados distintos.
En este contexto, el percentil 99 para la política del 20% muestra un equilibrio inferior en comparación con los dos grupos. Sin embargo, no se trata de una comparación directa “manzanas con manzanas” por las razones expuestas anteriormente.
La política que empleamos actualmente va más allá del uso del RTT a la hora de seleccionar a los pares. En nuestra búsqueda de un enfoque más sólido y fiable, buscamos una alternativa que refleje con precisión la utilidad de un par. Esto nos llevó al concepto de recompensar a los pares por ser los primeros en presentar a un nodo un nuevo encabezado o bloque. Este enfoque ofrece una medida auténtica de la contribución de un par a la red y, a diferencia del RTT, no puede manipularse ni falsificarse fácilmente.
Redes P2P basadas en información local
En el diseño P2P dinámico, cada nodo mantiene una visión local de la red y evalúa las conexiones potenciales teniendo en cuenta el rendimiento histórico. Los nodos supervisan y ajustan continuamente sus conexiones, buscando pares con mejor rendimiento para optimizar su posición en la red y minimizar el número de saltos necesarios para la retransmisión en bloque.
Cada nodo mantiene tres conjuntos de nodos pares conocidos:
- Pares fríos: pares conocidos sin una conexión de red establecida.
- Pares tibios: pares con una conexión de portador establecida, utilizados para mediciones de red pero no para protocolos de consenso a nivel de aplicación; su función principal es servir como conjunto de nodos fácilmente disponibles.
- Pares calientes: pares con una conexión portadora activa, utilizados para los protocolos de consenso a nivel de aplicación.
Como se ha mencionado anteriormente, los nodos mantienen una información limitada sobre estos pares, basada en interacciones directas previas. En el caso de los nodos fríos, a menudo esta información puede estar ausente debido a la falta de interacciones directas previas. Esta información se asemeja a la “reputación” de otros sistemas, pero es esencial destacar que es puramente local y no se comparte con ningún otro nodo.
La figura anterior ilustra el ciclo de ascensos/descensos, gestionado por el gobernador de selección de pares (PSG en inglés). Este componente es responsable de alcanzar objetivos específicos, como mantener un número determinado de pares conocidos y activos.
Además, se puede utilizar una configuración estática local para designar determinados nodos como calientes o tibios. Este enfoque permite relaciones fijas entre nodos gestionados por una única organización, como un validador con múltiples enlaces. También facilita los acuerdos de enlaces privados entre SPO y otros posibles escenarios de despliegue.
En casos de comportamiento adverso, un par puede ser degradado inmediatamente de los conjuntos caliente, templado y frío. La decisión es no retener la información negativa de los pares durante periodos prolongados para limitar el consumo de recursos en un sistema sin permisos, ya que hacerlo podría simplificar potencialmente los ataques Sybil.
Rotación y políticas locales
El gobernador de pares rotativos (PCG en inglés) es un componente que desempeña un papel fundamental en la gestión de la salud y la eficiencia de una red sorteando los problemas relacionados con la partición de la red y los ataques de eclipse, ajustando los valores de los objetivos de los peers calientes, cálidos y fríos para promover su churning.
En este proceso, el PCG modifica la frecuencia con la que los pares son promovidos (mejorados de fríos a calientes, o de calientes a calientes) o degradados (degradados de calientes a calientes, o de calientes a fríos). Esta decisión está guiada por funciones de puntuación que evalúan a los compañeros en función de su utilidad y rendimiento.
Estas funciones de puntuación incluyen:
-
Política de degradación caliente: responsable de determinar qué pares “calientes” (muy activos y valiosos) deben ser degradados. La puntuación se calcula en función de la contribución de un peer a la red, teniendo en cuenta factores como el número de bloques que ha sido el primero en proporcionar y/o el número de bytes que ha proporcionado. Durante el funcionamiento normal, se utiliza una combinación de estos factores para calcular la puntuación. Sin embargo, durante la sincronización masiva de datos, el número de bytes proporcionados tiene prioridad.
-
Política de degradación tibia y fría: gestionan los pares “tibios” y “fríos”, determinando qué pares deben ser degradados o eliminados de la red. En estas decisiones influyen un cierto nivel de aleatoriedad y diversas características. Entre los factores que se tienen en cuenta están los fallos anteriores o una bandera de tibieza, que indica menor fiabilidad o niveles de actividad más bajos en los pares.
Durante el proceso de sincronización de nodos, el PCG garantiza que no se utilicen más de dos conexiones activas para evitar la sobre utilización de recursos. Una vez que el nodo está totalmente sincronizado, el PCG facilita la rotación periódica, refrescando el 20% de los pares cada hora. Esto promueve una red robusta y adaptable.
Aunque las políticas Cercana-Aleatoria o basadas en puntajes exploradas en la investigación no se replican directamente en el entorno de producción, han influido significativamente en el diseño de las políticas implementadas. Así, los resultados de la investigación han desempeñado un papel crucial en la configuración de las políticas de red dentro del entorno de producción de Cardano.
Enfoque de desarrollo
La implementación P2P de Cardano se basa en Haskell, un lenguaje de programación funcional ampliamente reconocido por su corrección, seguridad y facilidad de mantenimiento. El robusto sistema de tipos de Haskell ayuda a detectar posibles problemas durante el desarrollo, lo que se traduce en un código más robusto y fiable. Además, el equipo de redes ha desarrollado y emplea io-sim, una biblioteca de simulación de eventos discretos basada en el tiempo que ofrece un control preciso de la entropía y la temporización en las simulaciones. Esta herramienta replica fielmente el sistema de tiempo de ejecución de Haskell, incluidas funciones como la memoria transaccional de software (STM), MVars y otras. Este nivel de control permite la reproducibilidad, las pruebas de regresión y el examen de los peores escenarios. La combinación de Haskell e io-sim permite realizar pruebas rigurosas del mismo código utilizado en el sistema de producción P2P en una amplia gama de condiciones, lo que garantiza su preparación para afrontar los retos del mundo real.
En su compromiso por construir un sistema fiable, el equipo de redes del IOG empleó pruebas exhaustivas basadas en propiedades. Estas pruebas se diseñaron específicamente para descubrir fallos complejos y casos aislados que podrían pasar desapercibidos en enfoques de pruebas tradicionales como las pruebas unitarias. Un aspecto distintivo del proceso de pruebas es la inclusión de simulaciones que reproducen años de funcionamiento del sistema. Este enfoque integral permite imitar años de actividad y descubrir fallos poco frecuentes que sólo pueden aparecer en condiciones específicas o prolongadas. Sin embargo, es importante señalar que la calidad de estas pruebas depende en última instancia de la calidad de los generadores empleados. Los generadores desempeñan un papel fundamental a la hora de producir entradas diversas y representativas para una evaluación exhaustiva.
Traducción al Español por Martín Ungar @LatinStakePools
Texto original: Unveiling Cardano's Dynamic P2P: a leap forward in decentralization | IOG Engineering