# P2NS Network Topology This document illustrates what a large-scale P2NS network looks like with many peers, domains, and services. ## Network Overview A mature P2NS network consists of interconnected peers, each potentially claiming domains, voting on claims, and subscribing to services from other peers. ```mermaid graph TB subgraph Internet[Internet / Hyperswarm DHT] DHT[Distributed Hash Table] end subgraph Region1[Region: North America] P1[Peer: alice] P2[Peer: bob] P3[Peer: charlie] end subgraph Region2[Region: Europe] P4[Peer: diana] P5[Peer: erik] P6[Peer: fiona] end subgraph Region3[Region: Asia] P7[Peer: george] P8[Peer: hana] end P1 <--> DHT P2 <--> DHT P3 <--> DHT P4 <--> DHT P5 <--> DHT P6 <--> DHT P7 <--> DHT P8 <--> DHT P1 <-.-> P2 P2 <-.-> P3 P4 <-.-> P5 P5 <-.-> P6 P7 <-.-> P8 P1 <-.-> P4 P3 <-.-> P7 ``` ## Example Large Network ### Network Statistics | Metric | Value | |--------|-------| | Total Peers | 50 | | Active Peers | 42 | | Total Domains Claimed | 150 | | Unique Domains | 120 | | Contested Domains | 30 | | Total Services | 200+ | | Average Votes per Domain | 8 | ### Domain Distribution ```mermaid pie title Domain Ownership Distribution "Single Owner" : 90 "2 Claimants" : 20 "3+ Claimants" : 10 ``` ## Peer Roles In a large network, peers naturally take on different roles: ### Domain Owners Peers that claim and host domains: ``` Peer: alice (pk: a1b2c3...) ├── Claims: │ ├── my-blog.p2p (hs://abc123...) │ ├── photo-gallery.p2p (hs://def456...) │ └── api.my-blog.p2p (hs://ghi789...) ├── Services Published: │ ├── my-blog.p2p:web (port 443) │ ├── my-blog.p2p:api (port 8080) │ └── photo-gallery.p2p:web (port 443) └── Votes Cast: 45 domains ``` ### Service Consumers Peers that primarily subscribe to others' services: ``` Peer: bob (pk: d4e5f6...) ├── Claims: (none) ├── Subscriptions: │ ├── alice/my-blog.p2p:web -> localhost:8001 │ ├── diana/shop.p2p:web -> localhost:8002 │ └── erik/chat.p2p:* (subscribe-all) └── Votes Cast: 30 domains ``` ### Infrastructure Nodes High-availability peers that help maintain network health: ``` Peer: infra-node-1 (pk: x7y8z9...) ├── Claims: │ └── status.network.p2p ├── Uptime: 99.9% ├── Connected Peers: 48/50 ├── Votes Cast: 120 domains (all known) └── Role: Helps reach quorum for contested domains ``` ## Domain Lifecycle ### New Domain Claim ```mermaid sequenceDiagram participant Alice as alice participant Network as P2NS Network participant Bob as bob participant Charlie as charlie Alice->>Network: Claim "shop.p2p" (hs://abc...) Network->>Bob: Replicate claim Network->>Charlie: Replicate claim Note over Network: Auto-vote triggered Bob->>Network: Vote for alice/shop.p2p Charlie->>Network: Vote for alice/shop.p2p Note over Network: Quorum reached (3 votes) Network->>Alice: Consensus: resolved Network->>Bob: Consensus: resolved Network->>Charlie: Consensus: resolved ``` ### Contested Domain ```mermaid sequenceDiagram participant Alice as alice participant Network as P2NS Network participant Bob as bob participant Diana as diana Note over Network: "popular.p2p" claimed by alice Diana->>Network: Claim "popular.p2p" (hs://xyz...) Note over Network: Now 2 claimants Network->>Bob: Which claim to support? Bob->>Network: Vote for alice (older claim) Note over Network: Vote count: alice=25, diana=5 Note over Network: Quorum: 15 (30 peers * 0.5) Network->>Diana: Consensus: alice wins Diana->>Diana: Remove claim or keep trying ``` ## Service Mesh Large networks often develop service meshes where domains expose multiple services: ``` ┌─────────────────────────────────────────────────────────────┐ │ shop.example.p2p │ ├─────────────────────────────────────────────────────────────┤ │ Services: │ │ ├── web (hs://aaa...) port 443 - Main website │ │ ├── api (hs://bbb...) port 8080 - REST API │ │ ├── graphql (hs://ccc...) port 4000 - GraphQL endpoint │ │ ├── ws (hs://ddd...) port 3000 - WebSocket server │ │ └── metrics (hs://eee...) port 9090 - Prometheus metrics │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ chat.example.p2p │ ├─────────────────────────────────────────────────────────────┤ │ Services: │ │ ├── web (hs://fff...) port 443 - Web client │ │ ├── api (hs://ggg...) port 8080 - REST API │ │ └── rtc (hs://hhh...) port 5000 - WebRTC signaling │ └─────────────────────────────────────────────────────────────┘ ``` ### Subscriber View A peer subscribing to multiple services: ``` Local Port Mappings (bob's machine): ┌──────────────────────────────────────────────────────────┐ │ Local Port │ Remote Service │ Status │ ├──────────────────────────────────────────────────────────┤ │ 8001 │ shop.example.p2p:web │ Connected │ │ 8002 │ shop.example.p2p:api │ Connected │ │ 8003 │ chat.example.p2p:web │ Connected │ │ 8004 │ chat.example.p2p:api │ Connecting... │ │ 8005 │ blog.alice.p2p:web │ Connected │ │ 8006 │ status.network.p2p:metrics │ Connected │ └──────────────────────────────────────────────────────────┘ ``` ## Consensus at Scale Each peer maintains a local consensus Autobase sidecar replicated over Hyperswarm connections (`replicateConsensus`). The apply view converges as claim/vote events arrive in linearized order; reads do not scan the full Autopass ledger. ### Quorum Dynamics With 50 peers and default settings: ``` CONSENSUS_QUORUM_THRESHOLD = 0.5 CONSENSUS_MIN_VOTES = 2 Quorum requirement = max(2, ceil(50 * 0.5)) = 25 votes ``` ### Vote Distribution Example ``` Domain: popular-service.p2p Claimants: ├── alice (pk: a1b2...) - 28 votes ✓ WINNER ├── bob (pk: d4e5...) - 15 votes └── charlie (pk: g7h8...) - 7 votes Total votes: 50 Quorum: 25 ✓ Met Status: resolved -> alice ``` ### Network Partition Scenario ```mermaid graph TB subgraph Partition1[Partition A - 30 peers] PA1[alice] PA2[bob] PA3[...] PA4[30 peers total] end subgraph Partition2[Partition B - 20 peers] PB1[charlie] PB2[diana] PB3[...] PB4[20 peers total] end PA1 -.X.- PB1 Note1[Partition A: Quorum = 15, can resolve] Note2[Partition B: Quorum = 10, can resolve] ``` During partition: - Each partition calculates quorum based on visible peers - Resolutions may differ between partitions - On reconnection, claims/votes merge and re-resolve ## Plugin Distribution Large networks often have popular plugins replicated across peers: ``` Plugin: global.profile ├── Installed on: 45/50 peers (90%) ├── HyperDB replication: Active └── Profiles synced: 2,500+ Plugin: peer.directory ├── Installed on: 50/50 peers (100%) ├── Domains indexed: 150 └── Search queries/day: 500+ Plugin: domain.consensus ├── Installed on: 35/50 peers (70%) ├── Visualizations: Real-time └── Vote tracking: All domains ``` ## Scaling Considerations ### Subnet Allocation Large deployments need multiple subnets: ```env SUBNETS=[ {"base":"192.168.1.0","cidr":24,"startIndex":2,"name":"Primary"}, {"base":"192.168.2.0","cidr":24,"startIndex":2,"name":"Secondary"}, {"base":"192.168.3.0","cidr":24,"startIndex":2,"name":"Tertiary"}, {"base":"10.0.0.0","cidr":16,"startIndex":2,"name":"Extended"} ] ``` Capacity: - 3 x /24 subnets = 759 domains - 1 x /16 subnet = 65,534 domains - Total: 66,293 possible domains per peer ### Performance Tuning For large networks: ```env # Increase DNS pool for more concurrent queries DNS_POOL_SIZE=10 # Adjust consensus for larger peer counts CONSENSUS_QUORUM_THRESHOLD=0.3 CONSENSUS_MIN_VOTES=5 # Increase cache TTLs to reduce load # (configured in code, not env vars) ``` ### Resource Usage Estimated resources for a peer in a 50-peer network: | Resource | Typical Usage | |----------|---------------| | Memory | 200-500 MB | | CPU | 1-5% idle, 20% during sync | | Disk | 100 MB - 1 GB (depending on plugins) | | Bandwidth | 10-50 KB/s average | | Open connections | 50-100 | ## Network Health Monitoring ### Key Metrics to Watch ``` Dashboard: P2NS Network Health ┌────────────────────────────────────────────────────────┐ │ Connected Peers: 48/50 Uptime: 99.2% │ ├────────────────────────────────────────────────────────┤ │ Consensus Health: │ │ ├── Resolved domains: 115/120 (95.8%) │ │ ├── Quorum failures: 3 │ │ ├── Active ties: 2 │ │ └── Validation failures: 0 │ ├────────────────────────────────────────────────────────┤ │ Holesail Connections: │ │ ├── Servers running: 5 │ │ ├── Clients connected: 12 │ │ └── Failed connections: 1 │ ├────────────────────────────────────────────────────────┤ │ DNS Queries (last hour): │ │ ├── Total: 1,250 │ │ ├── P2P resolved: 800 (64%) │ │ ├── Public fallback: 400 (32%) │ │ └── Local DNS: 50 (4%) │ └────────────────────────────────────────────────────────┘ ``` ### Alerting Thresholds | Condition | Warning | Critical | |-----------|---------|----------| | Connected peers | < 80% | < 50% | | Quorum failures | > 5% | > 20% | | Holesail failures | > 10% | > 30% | | DNS resolution time | > 500ms | > 2000ms | ## Growth Patterns ### Organic Growth ``` Month 1: 5 peers, 10 domains, 20 services Month 3: 15 peers, 40 domains, 80 services Month 6: 30 peers, 100 domains, 200 services Year 1: 50 peers, 200 domains, 500 services Year 2: 100 peers, 500 domains, 1500 services ``` ### Trust Networks As networks grow, trust patterns emerge: ```mermaid graph LR subgraph TrustedCore[Trusted Core - High Vote Weight] T1[infra-1] T2[infra-2] T3[alice] T4[bob] end subgraph ActiveUsers[Active Users] A1[charlie] A2[diana] A3[erik] end subgraph NewPeers[New Peers] N1[new-1] N2[new-2] end T1 --> A1 T2 --> A2 T3 --> A3 A1 --> N1 A2 --> N2 ``` ## Related Documentation - [CONSENSUS.md](CONSENSUS.md) - Consensus mechanism details - [GLOSSARY.md](GLOSSARY.md) - Terms and concepts - [ARCHITECTURE.md](ARCHITECTURE.md) - System internals - [README.md](../README.md) - Getting started