Aller au contenu principal

Réseau P2P

Le réseau Savitri utilise libp2p 0.55 pour toutes les communications pair-à-pair.

Pile de transport

CoucheTechnologie
TransportTCP
ChiffrementProtocole Noise
MultiplexageYamux
DécouverteKademlia DHT
Pub/SubGossipsub
IdentitéClés de pairs Ed25519

Sujets Gossipsub

SujetÉditeurAbonnéObjectif
/savitri/tx/1LightnodesLightnodes, MasternodesDiffusion de transactions
/savitri/block/1LightnodesTous les nœudsDiffusion de blocs
/savitri/consensus/cert/1LightnodesMasternodes, ObservateurCertificats d'acceptation de bloc
/savitri/peer_registry/1Tous les nœudsMasternodesMaintien en vie / enregistrement des pairs
/savitri/lightnode/group/announce/1MasternodesLightnodesAffectations de groupes
/savitri/group/{id}/electionMembres du groupeMembres du groupeÉlections par groupe

Configuration Gossipsub

ParamètreLightnodeMasternode
mesh_n88
mesh_n_high1212
mesh_n_low44
mesh_outbound_min33
connection_handler_queue_len50 00050 000
max_transmit_size256 Ko256 Ko
flood_publishfalsetrue (tous les abonnés)

Compression des messages

FormatStatutCas d'usage
snapActivéMessages P2P généraux
lz4ActivéChemins à débit élevé
zstdDésactivé sur MSVCNon utilisé sous Windows

Disponibilité des pairs

Lightnode

  • Partage du score PoU : Publié via gossipsub toutes les 60 secondes
  • Sondes de latence : Toutes les 30 secondes via P2P direct
  • Pulsation : Publication gossipsub sur /savitri/peer_registry/1

Masternode

  • Rafraîchissement de last_seen : Mis à jour à chaque message gossipsub reçu d'un pair
  • Délai d'inactivité : 600 secondes (configurable par configuration MN)
  • cleanup_inactive() : Supprime les nœuds dépassant le délai d'expiration
  • Gestionnaire SlowPeer : Déconnecte les pairs dont les files d'envoi sont saturées

Observateur

  • Pulsation de 30 secondes : Publication sur /savitri/peer_registry/1
  • Abonné à : /savitri/consensus/cert/1 et /savitri/block/1

Amorçage

Les pairs d'amorçage sont configurés dans config/bootstrap_nodes.json :

[
{
"peer_id": "12D3KooW...",
"address": "/ip4/3.120.x.x/tcp/4001"
}
]

Les nœuds se connectent aux pairs d'amorçage au démarrage et découvrent des pairs supplémentaires via Kademlia DHT.

P2P direct (requête-réponse)

Certaines opérations utilisent la communication pair-à-pair directe plutôt que gossipsub :

OpérationProtocole
Sondes de latenceRequête-réponse directe
ACK PoURéponse point à point
Candidats à l'électionP2P direct

Cela évite la surcharge de diffusion en O(N^2) pour les opérations qui n'ont besoin d'atteindre que des pairs spécifiques.

Ports réseau

PortProtocoleService
4001TCPP2P (libp2p) par défaut
8333TCPP2P (alternatif)
8545HTTPRPC (JSON-RPC 2.0)
8546WSWebSocket
9090HTTPMétriques Prometheus

Configuration

config/development.toml

[network]
max_peers = 10
block_time_secs = 2
max_tps = 100
group_size = 3

config/production.toml

[network]
max_peers = 50
block_time_secs = 5
max_tps = 1000
group_size = 7
slashing_enabled = true

Filtrage des journaux

Pour réduire les journaux gossipsub verbeux :

RUST_LOG=info,libp2p_gossipsub::behaviour=error

Cela supprime les avertissements de file d'envoi qui incluent les charges utiles complètes des messages (1 à 2 Ko chacun, pouvant générer plus de 120 Mo de journaux).