Networking

libp2p host, peer admission, GossipSub topics, frontier sync, DHT, and request-response messaging.


Fully peer-to-peer using libp2p. No central servers.

Components

ComponentPurposeProtocol
HostTCP transport, connection managementlibp2p core
NetcheckPeer admission — network-ID + version handshake/xe/netcheck/1
GossipSubBroadcast blocks, votes, marketplace, statechain, directorylibp2p GossipSub
SyncFrontier-based block synchronization/xe/sync/1.0.0
Statechain syncState-chain block synchronization/xe/statechain-sync/1.0.0
MessagingRequest-response over streams/xe/msg/1.0.0
TunnelSSH-over-network tunnels to leased VMs/xe/tunnel/2.0.0
DHTKademlia peer discovery/xe prefix

Discovery Mechanisms

  1. mDNS — automatic local network discovery
  2. Bootstrap peers — explicit via -dial flag; a watchdog re-dials disconnected bootstraps every 30s (10s timeout per dial)
  3. Kademlia DHT — distributed hash table with /xe prefix

GossipSub Topics

TopicData Type
xe/blocksBlock
xe/votesVote
xe/marketplaceMarketplaceMsg
xe/statechainStateChainBlock
xe/directoryRegistration
xe/certificatesCertificate

Max gossip message size: 256 KB.

Sync Protocol

  • Frontier-based: exchange account → latest block hash
  • Paginated responses (default 64 blocks/page, max 256)
  • Max 10,000 blocks per sync session
  • 5-second per-peer cooldown
  • Periodic re-sync every 10 seconds (with dirty flag optimization)
  • Cross-account dependency retry passes, with early exit when a pass makes no progress
  • Block quarantine for permanently invalid blocks

Messaging Protocol

  • Request-response semantics
  • 30-second stream deadline
  • 64 KB max request/response
  • Message types: vm_credentials, vm_status, account_chat, attest_timestamp, block_request, vote_request, cert_request
  • block_request, vote_request, and cert_request are targeted sync-repair RPCs — a node missing a block body, an election's votes, or a lease certificate asks a peer for it directly
  • DHT-based peer discovery fallback

Security

  • Peer admission: on connect, peers exchange network ID and protocol version over /xe/netcheck/1; a mismatch disconnects the peer and applies a bounded ban. After a testnet wipe, this is why a node built against the wrong network ID silently fails to join.
  • Inbound connections are capped per source IP (default 8, --max-conns-per-ip)
  • Transport encryption (Noise or TLS 1.3)
  • Persistent Ed25519 identity
  • GossipSub pre-validates field lengths
  • Sync rate limiting (5s per peer)
  • Max message sizes enforced

Host Configuration

  • TCP on all interfaces, configurable port
  • Connection manager: low=100, high=400, grace=1min
  • Persistent identity at {dataDir}/host.key
  • Optional relay + hole-punching support