Skip to main content

P2P Networking

Savitri Network uses libp2p 0.55 for all peer-to-peer communication.

Transport Stack

LayerTechnology
TransportTCP
EncryptionNoise protocol
MultiplexingYamux
DiscoveryKademlia DHT
Pub/SubGossipsub
IdentityEd25519 peer keys

Gossipsub Topics

TopicPublisherSubscriberPurpose
/savitri/tx/1LightnodesLightnodes, MasternodesTransaction broadcast
/savitri/block/1LightnodesAll nodesBlock broadcast
/savitri/consensus/cert/1LightnodesMasternodes, ObserverBlock acceptance certificates
/savitri/peer_registry/1All nodesMasternodesPeer keepalive / registration
/savitri/lightnode/group/announce/1MasternodesLightnodesGroup assignments
/savitri/group/{id}/electionGroup membersGroup membersPer-group elections

Gossipsub Configuration

ParameterLightnodeMasternode
mesh_n88
mesh_n_high1212
mesh_n_low44
mesh_outbound_min33
connection_handler_queue_len50,00050,000
max_transmit_size256 KB256 KB
flood_publishfalsetrue (all subscribers)

Message Compression

FormatStatusUse Case
snapEnabledGeneral P2P messages
lz4EnabledHigh-throughput paths
zstdDisabled on MSVCNot used on Windows

Peer Liveness

Lightnode

  • PoU score sharing: Publishes via gossipsub every 60 seconds
  • Latency probes: Every 30 seconds via direct P2P
  • Heartbeat: Gossipsub publish on /savitri/peer_registry/1

Masternode

  • last_seen refresh: Updated on ANY gossipsub message from a peer
  • Inactivity timeout: 600 seconds (configurable per MN config)
  • cleanup_inactive(): Removes nodes that exceed timeout
  • SlowPeer handler: Disconnects peers with saturated send queues

Observer

  • 30-second heartbeat: Publishes on /savitri/peer_registry/1
  • Subscribes to: /savitri/consensus/cert/1 and /savitri/block/1

Bootstrap

Bootstrap peers are configured in config/bootstrap_nodes.json:

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

Nodes connect to bootstrap peers on startup and discover additional peers via Kademlia DHT.

Direct P2P (Request-Response)

Some operations use direct peer-to-peer communication instead of gossipsub:

OperationProtocol
Latency probesDirect request-response
PoU ACKPoint-to-point response
Election candidatesDirect P2P

This avoids O(N^2) broadcast overhead for operations that only need to reach specific peers.

Network Ports

PortProtocolService
4001TCPP2P (libp2p) default
8333TCPP2P (alternative)
8545HTTPRPC (JSON-RPC 2.0)
8546WSWebSocket
9090HTTPPrometheus metrics

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

Log Filtering

To reduce verbose gossipsub logs:

RUST_LOG=info,libp2p_gossipsub::behaviour=error

This suppresses Send Queue warnings that include full message payloads (1-2KB each, causing 120MB+ logs).