Kademlia DHT
A comprehensive Dart implementation of the libp2p Kademlia Distributed Hash Table (DHT) for building decentralized peer-to-peer applications. This library provides the core infrastructure for peer discovery, content routing, and distributed key-value storage in P2P networks.
π Featured Implementation: IpfsDHTv2
Section titled βπ Featured Implementation: IpfsDHTv2βIpfsDHTv2 is our flagship implementation featuring a modular, production-ready architecture with enhanced performance, observability, and maintainability. Itβs a drop-in replacement for the original IpfsDHT with significant improvements.
π Key Improvements in v2
Section titled βπ Key Improvements in v2β- π Modular Architecture: Clean separation of concerns with focused components
- π Built-in Observability: Comprehensive metrics and monitoring out of the box
- π‘οΈ Enhanced Error Handling: Structured exceptions with retry logic
- β‘ Performance Optimized: Parallel operations and efficient routing
- π§ͺ Testing-Friendly: Dependency injection for easy testing
- π§ Flexible Configuration: Builder pattern for complex setups
π Features
Section titled βπ FeaturesβCore DHT Capabilities
Section titled βCore DHT Capabilitiesβ- Peer Discovery: Find peers by their ID across the network using Kademlia routing
- Content Routing: Discover who has specific content using content addressing (CID)
- Distributed Storage: Store and retrieve key-value pairs across the network
- Service Discovery: Advertise and find services in the P2P network
- Provider Records: Track and announce content availability across the network
Network Modes
Section titled βNetwork Modesβ- Client Mode: Lightweight mode for mobile and resource-constrained devices
- Server Mode: Full participant mode for infrastructure and bootstrap nodes
- Auto Mode: Automatically switches between client/server based on network conditions
Advanced Features
Section titled βAdvanced Featuresβ- Bootstrap Integration: Easy connection to existing libp2p networks with configurable bootstrap peers
- Routing Table Management: Kademlia-based peer routing with configurable bucket sizes
- Query Engine: Efficient parallel query execution with configurable concurrency
- Retry Logic: Configurable retry mechanisms with exponential backoff
- Network Size Estimation: Built-in network size estimation capabilities
Production-Ready Components
Section titled βProduction-Ready Componentsβ- Cryptographic Validation: Signed records with anti-replay protection
- 4-Phase Bootstrap: Comprehensive network connectivity with health monitoring
- Provider Operations: Complete network-integrated provider management
- Datastore Operations: Full local record storage with validation
- Metrics & Monitoring: Real-time performance tracking and health checks
π Quick Start
Section titled βπ Quick StartβInstallation
Section titled βInstallationβAdd the package to your pubspec.yaml:
dependencies: dart_libp2p_kad_dht: ^1.1.0 dart_libp2p: ^0.5.2 dcid: ^1.0.0Basic Usage with IpfsDHTv2
Section titled βBasic Usage with IpfsDHTv2βimport 'package:dart_libp2p_kad_dht/src/dht/v2/dht_v2.dart';import 'package:dart_libp2p/dart_libp2p.dart';
Future<void> main() async { // Create a libp2p host final host = await createLibp2pHost();
// Create a provider store for content routing final providerStore = MemoryProviderStore();
// Create and start the DHT v2 (recommended) final dht = IpfsDHTv2( host: host, providerStore: providerStore, options: const DHTOptions( mode: DHTMode.auto, bucketSize: 20, concurrency: 10, ), );
await dht.start(); await dht.bootstrap(); // Connect to the network
// Find a peer final peerInfo = await dht.findPeer(targetPeerId);
// Store a value (cryptographically signed) await dht.putValue('my-key', utf8.encode('my-value'));
// Retrieve a value (with validation) final value = await dht.getValue('my-key');
// Announce content availability await dht.provide(CID.fromString('QmExample...'), true);
// Find content providers await for (final provider in dht.findProvidersAsync(CID.fromString('QmExample...'), 10)) { print('Found provider: ${provider.id}'); }
// Check metrics final metrics = dht.metrics; print('Success rate: ${metrics.querySuccessRate * 100}%');
// Cleanup await dht.close(); await host.close();}Critical: Initialization Order
Section titled βCritical: Initialization OrderβYou must start the DHT before starting the host. When host.start() is called, AutoRelay immediately connects to relay servers and triggers an Identify exchange. If the DHT hasnβt registered its protocol handler yet, the first Identify response will be missing /ipfs/kad/1.0.0. Go-based peers that receive this will mark your node as βpeer stopped dhtβ and refuse to open DHT streams to it β breaking peer discovery permanently for that connection.
// CORRECT β DHT starts first, then hostfinal host = await createLibp2pHost(); // Do NOT call host.start() yetfinal dht = IpfsDHTv2(host: host, providerStore: store, options: options);await dht.start(); // Registers /ipfs/kad/1.0.0 protocol handlerawait host.start(); // Now AutoRelay's Identify will include DHT protocolawait dht.bootstrap();
// WRONG β host starts before DHTfinal host = await createLibp2pHost();await host.start(); // AutoRelay connects, Identify sent WITHOUT /ipfs/kad/1.0.0final dht = IpfsDHTv2(host: host, providerStore: store, options: options);await dht.start(); // Too late β Go already marked us "peer stopped dht"This applies to any protocol handler that must be advertised via Identify β always register handlers before host.start().
Advanced Configuration with Builder Pattern
Section titled βAdvanced Configuration with Builder Patternβimport 'package:dart_libp2p_kad_dht/src/dht/v2/config/dht_config.dart';
// Use builder pattern for complex configurationfinal config = DHTConfigBuilder() .mode(DHTMode.server) .bucketSize(25) .concurrency(15) .filterLocalhost(false) .networkTimeout(Duration(seconds: 30)) .queryTimeout(Duration(seconds: 60)) .enableMetrics(true) .optimisticProvide(true) .build();
final dht = IpfsDHTv2( host: host, providerStore: providerStore, options: config.toOptions(),);π Examples
Section titled βπ ExamplesβInteractive P2P Node (v2)
Section titled βInteractive P2P Node (v2)βRun a fully interactive P2P node with all DHT operations:
dart run example/basic_p2p_node.dartAvailable Commands:
stats- Show network statistics and metricsstore <key> <value>- Store a cryptographically signed key-value pairget <key>- Retrieve a validated valueannounce <content-id>- Announce content availabilityfind-content <content-id>- Find content providersfind-peer <peer-id>- Find a specific peermetrics- Show detailed performance metricsquit- Exit the demo
Mobile Optimized Node
Section titled βMobile Optimized NodeβFor resource-constrained environments:
dart run example/mobile_p2p_node.dartServer Node
Section titled βServer NodeβHigh-performance server deployment:
dart run example/server_node.dart --port 4001π§ Configuration
Section titled βπ§ ConfigurationβDHT v2 Options
Section titled βDHT v2 Optionsβfinal dhtOptions = DHTOptions( mode: DHTMode.auto, // client, server, or auto bucketSize: 20, // K-bucket size concurrency: 10, // Concurrent operations resiliency: 3, // Query redundancy bootstrapPeers: [ // Network entry points AddrInfo(peerId1, [addr1]), AddrInfo(peerId2, [addr2]), ],);Advanced Configuration with Builder
Section titled βAdvanced Configuration with Builderβfinal config = DHTConfigBuilder() .mode(DHTMode.server) .bucketSize(30) .concurrency(20) .resiliency(5) .networkTimeout(Duration(seconds: 30)) .queryTimeout(Duration(seconds: 60)) .enableMetrics(true) .optimisticProvide(true) .maxRetryAttempts(5) .retryInitialBackoff(Duration(milliseconds: 250)) .build();ποΈ Architecture
Section titled βποΈ ArchitectureβDHT v2 Modular Components
Section titled βDHT v2 Modular Componentsβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ IpfsDHTv2 ββ (Main Interface) ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€β βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ β Network β β Routing β β Query β ββ β Manager β β Manager β β Manager β ββ βββββββββββββββ βββββββββββββββ βββββββββββββββ ββ ββ βββββββββββββββ βββββββββββββββ ββ β Protocol β β Metrics β ββ β Manager β β Manager β ββ βββββββββββββββ βββββββββββββββ ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββComponent Responsibilities
Section titled βComponent Responsibilitiesβ- NetworkManager: Message handling, connection management, retry logic
- RoutingManager: Routing table management, peer discovery, bootstrap
- QueryManager: Query coordination, peer lookups, value operations
- ProtocolManager: Protocol message processing, request/response handling
- MetricsManager: Performance monitoring, error tracking, health checks
π Monitoring & Metrics
Section titled βπ Monitoring & MetricsβDHT v2 provides comprehensive monitoring out of the box:
final metrics = dht.metrics;
// Query metricsprint('Total queries: ${metrics.totalQueries}');print('Success rate: ${metrics.querySuccessRate * 100}%');print('Average latency: ${metrics.averageQueryLatency.inMilliseconds}ms');
// Network metricsprint('Network requests: ${metrics.totalNetworkRequests}');print('Network success rate: ${metrics.networkSuccessRate * 100}%');
// Routing table metricsprint('Routing table size: ${metrics.routingTableSize}');print('Peers added: ${metrics.peersAdded}');
// Performance metricsprint('Queries per second: ${metrics.queriesPerSecond}');print('Network requests per second: ${metrics.networkRequestsPerSecond}');π‘οΈ Error Handling
Section titled βπ‘οΈ Error HandlingβDHT v2 provides structured error handling:
try { final peer = await dht.findPeer(targetPeerId);} on DHTNetworkException catch (e) { print('Network error: ${e.message}'); // Handle network-specific errors} on DHTTimeoutException catch (e) { print('Timeout error: ${e.message}'); // Handle timeout-specific errors} on DHTException catch (e) { print('DHT error: ${e.message}'); // Handle general DHT errors}π§ͺ Testing
Section titled βπ§ͺ TestingβRun the comprehensive test suite:
dart testThe test suite includes:
- Unit tests for all components
- Integration tests with real network scenarios
- Performance benchmarks
- Mobile device simulation tests
π Documentation
Section titled βπ Documentationβ- Developer Guide: Comprehensive guide for P2P application developers
- Examples: Detailed examples and use cases
- DHT v2 Documentation: Complete v2 architecture guide
- Integration Tests: Real-world usage patterns
π Migration from Original DHT
Section titled βπ Migration from Original DHTβSimple Migration
Section titled βSimple Migrationβ// Oldimport 'package:dart_libp2p_kad_dht/src/dht/dht.dart';final dht = IpfsDHT(host: host, providerStore: providerStore, options: options);
// New (recommended)import 'package:dart_libp2p_kad_dht/src/dht/v2/dht_v2.dart';final dht = IpfsDHTv2(host: host, providerStore: providerStore, options: options);Benefits of Migration
Section titled βBenefits of Migrationβ- Better error handling: Structured exceptions and retry logic
- Improved observability: Built-in metrics and monitoring
- Better testability: Modular design and dependency injection
- Enhanced performance: Optimized query patterns and caching
- Future-proof: Easier to extend and maintain
π€ Contributing
Section titled βπ€ ContributingβWe welcome contributions! Please see our contributing guidelines:
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Ensure all tests pass
- Submit a pull request
Development Setup
Section titled βDevelopment Setupβ# Clone the repositorygit clone https://github.com/stephanfeb/dart_libp2p_kad_dht.gitcd dart_libp2p_kad_dht
# Install dependenciesdart pub get
# Run testsdart test
# Run examplesdart run example/basic_p2p_node.dartπ License
Section titled βπ LicenseβThis project is licensed under the MIT License - see the LICENSE file for details.
π Acknowledgments
Section titled βπ Acknowledgmentsβ- Based on the go-libp2p-kad-dht implementation
- Implements the Kademlia DHT algorithm
- Built for the libp2p networking stack
π Related Projects
Section titled βπ Related Projectsβ- dart_libp2p: Core libp2p networking library
- dcid: Content addressing utilities
- dart_udx: UDP-based transport layer
π Support
Section titled βπ Supportβ- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentation: Developer Guide
Built with β€οΈ for the decentralized web