Network Implementation

Technology Stack

Core Components

  1. Express.js Server
  • Main node communication
  • REST API endpoints
  • Easy to implement and debug
  • Existing middleware ecosystem
  1. WebSocket Libraries

Socket.io

  • Pros:
    • Built-in room support
    • Automatic reconnection
    • Fallback to long-polling
    • Large ecosystem
    • Easy to integrate with Express
  • Cons:
    • Some overhead
    • More complex than needed for simple cases

ws (WebSocket)

  • Pros:
    • Lightweight
    • Raw WebSocket implementation
    • High performance
    • Low overhead
  • Cons:
    • Less features out of box
    • Manual reconnection handling

uWebSockets.js

  • Pros:
    • Extremely high performance
    • Low latency
    • Low memory footprint
  • Cons:
    • Less Node.js-like API
    • Fewer examples/resources

NAT Traversal

  1. node-nat-upnp
interface UPNPConfig {
  port: number;
  protocol: 'UDP' | 'TCP';
  description: string;
  ttl: number;
  private: boolean;
}

// Usage example
const upnp = require('node-nat-upnp').createClient();
upnp.portMapping({
  public: 4242,
  private: 4242,
  ttl: 0,
  description: 'BrightChain Node',
});
  1. nat-puncher
  • Handles both UPnP and NAT-PMP
  • Modern implementation
  • TypeScript support
  1. node-nat-pmp
  • Specifically for NAT-PMP
  • Apple’s protocol
  • Simpler than UPnP

Node Discovery

  1. Local Network
interface DiscoveryConfig {
  port: number;
  multicastAddress: string;
  broadcastInterval: number;
  nodeTimeout: number;
}

interface NodeAdvertisement {
  nodeId: string;
  address: string;
  port: number;
  capabilities: string[];
  version: string;
}
  1. Bootstrap Nodes
interface BootstrapConfig {
  nodes: {
    address: string;
    port: number;
    isStatic: boolean;
  }[];
  retryInterval: number;
  maxRetries: number;
}
  1. DNS Seeds
interface DNSSeeds {
  seeds: string[]; // List of DNS names
  queryInterval: number;
  timeout: number;
}

Implementation Plan

1. Basic Node Server

interface NodeServer {
  // HTTP/REST Server
  express: Express;
  // WebSocket Server
  ws: WebSocket.Server;

  // Configuration
  config: {
    httpPort: number;
    wsPort: number;
    upnp: boolean;
    discovery: DiscoveryConfig;
  };

  // Node state
  state: {
    peers: Map<string, PeerInfo>;
    blocks: Map<string, BlockMetadata>;
    pendingSync: Set<string>;
  };
}

interface PeerInfo {
  nodeId: string;
  address: string;
  httpPort: number;
  wsPort: number;
  lastSeen: Date;
  capabilities: Set<string>;
  status: PeerStatusType;
}

2. REST Endpoints

// Node Information
GET /node/info
GET /node/peers
GET /node/status

// Block Operations
GET /blocks/:id
GET /blocks/:id/metadata
POST /blocks/:id/temperature
POST /blocks/:id/location

// Synchronization
POST /sync/request
POST /sync/metadata
POST /sync/temperature

// Network Operations
POST /peers/announce
POST /peers/disconnect

3. WebSocket Events

enum WSEventType {
  // Node Events
  NODE_ANNOUNCE = 'node:announce',
  NODE_LEAVE = 'node:leave',
  NODE_STATUS = 'node:status',

  // Block Events
  BLOCK_TEMPERATURE = 'block:temperature',
  BLOCK_LOCATION = 'block:location',
  BLOCK_SYNC = 'block:sync',

  // Metadata Events
  METADATA_UPDATE = 'metadata:update',
  METADATA_SYNC = 'metadata:sync',

  // System Events
  PING = 'system:ping',
  PONG = 'system:pong',
}

interface WSMessage {
  type: WSEventType;
  data: any;
  timestamp: number;
  sender: string;
}

4. Batch Updates

interface BatchUpdate {
  batchId: string;
  timestamp: number;
  updates: {
    type: 'TEMPERATURE' | 'LOCATION' | 'METADATA';
    blockId: string;
    data: any;
  }[];
}

interface BatchConfig {
  maxSize: number; // Maximum updates per batch
  interval: number; // Milliseconds between batches
  retryAttempts: number;
  retryDelay: number;
}

Security Considerations

  1. Authentication
interface NodeAuthentication {
  // Node identity
  nodeId: string;
  publicKey: string;

  // Authentication
  challenge: Buffer;
  signature: Buffer;

  // Session
  token: string;
  expiry: Date;
}
  1. Message Signing
interface SignedMessage {
  payload: any;
  timestamp: number;
  nodeId: string;
  signature: string;
}
  1. Rate Limiting
interface RateLimitConfig {
  window: number; // Time window in ms
  maxRequests: number; // Max requests per window
  blacklistThreshold: number;
  blacklistDuration: number;
}

Monitoring

  1. Node Metrics
interface NodeMetrics {
  uptime: number;
  peers: number;
  blocks: number;
  bandwidth: {
    in: number;
    out: number;
  };
  operations: {
    success: number;
    failed: number;
  };
}
  1. Network Health
interface NetworkHealth {
  activeNodes: number;
  totalBlocks: number;
  averageRedundancy: number;
  regionDistribution: Map<string, number>;
}

Next Steps

  1. Implementation Priority

    • Basic Express server
    • WebSocket integration
    • UPnP setup
    • Node discovery
    • Batch updates
  2. Testing Strategy

    • Unit tests for message handling
    • Integration tests for node communication
    • Network simulation tests
    • Load testing
  3. Documentation

    • API documentation
    • Network protocol specification
    • Deployment guide
    • Troubleshooting guide

Would you like to proceed with implementing any of these components?