**Motivations:** - Synchronisation des modifications sur l'API anchorage, les services et le website skeleton - Ajout de scripts de monitoring et de diagnostic pour l'API anchorage - Documentation des problèmes de mutex et de provisioning UTXO **Root causes:** - N/A (commit de synchronisation) **Correctifs:** - N/A (commit de synchronisation) **Evolutions:** - Ajout de scripts de monitoring et de diagnostic pour l'API anchorage - Amélioration de la gestion des mutex et des UTXOs - Mise à jour de la documentation **Pages affectées:** - api-anchorage/src/bitcoin-rpc.js - api-anchorage/src/routes/anchor.js - api-anchorage/src/routes/health.js - api-anchorage/src/server.js - api-anchorage/README-MONITORING.md - api-anchorage/cleanup-stale-locks.mjs - api-anchorage/diagnose.mjs - api-anchorage/unlock-utxos.mjs - service-login-verify/src/persistentNonceCache.ts - signet-dashboard/src/server.js - signet-dashboard/public/* - userwallet/src/hooks/useChannel.ts - userwallet/src/services/relayNotificationService.ts - userwallet/src/utils/defaultContract.ts - website-skeleton/src/* - docs/DOMAINS_AND_PORTS.md - docs/INTERFACES.md - features/* - fixKnowledge/*
191 lines
7.1 KiB
Markdown
191 lines
7.1 KiB
Markdown
# API d'Ancrage - Monitoring et Prévention des Blocages
|
|
|
|
**Date:** 2026-01-28
|
|
**Auteur:** Équipe 4NK
|
|
|
|
## Objectif
|
|
|
|
Implémenter des moyens de contrôle et de correction pour prévenir et résoudre les blocages du mutex et des UTXOs verrouillés dans l'API d'ancrage.
|
|
|
|
## Motivations
|
|
|
|
- **Prévention des blocages:** Éviter que le mutex reste bloqué indéfiniment
|
|
- **Détection précoce:** Identifier les problèmes avant qu'ils n'affectent les utilisateurs
|
|
- **Récupération automatique:** Déverrouiller automatiquement les UTXOs verrouillés depuis trop longtemps
|
|
- **Robustesse:** Gérer les timeouts RPC Bitcoin avec retry et backoff
|
|
- **Observabilité:** Fournir des endpoints de monitoring détaillés
|
|
|
|
## Impacts
|
|
|
|
### Fonctionnels
|
|
|
|
- **Endpoint `/health/detailed`:** Fournit un état détaillé du mutex, des UTXOs et de la connexion Bitcoin
|
|
- **Déverrouillage automatique:** Les UTXOs verrouillés depuis > 10 minutes sont automatiquement déverrouillés au démarrage
|
|
- **Timeout de sécurité:** Le mutex est automatiquement libéré après 5 minutes maximum
|
|
- **Retry avec backoff:** Les appels RPC Bitcoin sont automatiquement réessayés en cas de timeout
|
|
- **Monitoring de durée:** Les opérations > 30 secondes sont loggées avec un warning
|
|
|
|
### Techniques
|
|
|
|
- **Timeout sur Promise.all():** La génération d'adresses a un timeout de 30 secondes
|
|
- **État du mutex:** Suivi en temps réel de l'état du mutex (locked, waiting)
|
|
- **Scripts de maintenance:** Scripts pour diagnostic et nettoyage automatique
|
|
- **Documentation:** Documentation complète du monitoring et de la maintenance
|
|
|
|
## Modifications
|
|
|
|
### Fichiers modifiés
|
|
|
|
1. **`api-anchorage/src/routes/health.js`**
|
|
- Ajout de l'endpoint `/health/detailed` avec état du mutex et UTXOs
|
|
- Vérification des UTXOs verrouillés depuis > 10 minutes
|
|
- Codes de statut adaptatifs selon l'état
|
|
|
|
2. **`api-anchorage/src/bitcoin-rpc.js`**
|
|
- Ajout de `getMutexState()` pour exposer l'état du mutex
|
|
- Suivi de l'état du mutex (`utxoMutexLocked`, `utxoMutexWaiting`)
|
|
- Timeout de sécurité de 5 minutes sur le mutex dans `createAnchorTransaction()`
|
|
- Timeout de 30 secondes sur `Promise.all()` pour la génération d'adresses
|
|
- Méthode `callRPCWithRetry()` pour retry avec backoff exponentiel
|
|
- Méthode `callRPCCommandWithRetry()` pour les commandes RPC
|
|
- Tous les appels RPC critiques utilisent maintenant le retry avec backoff
|
|
- Monitoring de la durée des opérations avec alerte si > 30s
|
|
|
|
3. **`api-anchorage/src/server.js`**
|
|
- Déverrouillage automatique des UTXOs verrouillés depuis > 10 minutes au démarrage
|
|
- Exclusion de `/health/detailed` de l'authentification API Key
|
|
- Mise à jour de la liste des endpoints dans la route racine
|
|
|
|
4. **`api-anchorage/cleanup-stale-locks.mjs`** (nouveau)
|
|
- Script pour déverrouiller les UTXOs verrouillés depuis > 10 minutes
|
|
- À exécuter via cron job toutes les 5 minutes
|
|
|
|
5. **`api-anchorage/diagnose.mjs`** (nouveau)
|
|
- Script de diagnostic complet de l'état des UTXOs
|
|
- Affiche les UTXOs verrouillés avec leur durée de verrouillage
|
|
- Statistiques générales des UTXOs
|
|
|
|
6. **`signet-dashboard/public/api-docs.html`**
|
|
- Ajout de la documentation de l'endpoint `/health/detailed`
|
|
- Mise à jour de la liste des endpoints publics
|
|
- Correction de l'URL de l'API d'ancrage (anchorage.certificator.4nkweb.com)
|
|
|
|
7. **`docs/INTERFACES.md`**
|
|
- Ajout de la documentation de l'endpoint `/health/detailed`
|
|
- Mise à jour de la liste des endpoints
|
|
|
|
8. **`api-anchorage/README-MONITORING.md`** (nouveau)
|
|
- Documentation complète du monitoring et de la maintenance
|
|
- Procédures de dépannage
|
|
- Configuration des cron jobs
|
|
|
|
### Appels RPC mis à jour avec retry
|
|
|
|
- `getNewAddress()` → `callRPCWithRetry('getNewAddress', [])`
|
|
- `getBalance()` → `callRPCWithRetry('getBalance', [])`
|
|
- `checkConnection()` → `callRPCWithRetry('getNetworkInfo', [])` et `callRPCWithRetry('getBlockchainInfo', [])`
|
|
- `listunspent()` → `callRPCWithRetry('listunspent', [...])`
|
|
- `createrawtransaction` → `callRPCCommandWithRetry('createrawtransaction', ...)`
|
|
- `signrawtransactionwithwallet` → `callRPCCommandWithRetry('signrawtransactionwithwallet', ...)`
|
|
- `sendrawtransaction` → `callRPCCommandWithRetry('sendrawtransaction', ...)`
|
|
- `getmempoolentry` → `callRPCCommandWithRetry('getmempoolentry', ...)`
|
|
- `getTransaction()` → `callRPCWithRetry('getTransaction', [...])`
|
|
- `getRawTransaction()` → `callRPCWithRetry('getRawTransaction', [...])`
|
|
- `getTransactionInfo()` → Utilise `callRPCWithRetry()` pour tous les appels
|
|
|
|
## Modalités de déploiement
|
|
|
|
### 1. Redémarrage du service
|
|
|
|
```bash
|
|
sudo systemctl restart anchorage-api
|
|
```
|
|
|
|
### 2. Vérification
|
|
|
|
```bash
|
|
# Health check détaillé
|
|
curl http://localhost:3010/health/detailed
|
|
|
|
# Depuis l'extérieur
|
|
curl https://anchorage.certificator.4nkweb.com/health/detailed
|
|
```
|
|
|
|
### 3. Configuration du cron job (optionnel mais recommandé)
|
|
|
|
Créer `/etc/cron.d/anchorage-cleanup`:
|
|
|
|
```bash
|
|
# Nettoyage automatique des UTXOs verrouillés depuis plus de 10 minutes
|
|
# Toutes les 5 minutes
|
|
*/5 * * * * ncantu cd /home/ncantu/Bureau/code/bitcoin/api-anchorage && /usr/bin/node cleanup-stale-locks.mjs >> /var/log/anchorage-cleanup.log 2>&1
|
|
```
|
|
|
|
### 4. Test des scripts
|
|
|
|
```bash
|
|
# Diagnostic
|
|
cd /home/ncantu/Bureau/code/bitcoin/api-anchorage
|
|
node diagnose.mjs
|
|
|
|
# Nettoyage
|
|
node cleanup-stale-locks.mjs
|
|
|
|
# Déverrouillage manuel
|
|
node unlock-utxos.mjs
|
|
```
|
|
|
|
## Modalités d'analyse
|
|
|
|
### Endpoints de monitoring
|
|
|
|
1. **GET `/health/detailed`**
|
|
- Vérifier l'état du mutex (`locked`, `waiting`)
|
|
- Vérifier le nombre d'UTXOs verrouillés
|
|
- Vérifier les UTXOs verrouillés depuis > 10 minutes (`stale_locks`)
|
|
- Vérifier la connexion Bitcoin
|
|
|
|
2. **GET `/api/anchor/locked-utxos`**
|
|
- Liste complète des UTXOs verrouillés
|
|
- Compteur total
|
|
|
|
### Logs à surveiller
|
|
|
|
1. **Timeouts de mutex:**
|
|
```bash
|
|
sudo journalctl -u anchorage-api | grep "Mutex acquisition timeout"
|
|
```
|
|
|
|
2. **Opérations longues:**
|
|
```bash
|
|
sudo journalctl -u anchorage-api | grep "took too long"
|
|
```
|
|
|
|
3. **Erreurs RPC Bitcoin:**
|
|
```bash
|
|
sudo journalctl -u anchorage-api | grep "ESOCKETTIMEDOUT\|ETIMEDOUT"
|
|
```
|
|
|
|
4. **Retry RPC:**
|
|
```bash
|
|
sudo journalctl -u anchorage-api | grep "RPC call failed, retrying"
|
|
```
|
|
|
|
### Scripts de diagnostic
|
|
|
|
1. **`diagnose.mjs`:** Diagnostic complet de l'état des UTXOs
|
|
2. **`cleanup-stale-locks.mjs`:** Nettoyage automatique des UTXOs stale
|
|
3. **`unlock-utxos.mjs`:** Déverrouillage manuel de tous les UTXOs
|
|
|
|
## Pages affectées
|
|
|
|
- `api-anchorage/src/routes/health.js`: Endpoint `/health/detailed`
|
|
- `api-anchorage/src/bitcoin-rpc.js`: Monitoring, timeouts, retry avec backoff
|
|
- `api-anchorage/src/server.js`: Déverrouillage automatique au démarrage
|
|
- `api-anchorage/cleanup-stale-locks.mjs`: Script de nettoyage (nouveau)
|
|
- `api-anchorage/diagnose.mjs`: Script de diagnostic (nouveau)
|
|
- `api-anchorage/README-MONITORING.md`: Documentation (nouveau)
|
|
- `signet-dashboard/public/api-docs.html`: Documentation API mise à jour
|
|
- `docs/INTERFACES.md`: Documentation API mise à jour
|
|
- `features/api-anchorage-monitoring-and-prevention.md`: Documentation (nouveau)
|