Réseau P2P
Le réseau Savitri utilise libp2p 0.55 pour toutes les communications pair-à-pair.
Pile de transport
| Couche | Technologie |
|---|---|
| Transport | TCP |
| Chiffrement | Protocole Noise |
| Multiplexage | Yamux |
| Découverte | Kademlia DHT |
| Pub/Sub | Gossipsub |
| Identité | Clés de pairs Ed25519 |
Sujets Gossipsub
| Sujet | Éditeur | Abonné | Objectif |
|---|---|---|---|
/savitri/tx/1 | Lightnodes | Lightnodes, Masternodes | Diffusion de transactions |
/savitri/block/1 | Lightnodes | Tous les nœuds | Diffusion de blocs |
/savitri/consensus/cert/1 | Lightnodes | Masternodes, Observateur | Certificats d'acceptation de bloc |
/savitri/peer_registry/1 | Tous les nœuds | Masternodes | Maintien en vie / enregistrement des pairs |
/savitri/lightnode/group/announce/1 | Masternodes | Lightnodes | Affectations de groupes |
/savitri/group/{id}/election | Membres du groupe | Membres du groupe | Élections par groupe |
Configuration Gossipsub
| Paramètre | Lightnode | Masternode |
|---|---|---|
mesh_n | 8 | 8 |
mesh_n_high | 12 | 12 |
mesh_n_low | 4 | 4 |
mesh_outbound_min | 3 | 3 |
connection_handler_queue_len | 50 000 | 50 000 |
max_transmit_size | 256 Ko | 256 Ko |
flood_publish | false | true (tous les abonnés) |
Compression des messages
| Format | Statut | Cas d'usage |
|---|---|---|
| snap | Activé | Messages P2P généraux |
| lz4 | Activé | Chemins à débit élevé |
| zstd | Désactivé sur MSVC | Non 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/1et/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ération | Protocole |
|---|---|
| Sondes de latence | Requête-réponse directe |
| ACK PoU | Réponse point à point |
| Candidats à l'élection | P2P 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
| Port | Protocole | Service |
|---|---|---|
| 4001 | TCP | P2P (libp2p) par défaut |
| 8333 | TCP | P2P (alternatif) |
| 8545 | HTTP | RPC (JSON-RPC 2.0) |
| 8546 | WS | WebSocket |
| 9090 | HTTP | Mé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).