Fix IPv6 connection issue in anchor API

**Motivations:**
- L'API d'ancrage tentait de se connecter au nœud Bitcoin via IPv6 (::1:38332) alors que le nœud n'écoute que sur IPv4
- Les ancrages de documents échouaient à cause de cette erreur de connexion

**Root causes:**
- Le code utilisait 'localhost' comme valeur par défaut, qui peut être résolu en IPv6 (::1) selon la configuration système
- Le nœud Bitcoin n'écoute que sur IPv4 (127.0.0.1), pas sur IPv6

**Correctifs:**
- Remplacement de 'localhost' par '127.0.0.1' dans le constructeur BitcoinRPC (ligne 13)
- Remplacement de 'localhost' par '127.0.0.1' dans la fonction createAnchorTransaction (ligne 234)
- Mise à jour de .env.example pour utiliser 127.0.0.1 au lieu de localhost
- Documentation du problème dans fixKnowledge/anchor-api-ipv6-connection-error.md

**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
- api-anchorage/.env.example
- fixKnowledge/anchor-api-ipv6-connection-error.md
This commit is contained in:
ncantu 2026-01-26 00:18:51 +01:00
parent 300c728ce8
commit c391e7151a
3 changed files with 132 additions and 3 deletions

View File

@ -1,5 +1,5 @@
# Bitcoin RPC Configuration # Bitcoin RPC Configuration
BITCOIN_RPC_HOST=localhost BITCOIN_RPC_HOST=127.0.0.1
BITCOIN_RPC_PORT=38332 BITCOIN_RPC_PORT=38332
BITCOIN_RPC_USER=bitcoin BITCOIN_RPC_USER=bitcoin
BITCOIN_RPC_PASSWORD=bitcoin BITCOIN_RPC_PASSWORD=bitcoin

View File

@ -10,7 +10,7 @@ import { logger } from './logger.js';
class BitcoinRPC { class BitcoinRPC {
constructor() { constructor() {
this.client = new Client({ 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'), port: parseInt(process.env.BITCOIN_RPC_PORT || '38332'),
username: process.env.BITCOIN_RPC_USER || 'bitcoin', username: process.env.BITCOIN_RPC_USER || 'bitcoin',
password: process.env.BITCOIN_RPC_PASSWORD || 'bitcoin', password: process.env.BITCOIN_RPC_PASSWORD || 'bitcoin',
@ -231,7 +231,7 @@ class BitcoinRPC {
// Obtenir les UTXOs disponibles // Obtenir les UTXOs disponibles
const walletName = process.env.BITCOIN_RPC_WALLET || 'custom_signet'; 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 port = process.env.BITCOIN_RPC_PORT || '38332';
const username = process.env.BITCOIN_RPC_USER || 'bitcoin'; const username = process.env.BITCOIN_RPC_USER || 'bitcoin';
const password = process.env.BITCOIN_RPC_PASSWORD || 'bitcoin'; const password = process.env.BITCOIN_RPC_PASSWORD || 'bitcoin';

View File

@ -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)