Networking
libp2p host, gossip, sync, and direct messaging
XE is a fully peer-to-peer network with no central servers. All node communication -- block propagation, consensus voting, synchronization, marketplace negotiation, and peer discovery -- happens over direct connections between nodes using libp2p.
#Components
| Component | Purpose | Protocol / Mechanism |
|---|---|---|
| Host | TCP transport, connection management, persistent identity | libp2p core |
| GossipSub | Broadcast blocks, votes, marketplace, statechain, directory | libp2p GossipSub |
| Sync | Frontier-based block synchronization | /xe/sync/1.0.0 stream |
| Messaging | Request-response over streams | /xe/msg/1.0.0 stream |
| DHT | Kademlia peer discovery | /xe prefixed DHT |
#Architecture Overview
┌──────────────────────────────────────────────────────────┐│ Node ││ ││ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ ││ │ Ledger │ │ State Chain │ │ Directory │ ││ └──────┬──────┘ └──────┬──────┘ └───────┬─────────┘ ││ │ │ │ ││ ┌──────┴────────────────┴──────────────────┴─────────┐ ││ │ Network Layer (net package) │ ││ │ │ ││ │ ┌──────────┐ ┌──────┐ ┌──────────┐ ┌───────────┐ │ ││ │ │ GossipSub│ │ Sync │ │Messenger │ │ DHT │ │ ││ │ └────┬─────┘ └──┬───┘ └────┬─────┘ └─────┬─────┘ │ ││ └───────┼──────────┼──────────┼──────────────┼───────┘ ││ │ │ │ │ ││ ┌───────┴──────────┴──────────┴──────────────┴───────┐ ││ │ libp2p Host (TCP transport) │ ││ └────────────────────────┬───────────────────────────┘ │└───────────────────────────┼──────────────────────────────┘ │ TCP / Internet#How Data Flows
#Block Propagation
- A node creates a new block (send, receive, claim, lease, etc.)
- The block is added to the local ledger
- The block is published via GossipSub on the
xe/blockstopic - All subscribed peers receive the block, validate it, and add it to their ledgers
- If the block triggers a conflict, votes are broadcast on
xe/votes
#Synchronization
When a new node joins or reconnects after downtime, it uses the sync protocol to catch up:
- On connection to a peer, the node sends its current frontiers (latest block per account)
- The peer compares frontiers and streams back any missing blocks
- A periodic re-sync every 10 seconds catches blocks missed during gossip
#Peer-to-Peer Messaging
The messaging protocol provides request-response semantics for targeted communication:
- Marketplace negotiation (resource requests and offers)
- State chain synchronization
- Any typed message exchange between specific peers
#Discovery Mechanisms
Peers find each other through three mechanisms:
- mDNS -- Automatic local network discovery. Nodes on the same LAN find each other without configuration.
- Bootstrap peers -- Explicit peer addresses passed via the
-dialflag. The node retries failed connections every 10 seconds. - Kademlia DHT -- Distributed hash table for discovering peers by their peer ID. Used by the Messenger to locate peers not already in the peerstore.
#Security Properties
- Transport encryption: libp2p provides encrypted connections by default (Noise or TLS 1.3)
- Peer identity: Each node has a persistent Ed25519 identity key, giving it a stable peer ID across restarts
- Message validation: GossipSub pre-validates field lengths before accepting messages
- Rate limiting: Sync protocol enforces a 5-second cooldown per peer to prevent abuse
- Size limits: All protocols enforce maximum message sizes to prevent memory exhaustion
#Source Code
The networking layer lives in the core/net/ package:
| File | Contents |
|---|---|
host.go | Host creation, mDNS discovery, peer dialing |
gossip.go | GossipSub for all broadcast topics |
sync.go | Frontier-based block synchronization |
msg.go | Request-response messaging protocol |
dht.go | Kademlia DHT setup |
messages.go | Wire format types for all message types |