Plongée en ingénierie dans la conception Dynamic P2P de Cardano

Découvrez le voyage à travers les défis, les solutions et les triomphes derrière la création d’un système de mise en réseau robuste et évolutif

Alors que l’écosystème Cardano continue de croître et d’évoluer, les contributeurs à l’écosystème Cardano s’engagent à affiner et à optimiser en permanence l’infrastructure réseau de Cardano. La sortie de la mise en réseau dynamique peer-to-peer (P2P), livrée avec le nœud v.1.35.6, était un effort collaboratif de l’équipe de mise en réseau d’ IOG , Well-Typed , PNSol et de la Fondation Cardano et représente un livrable très performant et une étape importante dans le parcours de Cardano vers l’établissement d’une plate-forme de blockchain entièrement décentralisée et sécurisée.

Étant donné que Cardano fonctionne comme un système stochastique en temps réel, ses performances et sa sécurité sont intrinsèquement liées. L’équipe de mise en réseau reste déterminée à trouver l’équilibre idéal entre divers facteurs, y compris les considérations topologiques et topographiques, afin d’améliorer la rapidité et la connectivité.

Cet article de blog vous guide à travers le parcours d’ingénierie derrière le développement de la conception Dynamic P2P de Cardano. Il se penche sur les principes de conception de base, met en évidence les défis rencontrés en cours de route et dévoile les solutions conçues par l’équipe pour établir un système de réseau robuste et évolutif.

Qu’est-ce que le P2P dynamique ?

La mise en œuvre de Dynamic P2P affine de manière continue et dynamique la topologie active grâce à un processus de sélection des pairs, dans le but de réduire le temps de diffusion global sur l’ensemble du réseau . Les résultats de la recherche suggèrent que l’utilisation d’une politique basée uniquement sur des informations locales peut entraîner un résultat global presque optimal. Ceci est réalisé en surveillant la rapidité et la fréquence des pairs qui fournissent un en-tête de bloc, qui est finalement intégré à la chaîne.

L’objectif principal est d’éliminer les homologues hautement « non optimaux » tout en maintenant une connectivité solide. Pour y parvenir, les pairs considérés comme moins utiles sur la base de cette métrique sont périodiquement “produits” et remplacés par des alternatives sélectionnées au hasard. Les résultats de simulation indiquent que cette méthode d’optimisation converge vers un résultat global quasi optimal en un nombre relativement faible d’itérations.

Pratiquement, Dynamic P2P remplace la configuration manuelle de la sélection des pairs (par exemple à l’aide de l’ outil de mise à jour de la topologie ).

Avec la configuration manuelle, les opérateurs de pool de participation (SPO) devaient établir des connexions avec un nombre important de pairs (50 par exemple) pour maintenir un minimum de 20 connexions actives de manière cohérente. Cette approche était nécessaire en raison de la nature statique des homologues configurés et de la disponibilité variable des relais SPO.

Cependant, avec Dynamic P2P, les nœuds peuvent être configurés pour maintenir un nombre spécifique de connexions homologues actives (par exemple 20) et sélectionner parmi tous les relais SPO enregistrés sur la chaîne. En cas de perte de connexion avec un pair, le nœud sélectionnera automatiquement des pairs alternatifs et tentera constamment de se connecter jusqu’à ce que la cible souhaitée soit atteinte.

En conséquence, Dynamic P2P élimine la nécessité d’un surapprovisionnement des connexions, offrant une solution de mise en réseau plus efficace et adaptable.

La vision du design

Cardano fonctionne comme un système coopératif composé de nœuds autonomes. Il n’est pas conçu comme un modèle client-serveur, ce qui signifie qu’il n’y a pas de point de contrôle central ou de classe privilégiée de serveurs gérés de manière centralisée. Alors que la topologie du réseau a peut-être commencé comme fédérée pendant la phase de développement de Byron, l’objectif était de la faire évoluer vers un système de réseau distribué entièrement sans confiance capable de répondre aux demandes en constante évolution de l’écosystème Cardano, tout en garantissant une connectivité et des performances optimales.

Lorsque l’équipe de réseautage s’est lancée dans cette aventure d’ingénierie, elle était bien consciente qu’elle rencontrerait de nombreux défis et complexités en cours de route. Cependant, ils ont relevé ces défis de front, affinant continuellement les idées de base qui façonneraient finalement la conception du système Dynamic P2P :

  1. Modularité et extensibilité: le système a été conçu dans un souci de modularité, ce qui facilite le remplacement ou l’amélioration de composants individuels selon les besoins. Cette extensibilité permet une intégration transparente de nouvelles fonctionnalités et améliorations, garantissant que la conception reste adaptée aux besoins en constante évolution de l’écosystème Cardano. La modularité est particulièrement utile lorsque des méthodes formelles sont appliquées pour prouver l’exactitude des conceptions de bas niveau par rapport aux spécifications de haut niveau. En décomposant le système en composants plus petits et plus faciles à gérer, il devient possible d’appliquer plus efficacement des tests basés sur les propriétés à chaque module, en s’assurant que le comportement de chaque partie est bien défini et respecte les propriétés attendues. Bien sûr,
  2. Évolutivité : à mesure que le réseau se développe, la demande pour un système capable de gérer un plus grand nombre de nœuds et de transactions tout en respectant les contraintes temporelles d’Ouroboros augmente également. Pour répondre à cette exigence d’évolutivité dans la vision de conception P2P, l’équipe a pris en compte les propriétés d’évolutivité dès le début et a incorporé des stratégies telles que la sélection intelligente des pairs.
  3. Sécurité et résilience: dans un réseau décentralisé, la résilience et la sécurité sont primordiales. L’objectif était de construire un système capable de résister aux perturbations internes et externes. Pour y parvenir, l’équipe réseau a mis en place des mécanismes robustes de gestion des erreurs conçus pour résister aux abus, garantissant que les utilisateurs ne peuvent pas attaquer le système par le biais d’attaques par déni de service asymétriques qui épuisent les ressources réseau pour les autres utilisateurs. Avec l’approche P2P, chaque nœud peut prioriser sa connexion à des pairs configurés localement. Cela garantit que le nœud maintient une connexion avec des pairs de confiance et peut progresser dans le réseau. Les connexions entrantes sont limitées en débit et les cibles homologues configurables permettent au nœud d’ajuster sa consommation de ressources. De plus, une gestion minutieuse des états de connexion permet de réutiliser les connexions duplex,
  4. Performance : un réseau hautement performant est crucial pour assurer une expérience utilisateur fluide. Des efforts considérables ont été investis dans l’optimisation de la conception en utilisant des techniques telles que la transmission efficace des données par multiplexage et en utilisant des protocoles qui prennent en charge le pipelining. De plus, la sélection intelligente des pairs joue un rôle essentiel dans la réduction de la latence et la garantie d’un réseau réactif et fiable.

L’établissement d’une communication efficace au sein du réseau Cardano nécessite une faible latence et une bonne connectivité. Pour répondre à ces exigences essentielles, Dynamic P2P a été conçu pour assurer une base solide, évolutive et résiliente pour la croissance continue de l’écosystème. Cependant, il est important de reconnaître que la fiabilité des pairs est un facteur critique dans le maintien d’un réseau sécurisé et fiable. Bien que se plonger dans les détails de la fiabilité dépasse le cadre de cet article de blog, il convient de noter que la conception P2P intègre plusieurs mesures pour atténuer les risques potentiels et protéger le réseau.

Analyse de la sélection des pairs pour les relais de bloc dans Ouroboros

Il est crucial de garantir les performances et la sécurité d’Ouroboros, et l’un des aspects essentiels de cela est le relais en temps opportun des nouveaux blocs sur le réseau. Idéalement, les connexions au sein du réseau P2P devraient être organisées de manière à minimiser le temps nécessaire pour qu’un bloc soit relayé de n’importe quel nœud à tous les autres nœuds du réseau.

Cependant, atteindre cet objectif présente un défi complexe, avec peu de travaux antérieurs disponibles applicables dans un environnement sans confiance. Pour résoudre efficacement ce problème, il a fallu développer des solutions innovantes capables de trouver un équilibre entre une communication rapide et le maintien de l’intégrité et de la sécurité du réseau décentralisé.

Énoncé du problème

Une solution efficace pour optimiser les performances consiste à minimiser le nombre de “sauts” qu’un bloc doit parcourir sur le réseau. En termes de graphe, cela se traduit par une réduction du nombre moyen d’arêtes traversées par un bloc. De plus, la longueur de chaque saut ou arête est cruciale. Les liaisons locales présentent une latence plus faible que les liaisons intercontinentales, bien que certaines liaisons intercontinentales soient nécessaires pour le relais de bloc mondial. Par exemple, une solution sous-optimale impliquerait des liaisons intercontinentales excessives, telles que l’acheminement de l’Europe vers l’Asie et retour.

Les algorithmes de mise en réseau existants peuvent générer des «arbres couvrants» optimaux qui pourraient servir de chemins pour le relais de bloc. Cependant, ces algorithmes s’appuient sur des nœuds qui se font confiance pour échanger des informations précises, ce qui ne convient pas à un réseau P2P blockchain où les nœuds ne peuvent pas se faire intrinsèquement confiance.

Une solution idéale devrait s’appuyer sur des informations « locales » plutôt que « globales », des informations que les nœuds peuvent évaluer individuellement sans s’appuyer sur des données partagées et fiables. Néanmoins, avoir une solution optimale qui dépend d’informations globales parfaites peut servir de point de référence précieux.

Recherche préliminaire

L’équipe de mise en réseau a collaboré avec des chercheurs en réseau de l’Université d’Athènes, spécialisés dans les systèmes décentralisés et leurs protocoles, pour entreprendre une tâche cruciale : simuler différentes politiques de réseau et étudier les compromis en matière de temps de diffusion.

La question centrale concernant la diffusion est de déterminer quels nœuds doivent se transmettre des blocs les uns aux autres, ou, plus précisément, quels liens de diffusion doivent être établis entre les nœuds pour améliorer la vitesse de diffusion.

En abordant cette question, en collaboration avec les chercheurs, nous avons suivi deux approches principales :

  1. La première approche suppose que les liens sont indépendants du processus de diffusion. Il s’agit de simuler une superposition statique où les liens sont établis selon des règles prédéfinies. De multiples diffusions sont alors exécutées pour mesurer la performance.
  2. La deuxième approche consiste à ajuster dynamiquement la superposition. Dans cette approche, les nœuds établissent initialement des connexions avec des nœuds aléatoires du réseau et surveillent en permanence les statistiques de performances de leurs voisins. Périodiquement, chaque nœud ajuste son ensemble de voisins en fonction de ces statistiques, en décidant quels voisins conserver et lesquels remplacer.

Figure 1. Comparaison de politiques proches et aléatoires

L’intrigue démontre la diffusion rapide d’un bloc à travers le réseau, atteignant finalement tous les nœuds. Dans cette expérience, tous les nœuds utilisent exactement la même politique Close-Random - par exemple, C6R4 signifie que les nœuds se connectent à six pairs proches et à quatre pairs aléatoires. Au départ, tous les nœuds ne sont pas informés, ce qui signifie qu’ils n’ont pas encore reçu le bloc spécifique. Cependant, ils deviennent informés à un moment donné au cours de l’expérience. La ligne pointillée représente la solution optimale théorique, en supposant que tous les nœuds informés possèdent une connaissance complète des pairs les plus avantageux, permettant de telles connexions (politique de la vue de Dieu).

Il est important de préciser que la politique Close-Random n’a pas été mise en œuvre directement. Au contraire, il a été utilisé comme un outil théorique pratique. Il établit un équilibre en incorporant des facteurs non locaux tout en restant suffisamment simple pour être approximé en utilisant uniquement des informations locales.

Cette analyse montre à quel point il est possible de se rapprocher d’une solution idéale en utilisant principalement des informations locales. Ce qui est fascinant, c’est que cette approche dépasse les attentes. Atteindre un résultat avec un facteur deux de perfection aurait été louable, mais l’équipe a découvert qu’il est même possible de surpasser cela.

Figure 2. Politique Close-Random vs étalonnage à deux groupes

La figure 2 compare les résultats des deux approches décrites précédemment. La simulation impliquait que chaque nœud maintienne six voisins proches (basés sur le temps d’aller-retour (RTT)) et quatre nœuds aléatoires . Ces liens sont restés statiques tout au long de l’expérience (d’où les lignes bleues constantes). Dans la politique ‘deux groupes (<=100ms et >100ms)’, chaque nœud maintient un nombre fixe de liens proches et de liens distants : ‘fermé’ signifie que le RTT vers ce voisin est inférieur ou égal à 100 ms, tandis que 'distant ’ implique que le RTT est supérieur à 100 ms. Les nœuds démarrent avec tous les liens aléatoires et se calibrent périodiquement. Au cours de cet étalonnage, ils conservent jusqu’à un nombre fixe de voisins qui ont un RTT inférieur à 100 ms, et ils remplacent certains des voisins restants par des nœuds aléatoires nouvellement sélectionnés.

Cette politique à deux groupes sert d’approximation simple et efficace pour évaluer le comportement de la politique de notation. Il convient de noter, cependant, que cette politique n’est pas celle actuellement utilisée.

Figure 3. Politique Close-Random vs Peer Score

Dans la figure 3, une analyse comparative est présentée entre les résultats résultant de la politique Close-Random discutée précédemment et une politique différente de notation par les pairs. Cette politique alternative évalue les pairs en fonction de la fréquence à laquelle ils fournissent un nouvel en-tête de bloc au nœud avant les autres. Dans cette configuration expérimentale, les nœuds commencent par des liens aléatoires et subissent périodiquement un étalonnage. Au cours de ces intervalles d’étalonnage, les 20 % ou 40 % des pairs les moins performants sont remplacés par de nouveaux nœuds sélectionnés au hasard.

La ligne bleue dans le graphique représente la politique actuellement utilisée (plus de détails à ce sujet peuvent être trouvés dans la section suivante). La ligne verte illustre l’optimum théorique.

En examinant attentivement ce graphique et en établissant des comparaisons avec le précédent, nous pouvons identifier les principales variations dans l’efficacité des différentes politiques de notation. Néanmoins, il est essentiel de garder à l’esprit que ces variations ne sont pas directement comparables en raison des différents paramètres appliqués dans chaque expérience. Certaines expériences mesurent le temps de diffusion complet, tandis que d’autres considèrent le 99e centile, ce qui représente une valeur légèrement inférieure. De plus, les traces de latence entre les nœuds diffèrent d’une expérience à l’autre, ce qui conduit à des résultats distincts.

Dans ce contexte, le 99e centile pour la politique des 20 % montre un équilibre inférieur par rapport aux deux groupes . Cependant, il ne s’agit pas d’une comparaison directe «des pommes avec des pommes» pour les raisons énoncées ci-dessus.

La politique que nous employons actuellement va au-delà de l’utilisation du RTT lors de la sélection des pairs. Dans notre quête d’une approche plus robuste et fiable, nous avons cherché une alternative qui refléterait avec précision l’utilité d’un pair. Cela nous a amené au concept de récompenser les pairs pour être les premiers à présenter un nœud avec un nouvel en-tête ou un nouveau bloc. Cette approche présente une mesure authentique de la contribution d’un pair au réseau et, contrairement à RTT, elle ne peut pas être facilement manipulée ou falsifiée.

Mise en réseau P2P basée sur des informations locales

Dans la conception Dynamic P2P, chaque nœud conserve une vue locale du réseau et évalue les connexions potentielles en tenant compte des performances historiques. Les nœuds surveillent et ajustent en permanence leurs connexions, recherchant des pairs plus performants pour optimiser leur position sur le réseau et minimiser le nombre de sauts requis pour le relais de bloc.

Chaque nœud gère trois ensembles de nœuds homologues connus :

  • Cold peers : pairs connus sans connexion réseau établie.
  • Pairs chauds : pairs avec une connexion porteuse établie, utilisés pour les mesures de réseau mais pas pour les protocoles de consensus au niveau de l’application, leur rôle principal est de servir d’ensemble de nœuds facilement disponibles .
  • Homologues chauds : homologues avec une connexion de support active, utilisés pour les protocoles de consensus au niveau de l’application.

Comme mentionné précédemment, les nœuds conservent des informations limitées sur ces pairs, sur la base des interactions directes précédentes. Pour les nœuds froids, ces informations peuvent souvent être absentes en raison du manque d’interactions directes préalables. Cette information ressemble à la « réputation » dans d’autres systèmes, mais il est essentiel de souligner qu’elle est purement locale et non partagée avec un autre nœud.

Figure 4. Découverte par les pairs sur Cardano

La figure 4 illustre le cycle de promotion/rétrogradation, géré par le gouverneur de sélection des pairs (PSG). Ce composant est chargé d’atteindre des objectifs spécifiques, tels que le maintien d’un nombre désigné de pairs connus et actifs.

De plus, une configuration statique locale peut être utilisée pour désigner certains nœuds comme homologues chauds ou chauds. Cette approche permet des relations fixes entre les nœuds gérés par une seule organisation, comme un pool de participation avec plusieurs relais. Il facilite également les accords d’appairage privés entre les SPO et d’autres scénarios de déploiement potentiels.

En cas de comportement contradictoire, un pair peut être immédiatement rétrogradé des ensembles chaud, chaud et froid. La décision est de ne pas conserver les informations négatives sur les pairs pendant de longues périodes afin de limiter la consommation de ressources dans un système sans autorisation, car cela pourrait potentiellement simplifier les attaques Sybil.

Barattage et politiques locales

Le gouverneur de désabonnement des pairs (PCG) est un composant qui joue un rôle central dans la gestion de la santé et de l’efficacité d’un réseau en naviguant sur les problèmes liés à la partition du réseau et aux attaques d’éclipse, en ajustant les valeurs des cibles pour les pairs chauds, chauds et froids. afin de favoriser leur barattage.

Dans ce processus, le PCG modifie la fréquence à laquelle les pairs sont promus (mis à niveau de froid à chaud, ou chaud à chaud) ou rétrogradés (rétrogradés de chaud à chaud, ou chaud à froid). Cette décision est guidée par des fonctions de notation qui évaluent les pairs en fonction de leur utilité et de leurs performances.

Ces fonctions de notation comprennent :

  • Politique de rétrogradation à chaud : chargée de déterminer quels pairs “à chaud” (très actifs et précieux) doivent être rétrogradés. Le score est calculé sur la base de la contribution d’un pair au réseau, en tenant compte de facteurs tels que le nombre de blocs qu’il a été le premier à fournir et/ou le nombre d’ octets qu’il a fournis. Pendant le fonctionnement normal, une combinaison de ces facteurs est utilisée pour calculer le score. Cependant, lors de la synchronisation des données de synchronisation en masse, le nombre d’octets fournis est prioritaire.
  • Politique de rétrogradation à chaud et politique d’oubli à froid : gérez les pairs « chauds » et « froids », en déterminant quels pairs doivent être rétrogradés ou supprimés du réseau. Ces décisions sont influencées par un certain degré d’aléatoire et diverses caractéristiques. Les facteurs pris en compte incluent les échecs antérieurs ou un indicateur de tiédeur, qui indique une fiabilité moindre ou des niveaux d’activité inférieurs chez les pairs.

Pendant le processus de synchronisation du nœud, le PCG s’assure que pas plus de deux connexions actives sont utilisées pour éviter la surutilisation des ressources. Une fois le nœud entièrement synchronisé, le PCG facilite l’attrition périodique, actualisant 20 % des pairs toutes les heures. Cela favorise un réseau robuste et adaptable.

Bien que les politiques proches du hasard ou basées sur les scores explorées dans la recherche ne soient pas directement reproduites dans l’environnement de production, elles ont considérablement influencé la conception des politiques mises en œuvre. Ainsi, les résultats de la recherche ont joué un rôle crucial dans l’élaboration des politiques de mise en réseau au sein de l’environnement de production de Cardano.

Approche de développement

L’implémentation P2P de Cardano est basée sur Haskell, un langage de programmation fonctionnel largement reconnu pour son exactitude, sa sécurité et sa maintenabilité. Le système de type robuste de Haskell aide à détecter les problèmes potentiels pendant le développement, ce qui se traduit par un code plus robuste et plus fiable. De plus, l’équipe de mise en réseau a développé et utilise désormais io-sim , une bibliothèque de simulation d’événements discrets basée sur le temps qui offre un contrôle précis de l’entropie et de la synchronisation dans les simulations. Cet outil reproduit fidèlement le système d’exécution de Haskell, y compris des fonctionnalités telles que la mémoire transactionnelle logicielle (STM), _MVar_s, etc. Ce niveau de contrôle permet la reproductibilité, les tests de régression et l’examen des pires scénarios. La combinaison de Haskell etio-simpermet des tests rigoureux du même code utilisé dans le système de production P2P dans un large éventail de conditions, garantissant sa préparation pour relever les défis du monde réel.

Dans le cadre de son engagement à construire un système fiable, l’équipe de mise en réseau a effectué des tests approfondis basés sur les propriétés. Ces tests ont été spécialement conçus pour découvrir des bogues complexes et des cas particuliers qui pourraient passer inaperçus dans les approches de test traditionnelles telles que les tests unitaires. Un aspect distinctif du processus de test est l’inclusion de simulations qui reproduisent des années de fonctionnement du système. Cette approche globale permet d’imiter des années d’activité, en découvrant des bogues rares qui ne peuvent apparaître que dans des conditions spécifiques ou prolongées. Cependant, il est important de noter que la qualité de ces tests dépend finalement de la qualité des générateurs utilisés. Les générateurs jouent un rôle essentiel dans la production d’entrées diverses et représentatives pour une évaluation approfondie.

Source : https://www.essentialcardano.io/article/engineering-dive-into-cardanos-dynamic-p2p-design