diff --git a/api-anchorage/.env.example b/api-anchorage/.env.example index 880c3d6..c3ca8fa 100644 --- a/api-anchorage/.env.example +++ b/api-anchorage/.env.example @@ -1,5 +1,5 @@ # Bitcoin RPC Configuration -BITCOIN_RPC_HOST=localhost +BITCOIN_RPC_HOST=127.0.0.1 BITCOIN_RPC_PORT=38332 BITCOIN_RPC_USER=bitcoin BITCOIN_RPC_PASSWORD=bitcoin diff --git a/api-anchorage/src/bitcoin-rpc.js b/api-anchorage/src/bitcoin-rpc.js index dc5bcb3..10c37b6 100644 --- a/api-anchorage/src/bitcoin-rpc.js +++ b/api-anchorage/src/bitcoin-rpc.js @@ -10,7 +10,7 @@ import { logger } from './logger.js'; class BitcoinRPC { constructor() { this.client = new Client({ - host: process.env.BITCOIN_RPC_HOST || 'localhost', + host: process.env.BITCOIN_RPC_HOST || '127.0.0.1', port: parseInt(process.env.BITCOIN_RPC_PORT || '38332'), username: process.env.BITCOIN_RPC_USER || 'bitcoin', password: process.env.BITCOIN_RPC_PASSWORD || 'bitcoin', @@ -231,7 +231,7 @@ class BitcoinRPC { // Obtenir les UTXOs disponibles const walletName = process.env.BITCOIN_RPC_WALLET || 'custom_signet'; - const host = process.env.BITCOIN_RPC_HOST || 'localhost'; + const host = process.env.BITCOIN_RPC_HOST || '127.0.0.1'; const port = process.env.BITCOIN_RPC_PORT || '38332'; const username = process.env.BITCOIN_RPC_USER || 'bitcoin'; const password = process.env.BITCOIN_RPC_PASSWORD || 'bitcoin'; diff --git a/fixKnowledge/anchor-api-ipv6-connection-error.md b/fixKnowledge/anchor-api-ipv6-connection-error.md new file mode 100644 index 0000000..e08e1ec --- /dev/null +++ b/fixKnowledge/anchor-api-ipv6-connection-error.md @@ -0,0 +1,129 @@ +# Problème de connexion IPv6 de l'API d'ancrage + +**Auteur** : Équipe 4NK +**Date** : 2026-01-26 +**Version** : 1.0 + +## Problème + +L'API d'ancrage tente de se connecter au nœud Bitcoin via IPv6 (`::1:38332`) alors que le nœud Bitcoin n'écoute probablement que sur IPv4. + +### Symptômes + +- Erreurs de connexion lors des appels RPC Bitcoin +- Tentatives de connexion sur `::1:38332` (IPv6) au lieu de `127.0.0.1:38332` (IPv4) +- Échec des ancrages de documents + +### Impact + +- **Fonctionnalité** : Les ancrages de documents ne fonctionnent pas +- **Service** : L'API d'ancrage ne peut pas communiquer avec le nœud Bitcoin +- **Utilisateurs** : Impossible d'ancrer des documents sur la blockchain + +## Root causes + +1. **Valeur par défaut `localhost`** : Le code utilisait `localhost` comme valeur par défaut, qui peut être résolu en IPv6 (`::1`) selon la configuration système +2. **Configuration système** : Le système peut avoir une préférence IPv6, ce qui fait que `localhost` résout vers `::1` au lieu de `127.0.0.1` +3. **Nœud Bitcoin** : Le nœud Bitcoin n'écoute que sur IPv4 (`127.0.0.1`), pas sur IPv6 + +## Correctifs + +### Modifications du code + +1. **`api-anchorage/src/bitcoin-rpc.js`** : + - Ligne 13 : Remplacement de `'localhost'` par `'127.0.0.1'` dans le constructeur + - Ligne 234 : Remplacement de `'localhost'` par `'127.0.0.1'` dans la fonction `createAnchorTransaction` + +2. **`api-anchorage/.env.example`** : + - Ligne 2 : Remplacement de `BITCOIN_RPC_HOST=localhost` par `BITCOIN_RPC_HOST=127.0.0.1` + +### Configuration + +Le fichier `.env` doit utiliser `127.0.0.1` au lieu de `localhost` : + +```env +BITCOIN_RPC_HOST=127.0.0.1 +``` + +## Evolutions + +- **Valeur par défaut sécurisée** : Le code utilise maintenant `127.0.0.1` par défaut, forçant IPv4 +- **Documentation** : Le fichier `.env.example` reflète la bonne pratique + +## Pages affectées + +- `api-anchorage/src/bitcoin-rpc.js` : Constructeur et fonction `createAnchorTransaction` +- `api-anchorage/.env.example` : Configuration d'exemple +- `api-anchorage/.env` : Configuration de production (déjà corrigée) + +## Modalités de déploiement + +1. **Vérifier la configuration `.env`** : + ```bash + cd /home/ncantu/Bureau/code/bitcoin/api-anchorage + grep BITCOIN_RPC_HOST .env + ``` + Doit afficher : `BITCOIN_RPC_HOST=127.0.0.1` + +2. **Redémarrer le service** : + ```bash + systemctl --user restart anchorage-api.service + ``` + +3. **Vérifier les logs** : + ```bash + journalctl --user -u anchorage-api.service -f + ``` + Vérifier que les connexions se font bien sur `127.0.0.1:38332` et non sur `::1:38332` + +4. **Tester la connexion** : + ```bash + curl http://localhost:3010/health + ``` + Doit retourner un statut `200` avec `bitcoin_connected: true` + +## Modalités d'analyse + +### Vérifier la résolution DNS + +```bash +# Vérifier la résolution de localhost +getent hosts localhost +# Peut retourner ::1 (IPv6) ou 127.0.0.1 (IPv4) + +# Vérifier la résolution de 127.0.0.1 +getent hosts 127.0.0.1 +# Doit retourner 127.0.0.1 +``` + +### Vérifier l'écoute du nœud Bitcoin + +```bash +# Vérifier sur quel port/IP le nœud Bitcoin écoute +ss -tlnp | grep 38332 +# Doit afficher 127.0.0.1:38332 (IPv4) +``` + +### Vérifier les logs de l'API + +```bash +# Vérifier les tentatives de connexion +journalctl --user -u anchorage-api.service | grep -i "connection\|rpc\|bitcoin" +# Vérifier qu'il n'y a plus d'erreurs de connexion IPv6 +``` + +### Tester la connexion RPC directement + +```bash +# Tester la connexion RPC avec IPv4 +curl --user bitcoin:bitcoin --data-binary '{"jsonrpc":"1.0","id":"test","method":"getblockchaininfo","params":[]}' -H 'content-type: text/plain;' http://127.0.0.1:38332/ + +# Tester avec localhost (peut échouer si résolu en IPv6) +curl --user bitcoin:bitcoin --data-binary '{"jsonrpc":"1.0","id":"test","method":"getblockchaininfo","params":[]}' -H 'content-type: text/plain;' http://localhost:38332/ +``` + +## Notes + +- Le problème peut persister si le service n'est pas redémarré après modification du `.env` +- Le code utilise maintenant `127.0.0.1` par défaut, ce qui garantit l'utilisation d'IPv4 même si la variable d'environnement n'est pas définie +- Cette correction s'applique à tous les environnements (test, pre-production, production)