Fully peer-to-peer using libp2p. No central servers.
Components
| Component | Purpose | Protocol |
|---|---|---|
| Host | TCP transport, connection management | libp2p core |
| Netcheck | Peer admission — network-ID + version handshake | /xe/netcheck/1 |
| GossipSub | Broadcast blocks, votes, marketplace, statechain, directory | libp2p GossipSub |
| Sync | Frontier-based block synchronization | /xe/sync/1.0.0 |
| Statechain sync | State-chain block synchronization | /xe/statechain-sync/1.0.0 |
| Messaging | Request-response over streams | /xe/msg/1.0.0 |
| Tunnel | SSH-over-network tunnels to leased VMs | /xe/tunnel/2.0.0 |
| DHT | Kademlia peer discovery | /xe prefix |
Discovery Mechanisms
- mDNS — automatic local network discovery
- Bootstrap peers — explicit via
-dialflag; a watchdog re-dials disconnected bootstraps every 30s (10s timeout per dial) - Kademlia DHT — distributed hash table with
/xeprefix
GossipSub Topics
| Topic | Data Type |
|---|---|
xe/blocks | Block |
xe/votes | Vote |
xe/marketplace | MarketplaceMsg |
xe/statechain | StateChainBlock |
xe/directory | Registration |
xe/certificates | Certificate |
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, andcert_requestare 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