sdk_relay/docs/EXEMPLES_PRATIQUES.md

612 lines
12 KiB
Markdown

# Exemples Pratiques - sdk_relay
Ce document contient des exemples pratiques pour utiliser le service sdk_relay.
## 🚀 Exemples de Démarrage
### 1. Démarrage local simple
```bash
# Compiler le projet
cargo build --release
# Démarrer avec configuration par défaut
./target/release/sdk_relay
# Démarrer avec configuration personnalisée
./target/release/sdk_relay --config /path/to/config.conf
```
### 2. Démarrage avec variables d'environnement
```bash
# Configuration via variables d'environnement
export CORE_URL="http://localhost:18443"
export CORE_WALLET="my_wallet"
export WS_URL="0.0.0.0:8090"
export NETWORK="signet"
export BLINDBIT_URL="http://localhost:8000"
# Démarrer le service
./target/release/sdk_relay
```
### 3. Démarrage en mode debug
```bash
# Activer les logs détaillés
export RUST_LOG=debug
# Démarrer avec logs complets
./target/release/sdk_relay 2>&1 | tee relay.log
# Démarrer avec profiling
RUSTFLAGS="-C target-cpu=native" cargo run --release
```
## 🔌 Exemples de Connexion WebSocket
### 1. Connexion basique avec JavaScript
```javascript
// Connexion WebSocket simple
const ws = new WebSocket('ws://localhost:8090');
ws.onopen = function() {
console.log('Connecté au relais');
// Envoyer un message de handshake
const handshake = {
type: 'handshake',
client_id: 'test-client-1',
version: '1.0.0'
};
ws.send(JSON.stringify(handshake));
};
ws.onmessage = function(event) {
const message = JSON.parse(event.data);
console.log('Message reçu:', message);
if (message.type === 'handshake_response') {
console.log('Handshake réussi, SP address:', message.sp_address);
}
};
ws.onerror = function(error) {
console.error('Erreur WebSocket:', error);
};
ws.onclose = function() {
console.log('Connexion fermée');
};
```
### 2. Connexion avec Python
```python
import asyncio
import websockets
import json
async def connect_to_relay():
uri = "ws://localhost:8090"
async with websockets.connect(uri) as websocket:
# Envoyer un message de handshake
handshake = {
"type": "handshake",
"client_id": "python-client-1",
"version": "1.0.0"
}
await websocket.send(json.dumps(handshake))
# Écouter les messages
async for message in websocket:
data = json.loads(message)
print(f"Message reçu: {data}")
if data.get("type") == "handshake_response":
print(f"SP Address: {data.get('sp_address')}")
# Exécuter
asyncio.run(connect_to_relay())
```
### 3. Connexion avec curl (test)
```bash
# Test de connectivité WebSocket avec curl
curl -v -H "Connection: Upgrade" \
-H "Upgrade: websocket" \
-H "Sec-WebSocket-Key: test" \
-H "Sec-WebSocket-Version: 13" \
http://localhost:8090/
# Test avec wscat (si installé)
wscat -c ws://localhost:8090
```
## 📡 Exemples de Messages
### 1. Message de Handshake
```json
{
"type": "handshake",
"client_id": "client-123",
"version": "1.0.0",
"capabilities": ["sync", "mesh", "health"]
}
```
**Réponse attendue :**
```json
{
"type": "handshake_response",
"sp_address": "tsp1qqtle38p9mzlmka7m48y762ksygdstlnmlwsjz9p0qp20xf69hasxkqmnsncgw0kw5al4qqhw0xrp8qt479cg6z6hk0954f882dx230hvkvcu5hpe",
"relay_id": "relay-1",
"version": "1.0.0",
"capabilities": ["sync", "mesh", "health", "metrics"]
}
```
### 2. Message de Synchronisation
```json
{
"flag": "Sync",
"content": {
"type": "RelaySync",
"relay_id": "client-123",
"timestamp": 1640995200,
"sequence": 1,
"payload": {
"discovery": true,
"relay_info": {
"id": "client-123",
"capabilities": ["sync", "mesh"]
}
}
}
}
```
### 3. Message de Transaction
```json
{
"type": "new_transaction",
"txid": "abc123...",
"outputs": [
{
"address": "tsp1...",
"amount": 1000000,
"script_pubkey": "001234..."
}
],
"block_height": 123456
}
```
## 🧪 Exemples de Tests
### 1. Test de connectivité
```bash
# Test de connectivité basique
curl -s http://localhost:8090/ || echo "Port non accessible"
# Test de connectivité depuis un conteneur
docker run --rm --network 4nk_default curlimages/curl \
curl -s http://sdk_relay_1:8090/
# Test de connectivité WebSocket
python3 -c "
import websockets
import asyncio
async def test():
try:
async with websockets.connect('ws://localhost:8090') as ws:
print('✅ WebSocket accessible')
except Exception as e:
print(f'❌ Erreur: {e}')
asyncio.run(test())
"
```
### 2. Test de messages
```bash
# Test avec le script Python fourni
python3 test_websocket_messages.py
# Test de charge
for i in {1..10}; do
python3 test_websocket_messages.py &
done
wait
```
### 3. Test de synchronisation
```bash
# Test de synchronisation entre relais
./test_sync_logs.sh test
# Test en continu
./test_sync_logs.sh continuous
# Test forcé
./test_sync_logs.sh force
```
## 🔧 Exemples de Configuration
### 1. Configuration de développement
```ini
# .conf.dev
core_url=http://localhost:18443
core_wallet=dev_wallet
ws_url=0.0.0.0:8090
wallet_name=dev_wallet.json
network=signet
blindbit_url=http://localhost:8000
zmq_url=tcp://localhost:29000
data_dir=.4nk
cookie_path=/home/user/.bitcoin/signet/.cookie
dev_mode=true
standalone=true
relay_id=dev-relay-1
```
### 2. Configuration de production
```ini
# .conf.prod
core_url=http://bitcoin:18443
core_wallet=prod_wallet
ws_url=0.0.0.0:8090
wallet_name=prod_wallet.json
network=mainnet
blindbit_url=http://blindbit:8000
zmq_url=tcp://bitcoin:29000
data_dir=/var/lib/4nk
cookie_path=/var/lib/bitcoin/.bitcoin/.cookie
dev_mode=false
standalone=false
relay_id=prod-relay-1
```
### 3. Configuration multi-relais
```ini
# .conf.relay1
relay_id=relay-1
ws_url=0.0.0.0:8090
# .conf.relay2
relay_id=relay-2
ws_url=0.0.0.0:8092
# .conf.relay3
relay_id=relay-3
ws_url=0.0.0.0:8094
```
## 📊 Exemples de Monitoring
### 1. Monitoring des logs
```bash
# Suivre les logs en temps réel
tail -f relay.log | grep -E "(ERROR|WARN|INFO)"
# Filtrer les messages de synchronisation
tail -f relay.log | grep -E "(Sync|Relay|Mesh)"
# Compter les erreurs
grep -c "ERROR" relay.log
# Analyser les performances
grep "processing_time" relay.log | awk '{sum+=$NF; count++} END {print "Avg:", sum/count}'
```
### 2. Monitoring des connexions
```bash
# Vérifier les connexions WebSocket actives
netstat -tlnp | grep :8090
# Compter les connexions
netstat -an | grep :8090 | wc -l
# Vérifier les processus
ps aux | grep sdk_relay
```
### 3. Monitoring des ressources
```bash
# Vérifier l'utilisation mémoire
ps -o pid,ppid,cmd,%mem,%cpu --sort=-%mem | grep sdk_relay
# Vérifier l'espace disque
du -sh /home/user/.4nk/
# Vérifier les fichiers ouverts
lsof -p $(pgrep sdk_relay)
```
## 🛠️ Exemples de Debug
### 1. Debug de connexion Bitcoin Core
```bash
# Vérifier la connectivité RPC
curl -u bitcoin:password --data-binary '{"jsonrpc": "1.0", "id": "test", "method": "getblockchaininfo", "params": []}' -H 'content-type: text/plain;' http://localhost:18443/
# Vérifier le wallet
curl -u bitcoin:password --data-binary '{"jsonrpc": "1.0", "id": "test", "method": "listwallets", "params": []}' -H 'content-type: text/plain;' http://localhost:18443/
# Vérifier les permissions du cookie
ls -la /home/user/.bitcoin/signet/.cookie
```
### 2. Debug de synchronisation
```bash
# Vérifier l'état du SyncManager
grep "SyncManager" relay.log | tail -10
# Vérifier les messages de découverte
grep "discover" relay.log | tail -10
# Vérifier les erreurs de synchronisation
grep "sync.*error" relay.log | tail -10
```
### 3. Debug de WebSocket
```bash
# Vérifier les connexions WebSocket
grep "WebSocket" relay.log | tail -10
# Vérifier les messages reçus
grep "received" relay.log | tail -10
# Vérifier les erreurs de parsing
grep "parse.*error" relay.log | tail -10
```
## 🔒 Exemples de Sécurité
### 1. Configuration de pare-feu
```bash
# Autoriser seulement les ports nécessaires
sudo ufw allow 8090/tcp # WebSocket sdk_relay
sudo ufw allow 18443/tcp # Bitcoin Core RPC
sudo ufw allow 8000/tcp # Blindbit API
# Vérifier les règles
sudo ufw status numbered
```
### 2. Configuration SSL/TLS
```bash
# Générer un certificat pour WebSocket sécurisé
openssl req -x509 -newkey rsa:4096 -keyout relay-key.pem -out relay-cert.pem -days 365 -nodes
# Configurer nginx comme proxy SSL
server {
listen 443 ssl;
server_name relay.example.com;
ssl_certificate relay-cert.pem;
ssl_certificate_key relay-key.pem;
location / {
proxy_pass http://localhost:8090;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
```
### 3. Monitoring de sécurité
```bash
# Vérifier les connexions suspectes
netstat -tuln | grep :8090
# Vérifier les tentatives d'accès
grep "connection.*from" relay.log | tail -20
# Vérifier les erreurs d'authentification
grep "auth.*error" relay.log | tail -10
```
## 📈 Exemples de Performance
### 1. Test de charge
```bash
# Script de test de charge
#!/bin/bash
for i in {1..100}; do
python3 -c "
import asyncio
import websockets
import json
async def test_client():
try:
async with websockets.connect('ws://localhost:8090') as ws:
await ws.send(json.dumps({'type': 'handshake', 'client_id': f'client-{i}'}))
response = await ws.recv()
print(f'Client {i}: OK')
except Exception as e:
print(f'Client {i}: ERROR - {e}')
asyncio.run(test_client())
" &
sleep 0.1
done
wait
```
### 2. Optimisation mémoire
```bash
# Limiter la mémoire du processus
ulimit -v 1048576 # 1GB
# Démarrer avec profiling mémoire
valgrind --tool=massif ./target/release/sdk_relay
# Analyser le profil mémoire
ms_print massif.out.* > memory_profile.txt
```
### 3. Monitoring des performances
```bash
# Script de monitoring continu
#!/bin/bash
while true; do
echo "=== $(date) ==="
# Mémoire
memory=$(ps -o rss= -p $(pgrep sdk_relay))
echo "Memory: ${memory}KB"
# CPU
cpu=$(ps -o %cpu= -p $(pgrep sdk_relay))
echo "CPU: ${cpu}%"
# Connexions WebSocket
connections=$(netstat -an | grep :8090 | wc -l)
echo "WebSocket connections: $connections"
# Messages par seconde
messages=$(grep "message.*processed" relay.log | tail -1 | awk '{print $NF}')
echo "Messages/sec: $messages"
sleep 30
done
```
## 🚀 Exemples de Déploiement
### 1. Déploiement avec systemd
```ini
# /etc/systemd/system/sdk-relay.service
[Unit]
Description=sdk_relay Service
After=network.target
[Service]
Type=simple
User=bitcoin
WorkingDirectory=/opt/sdk_relay
ExecStart=/opt/sdk_relay/target/release/sdk_relay
Restart=always
RestartSec=10
Environment=RUST_LOG=info
[Install]
WantedBy=multi-user.target
```
```bash
# Activer et démarrer le service
sudo systemctl enable sdk-relay
sudo systemctl start sdk-relay
sudo systemctl status sdk-relay
```
### 2. Déploiement avec Docker
```dockerfile
# Dockerfile
FROM rust:1.89 as builder
WORKDIR /app
COPY . .
RUN cargo build --release
FROM debian:bullseye-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/release/sdk_relay /usr/local/bin/
COPY --from=builder /app/.conf /home/bitcoin/.conf
EXPOSE 8090
CMD ["sdk_relay"]
```
```bash
# Construire et démarrer
docker build -t sdk_relay .
docker run -d --name sdk_relay -p 8090:8090 sdk_relay
```
### 3. Déploiement avec Kubernetes
```yaml
# sdk-relay-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sdk-relay
spec:
replicas: 3
selector:
matchLabels:
app: sdk-relay
template:
metadata:
labels:
app: sdk-relay
spec:
containers:
- name: sdk-relay
image: sdk_relay:latest
ports:
- containerPort: 8090
env:
- name: RUST_LOG
value: "info"
volumeMounts:
- name: config
mountPath: /home/bitcoin/.conf
volumes:
- name: config
configMap:
name: sdk-relay-config
---
apiVersion: v1
kind: Service
metadata:
name: sdk-relay-service
spec:
selector:
app: sdk-relay
ports:
- port: 8090
targetPort: 8090
type: LoadBalancer
```
Ces exemples couvrent les cas d'usage les plus courants pour sdk_relay. Adaptez-les selon vos besoins spécifiques !