Red P2P
Savitri Network utiliza libp2p 0.55 para toda la comunicación entre pares.
Pila de Transporte
| Capa | Tecnología |
|---|---|
| Transporte | TCP |
| Cifrado | Protocolo Noise |
| Multiplexación | Yamux |
| Descubrimiento | Kademlia DHT |
| Pub/Sub | Gossipsub |
| Identidad | Claves de par Ed25519 |
Temas de Gossipsub
| Tema | Publicador | Suscriptor | Propósito |
|---|---|---|---|
/savitri/tx/1 | Lightnodes | Lightnodes, Masternodes | Difusión de transacciones |
/savitri/block/1 | Lightnodes | Todos los nodos | Difusión de bloques |
/savitri/consensus/cert/1 | Lightnodes | Masternodes, Observer | Certificados de aceptación de bloque |
/savitri/peer_registry/1 | Todos los nodos | Masternodes | Keepalive / registro de pares |
/savitri/lightnode/group/announce/1 | Masternodes | Lightnodes | Asignaciones de grupo |
/savitri/group/{id}/election | Miembros del grupo | Miembros del grupo | Elecciones por grupo |
Configuración de Gossipsub
| Parámetro | 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 (todos los suscriptores) |
Compresión de Mensajes
| Formato | Estado | Caso de Uso |
|---|---|---|
| snap | Activado | Mensajes P2P generales |
| lz4 | Activado | Rutas de alto rendimiento |
| zstd | Desactivado en MSVC | No utilizado en Windows |
Disponibilidad de Pares
Lightnode
- Compartición de puntuación PoU: Publica vía gossipsub cada 60 segundos
- Sondeos de latencia: Cada 30 segundos vía P2P directo
- Heartbeat: Publicación gossipsub en
/savitri/peer_registry/1
Masternode
- Actualización de
last_seen: Se actualiza con CUALQUIER mensaje gossipsub de un par - Tiempo de espera por inactividad: 600 segundos (configurable por la configuración de MN)
cleanup_inactive(): Elimina nodos que superan el tiempo de espera- Manejador SlowPeer: Desconecta pares con colas de envío saturadas
Observer
- Heartbeat de 30 segundos: Publica en
/savitri/peer_registry/1 - Se suscribe a:
/savitri/consensus/cert/1y/savitri/block/1
Bootstrap
Los pares de arranque se configuran en config/bootstrap_nodes.json:
[
{
"peer_id": "12D3KooW...",
"address": "/ip4/3.120.x.x/tcp/4001"
}
]
Los nodos se conectan a los pares de arranque al iniciarse y descubren pares adicionales mediante Kademlia DHT.
P2P Directo (Solicitud-Respuesta)
Algunas operaciones utilizan comunicación punto a punto directa en lugar de gossipsub:
| Operación | Protocolo |
|---|---|
| Sondeos de latencia | Solicitud-respuesta directa |
| ACK de PoU | Respuesta punto a punto |
| Candidatos de elección | P2P directo |
Esto evita la sobrecarga O(N^2) de difusión para operaciones que solo necesitan alcanzar pares específicos.
Puertos de Red
| Puerto | Protocolo | Servicio |
|---|---|---|
| 4001 | TCP | P2P (libp2p) por defecto |
| 8333 | TCP | P2P (alternativo) |
| 8545 | HTTP | RPC (JSON-RPC 2.0) |
| 8546 | WS | WebSocket |
| 9090 | HTTP | Métricas Prometheus |
Configuración
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
Filtrado de Registros
Para reducir los registros verbosos de gossipsub:
RUST_LOG=info,libp2p_gossipsub::behaviour=error
Esto suprime las advertencias de Cola de Envío que incluyen cargas de mensaje completas (1-2KB cada una, causando registros de más de 120MB).