Rete P2P
Savitri Network utilizza libp2p 0.55 per tutte le comunicazioni peer-to-peer.
Stack di Trasporto
| Livello | Tecnologia |
|---|---|
| Trasporto | TCP |
| Cifratura | Protocollo Noise |
| Multiplexing | Yamux |
| Scoperta | Kademlia DHT |
| Pub/Sub | Gossipsub |
| Identità | Chiavi peer Ed25519 |
Topic Gossipsub
| Topic | Pubblicatore | Sottoscrittore | Scopo |
|---|---|---|---|
/savitri/tx/1 | Lightnodes | Lightnodes, Masternodes | Broadcast transazioni |
/savitri/block/1 | Lightnodes | Tutti i nodi | Broadcast blocchi |
/savitri/consensus/cert/1 | Lightnodes | Masternodes, Observer | Certificati di accettazione blocco |
/savitri/peer_registry/1 | Tutti i nodi | Masternodes | Keepalive peer / registrazione |
/savitri/lightnode/group/announce/1 | Masternodes | Lightnodes | Assegnazioni di gruppo |
/savitri/group/{id}/election | Membri del gruppo | Membri del gruppo | Elezioni per gruppo |
Configurazione Gossipsub
| Parametro | 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 KB | 256 KB |
flood_publish | false | true (tutti i sottoscrittori) |
Compressione dei Messaggi
| Formato | Stato | Caso d'uso |
|---|---|---|
| snap | Abilitato | Messaggi P2P generali |
| lz4 | Abilitato | Percorsi ad alto throughput |
| zstd | Disabilitato su MSVC | Non utilizzato su Windows |
Liveness dei Peer
Lightnode
- Condivisione punteggio PoU: Pubblica tramite gossipsub ogni 60 secondi
- Sonde di latenza: Ogni 30 secondi tramite P2P diretto
- Heartbeat: Pubblicazione gossipsub su
/savitri/peer_registry/1
Masternode
- Aggiornamento
last_seen: Aggiornato ad OGNI messaggio gossipsub da un peer - Timeout inattività: 600 secondi (configurabile nella configurazione MN)
cleanup_inactive(): Rimuove i nodi che superano il timeout- Gestore SlowPeer: Disconnette i peer con code di invio saturate
Observer
- Heartbeat ogni 30 secondi: Pubblica su
/savitri/peer_registry/1 - Si iscrive a:
/savitri/consensus/cert/1e/savitri/block/1
Bootstrap
I peer di bootstrap sono configurati in config/bootstrap_nodes.json:
[
{
"peer_id": "12D3KooW...",
"address": "/ip4/3.120.x.x/tcp/4001"
}
]
I nodi si connettono ai peer di bootstrap all'avvio e scoprono ulteriori peer tramite Kademlia DHT.
P2P Diretto (Richiesta-Risposta)
Alcune operazioni utilizzano la comunicazione peer-to-peer diretta invece di gossipsub:
| Operazione | Protocollo |
|---|---|
| Sonde di latenza | Richiesta-risposta diretta |
| ACK PoU | Risposta punto a punto |
| Candidati all'elezione | P2P diretto |
Questo evita il costo O(N^2) del broadcast per operazioni che devono raggiungere solo peer specifici.
Porte di Rete
| Porta | Protocollo | Servizio |
|---|---|---|
| 4001 | TCP | P2P (libp2p) predefinito |
| 8333 | TCP | P2P (alternativo) |
| 8545 | HTTP | RPC (JSON-RPC 2.0) |
| 8546 | WS | WebSocket |
| 9090 | HTTP | Metriche Prometheus |
Configurazione
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
Filtraggio dei Log
Per ridurre i log gossipsub prolissi:
RUST_LOG=info,libp2p_gossipsub::behaviour=error
Questo sopprime gli avvisi della coda di invio che includono i payload completi dei messaggi (1-2 KB ciascuno, causando log da 120MB+).