612 lines
12 KiB
Markdown
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 !
|
|
|
|
|
|
|
|
|