14 KiB
Architecture — sdk_client
Ce document décrit l’architecture du module sdk_client
(bibliothèque cliente Silent Payments), ses modules internes, flux principaux et invariants. Il est centré sur le code de ce dépôt.
Périmètre
- Interface principale: WebAssembly via
wasm_bindgen
ettsify
. - Modules internes:
api.rs
(surface fonctionnelle),user.rs
(appareil local),wallet.rs
(portefeuille SP),peers.rs
(pair minimal),lib.rs
(agrégation). - Dépendances clés:
sdk_common
(cryptographie, SP, Merkle, PSBT),serde
,rand
,wasm-logger
.
Flux essentiels
- Initialisation/Pairing: création ou restauration d’appareil, appairage optionnel par
process_id
et adresses SP. - Traitement d’événements: analyse de transactions et messages chiffrés, mises à jour de processus, génération de diffs et commits.
- Gestion de processus: création et évolution d’états avec engagements PCD (racines Merkle) et règles/ rôles.
- Transactions SP: construction, dérivation des secrets partagés, signature et préparation de messages réseau.
Invariants
- Secrets jamais exposés en clair hors du module.
- États identifiés par racines Merkle, preuves cohérentes avec l’arbre.
- Rôles déterminent visibilité/validation des champs.
- Tailles et formats bornés à la frontière WASM.
Traçabilité documentaire
- Toute évolution doit être répercutée dans
docs/API.md
etdocs/USAGE.md
et les risques dansdocs/SECURITY_AUDIT.md
.
Ce guide décrit l'architecture technique détaillée de l'infrastructure 4NK Node, incluant la synchronisation entre relais et les composants système.
Vue d'Ensemble de l'Architecture
L'infrastructure 4NK Node est composée de plusieurs services interconnectés qui forment un système distribué pour les paiements silencieux Bitcoin.
Architecture Générale
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Bitcoin Core │ │ Blindbit │ │ SDK Relay 1 │
│ (Signet) │ │ (Service SP) │ │ (WebSocket) │
│ Port: 18443 │ │ Port: 8000 │ │ Port: 8090 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────────────┼───────────────────────┘
│
┌─────────────────┐
│ Docker Network │
│ (btcnet) │
└─────────────────┘
│
┌─────────────────┐
│ SDK Relay 2 │
│ (WebSocket) │
│ Port: 8092 │
└─────────────────┘
│
┌─────────────────┐
│ SDK Relay 3 │
│ (WebSocket) │
│ Port: 8094 │
└─────────────────┘
Composants Principaux
1. Bitcoin Core (Nœud Signet)
Rôle : Nœud Bitcoin Core configuré en mode signet pour le développement et les tests.
Caractéristiques :
- Port RPC : 18443
- Port ZMQ : 29000
- Réseau : Signet
- Validation : Complète des transactions
- Stockage : Blockchain complète
- Interface : JSON-RPC
Fonctionnalités :
- Validation des transactions
- Stockage de la blockchain
- Interface RPC pour les interactions
- Support des wallets
- Notifications ZMQ pour les événements
2. Service Blindbit
Rôle : Service pour les paiements silencieux (Silent Payments).
Caractéristiques :
- Port : 8000
- Interface : HTTP REST API
- Protocole : HTTP
Fonctionnalités :
- Génération d'adresses de paiement silencieux
- Validation des transactions
- Interface HTTP pour les interactions
- Gestion des clés et signatures
3. Service SDK Relay
Rôle : Relais pour les interactions SDK avec synchronisation mesh.
Caractéristiques :
- Port WebSocket : 8090
- Port HTTP : 8091
- Protocole : WebSocket/WSS
- Synchronisation : Mesh network
Fonctionnalités :
- Connexion au nœud Bitcoin Core
- Gestion des wallets
- Interface WebSocket
- Scan des blocs pour les paiements silencieux
- Synchronisation entre relais
- Cache de déduplication
Architecture de Synchronisation
Gestionnaire de Synchronisation (SyncManager
)
Le SyncManager
est le composant central qui gère toute la logique de synchronisation entre les relais :
pub struct SyncManager {
relay_id: String,
sequence_counter: Arc<Mutex<u64>>,
sync_cache: Arc<Mutex<HashMap<String, Instant>>>,
last_sync: Arc<Mutex<HashMap<SyncType, u64>>>,
mesh_connections: Arc<Mutex<HashMap<String, MeshConnection>>>,
known_relays: Arc<Mutex<HashMap<String, RelayInfo>>>,
metrics: Arc<Mutex<SyncMetrics>>,
}
Types de Synchronisation
Le système supporte plusieurs types de synchronisation :
- StateSync : Synchronisation de l'état général du relais
- ProcessSync : Synchronisation des processus en cours
- MemberSync : Synchronisation des membres
- TxSync : Synchronisation des transactions
- BlockSync : Synchronisation des blocs
- PeerSync : Synchronisation des pairs connectés
- RelaySync : Synchronisation des informations des relais
- HealthSync : Synchronisation de la santé du relais
- MetricsSync : Synchronisation des métriques
- ConfigSync : Synchronisation de la configuration
- CapabilitySync : Synchronisation des capacités
Messages de Synchronisation
Structure des Messages
pub struct SyncMessage {
pub sync_type: SyncType,
pub relay_id: String,
pub sequence: u64,
pub timestamp: u64,
pub payload: SyncPayload,
}
Types de Payload
pub enum SyncPayload {
StateData { state: String, version: String },
ProcessData { processes: HashMap<String, String> },
MemberData { members: HashMap<String, String> },
HealthData { status: HealthStatus, uptime: u64, cpu_usage: f64 },
MetricsData { metrics: SyncMetrics },
PeerData { peers: Vec<PeerInfo>, last_seen: u64 },
RelayData { relays: Vec<RelayInfo>, network_topology: NetworkTopology },
}
Fonctionnalités de Synchronisation
1. Découverte Automatique des Relais
Le système implémente une découverte automatique des relais dans le réseau :
pub async fn discover_relays(&self) -> Result<()> {
let relay_hosts = vec![
"sdk_relay_1",
"sdk_relay_2",
"sdk_relay_3",
];
for host in relay_hosts {
if host == self.relay_id {
continue; // Ignorer soi-même
}
let relay_info = RelayInfo {
relay_id: host.to_string(),
address: format!("{}:8090", host),
// ... autres champs
};
self.add_relay(relay_info)?;
}
Ok(())
}
2. Cache de Déduplication
Pour éviter les doublons, un cache de déduplication est implémenté :
pub struct MessageCache {
cache: Arc<Mutex<HashMap<String, Instant>>>,
}
impl MessageCache {
pub fn is_duplicate(&self, message_id: &str) -> bool {
let mut cache = self.cache.lock().unwrap();
if cache.contains_key(message_id) {
true
} else {
cache.insert(message_id.to_string(), Instant::now());
false
}
}
}
3. Synchronisation Périodique
Le système effectue une synchronisation périodique avec des intervalles configurés :
- Synchronisation d'état : Toutes les 30 secondes
- Synchronisation de santé : Toutes les 60 secondes
- Synchronisation de métriques : Toutes les 120 secondes
- Synchronisation des relais : Toutes les 300 secondes (5 minutes)
4. Gestion des Connexions Mesh
pub struct MeshConnection {
pub relay_id: String,
pub address: String,
pub connected_since: u64,
pub last_heartbeat: u64,
pub status: ConnectionStatus,
}
Configuration Multi-Relais
Configuration Docker
Le système supporte la configuration de plusieurs relais via Docker :
services:
sdk_relay_1:
container_name: sdk_relay_1
ports:
- "8090:8090"
- "8091:8091"
environment:
- ENABLE_SYNC_TEST=1
sdk_relay_2:
container_name: sdk_relay_2
ports:
- "8092:8090"
- "8093:8091"
environment:
- ENABLE_SYNC_TEST=1
sdk_relay_3:
container_name: sdk_relay_3
ports:
- "8094:8090"
- "8095:8091"
environment:
- ENABLE_SYNC_TEST=1
Configuration par Relais
Chaque relais a sa propre configuration :
# .conf.docker.relay1
relay_id=relay-1
ws_url=0.0.0.0:8090
# .conf.docker.relay2
relay_id=relay-2
ws_url=0.0.0.0:8090
# .conf.docker.relay3
relay_id=relay-3
ws_url=0.0.0.0:8090
Métriques de Synchronisation
pub struct SyncMetrics {
pub messages_sent: u64,
pub messages_received: u64,
pub sync_errors: u64,
pub last_sync_timestamp: u64,
pub connected_relays: u64,
pub mesh_health: f64,
}
Flux de Données
1. Flux de Synchronisation
Relay 1 ──┐
├─── SyncManager ──── MessageCache ──── Mesh Network
Relay 2 ──┤
│
Relay 3 ──┘
2. Flux de Traitement des Transactions
Bitcoin Core ──── ZMQ Notifications ──── SDK Relay ──── Blindbit
│ │ │ │
└─── Block Scan ─────┴─── Silent Payment ─┴─── Validation
3. Flux de Communication WebSocket
Client ──── WebSocket ──── SDK Relay ──── Bitcoin Core RPC
│ │ │
└─── Events ─┴─── Commands ─┴─── Responses
Sécurité et Isolation
1. Isolation Réseau
- Réseau privé :
btcnet
pour la communication inter-services - Ports exposés : Seulement les ports nécessaires
- Volumes : Données persistantes isolées
2. Authentification
- Bitcoin Core : Cookie d'authentification
- Blindbit : À définir selon les besoins
- SDK Relay : Authentification WebSocket
- Tor : Pas d'authentification requise
3. Chiffrement
- RPC Bitcoin : HTTP (non chiffré en local)
- HTTP Blindbit : HTTP (non chiffré en local)
- WebSocket SDK Relay : WSS (chiffré)
- Tor : Chiffrement intégré
Performance et Optimisations
1. Ressources Requises
- CPU : Minimum 2 cœurs
- RAM : Minimum 4 GB
- Stockage : Minimum 50 GB pour la blockchain
- Réseau : Connexion stable à Internet
2. Optimisations Implémentées
- Cache : Mise en cache des données fréquemment utilisées
- Compression : Compression des données de blockchain
- Parallélisation : Traitement parallèle des blocs
- Monitoring : Métriques de performance
3. Métriques de Performance
- Latence de synchronisation : < 100ms
- Débit de messages : > 1000 msg/s
- Utilisation mémoire : < 2GB par relais
- Temps de démarrage : < 30 secondes
Monitoring et Observabilité
1. Métriques Collectées
- Métriques système : CPU, RAM, disque, réseau
- Métriques de synchronisation : Messages envoyés/reçus, erreurs
- Métriques de santé : Uptime, statut des connexions
- Métriques métier : Transactions traitées, paiements détectés
2. Logs
- Logs système : Démarrage, arrêt, erreurs
- Logs de synchronisation : Messages, erreurs, métriques
- Logs métier : Transactions, paiements, événements
3. Alertes
- Alertes critiques : Services arrêtés, erreurs de synchronisation
- Alertes de performance : Latence élevée, utilisation mémoire
- Alertes métier : Échecs de traitement, anomalies
Évolutivité
1. Scalabilité Horizontale
- Ajout de relais : Configuration automatique
- Load balancing : Distribution de charge
- Redondance : Relais de secours
2. Scalabilité Verticale
- Ressources : Augmentation CPU/RAM
- Stockage : Extension des volumes
- Réseau : Bande passante
3. Architecture Distribuée
- Microservices : Services indépendants
- API Gateway : Point d'entrée unifié
- Service Discovery : Découverte automatique
Déploiement et Infrastructure
1. Environnements
- Développement : Configuration locale
- Test : Environnement de test
- Production : Configuration optimisée
2. Orchestration
- Docker Compose : Orchestration locale
- Kubernetes : Orchestration distribuée (futur)
- Service Mesh : Communication inter-services
3. CI/CD
- Build : Construction des images
- Test : Tests automatisés
- Déploiement : Déploiement automatique
Troubleshooting
1. Problèmes de Synchronisation
- Connexions perdues : Vérifier la connectivité réseau
- Messages dupliqués : Vérifier le cache de déduplication
- Latence élevée : Vérifier les ressources système
2. Problèmes de Performance
- Utilisation mémoire : Vérifier les fuites mémoire
- CPU élevé : Vérifier les boucles infinies
- Disque plein : Nettoyer les logs et données
3. Problèmes de Configuration
- Ports bloqués : Vérifier le pare-feu
- Volumes manquants : Vérifier les permissions
- Variables d'environnement : Vérifier la configuration
Évolution Future
1. Améliorations Planifiées
- Synchronisation temps réel : Réduction de la latence
- Compression avancée : Optimisation de la bande passante
- Chiffrement end-to-end : Sécurité renforcée
2. Nouvelles Fonctionnalités
- API REST : Interface REST pour les clients
- Webhooks : Notifications en temps réel
- Analytics : Tableaux de bord avancés
3. Intégrations
- Monitoring : Prometheus, Grafana
- Logging : ELK Stack
- Alerting : PagerDuty, Slack