ncantu 08eb90ed6b Fix IPv6 connection error in Bitcoin RPC client
**Motivations:**
- L'API d'ancrage échoue avec l'erreur "connect EADDRNOTAVAIL ::1:38332" lors des tentatives de connexion au nœud Bitcoin
- Les ancrages de documents ne peuvent pas être créés sans connexion RPC réussie
- Le problème persiste malgré l'utilisation de 127.0.0.1 dans la configuration

**Root causes:**
- Node.js peut préférer IPv6 lors de la résolution DNS, même si 127.0.0.1 est utilisé directement
- La bibliothèque bitcoin-core peut effectuer des résolutions DNS internes qui aboutissent à IPv6
- Le système peut avoir une préférence IPv6 qui influence la résolution DNS de Node.js

**Correctifs:**
- Ajout de dns.setDefaultResultOrder('ipv4first') au début de bitcoin-rpc.js pour forcer Node.js à préférer IPv4 lors de la résolution DNS
- Cette configuration garantit que même si le système préfère IPv6, Node.js essaiera IPv4 en premier

**Evolutions:**
- Configuration DNS Node.js pour forcer IPv4 en priorité
- Documentation mise à jour avec la nouvelle correction

**Pages affectées:**
- api-anchorage/src/bitcoin-rpc.js : Ajout de la configuration DNS IPv4
- fixKnowledge/anchor-api-ipv6-connection-error.md : Documentation de la correction supplémentaire
2026-01-26 03:55:23 +01:00
..

API d'Ancrage Bitcoin Signet

Auteur : Équipe 4NK Date : 2026-01-23 Version : 1.0

Description

API REST pour ancrer des documents sur la blockchain Bitcoin Signet. Cette API permet de créer des transactions Bitcoin qui incluent les hash de documents dans des outputs OP_RETURN, permettant ainsi de prouver l'existence d'un document à un moment donné.

Caractéristiques

  • Port : 3010
  • Domaine : certificator.4nkweb.com (via nginx sur proxy 192.168.1.100)
  • Authentification : API Key via header x-api-key
  • Format : JSON REST API
  • Bitcoin : Connexion RPC au nœud Bitcoin Signet (port 38332)
  • Mempool : Les transactions sont envoyées au mempool et retournées immédiatement (pas de callbacks)

Installation

Prérequis

  • Node.js >= 18.0.0
  • Accès au nœud Bitcoin Signet (RPC sur port 38332)
  • Wallet Bitcoin avec des fonds pour créer des transactions

Installation des Dépendances

cd api-anchorage
npm install

Configuration

  1. Copier le fichier d'exemple :
cp .env.example .env
  1. Éditer .env :
# Bitcoin RPC Configuration
BITCOIN_RPC_HOST=localhost
BITCOIN_RPC_PORT=38332
BITCOIN_RPC_USER=bitcoin
BITCOIN_RPC_PASSWORD=bitcoin

# API Configuration
API_PORT=3010
API_HOST=0.0.0.0

# API Keys (séparées par des virgules)
API_KEYS=your-api-key-here,another-api-key

# Logging
LOG_LEVEL=info

# Mining Configuration
MINING_ENABLED=true
MINING_FEE_RATE=0.00001

Important :

  • BITCOIN_RPC_HOST : Si l'API est dans un conteneur Docker, utiliser l'IP du conteneur Bitcoin ou host.docker.internal
  • API_KEYS : Définir au moins une clé API valide

Démarrage

Mode Développement

npm run dev

Mode Production

npm start

Avec PM2 (recommandé pour production)

pm2 start src/server.js --name anchor-api
pm2 save
pm2 startup

Endpoints

GET /health

Vérifie l'état de l'API et de la connexion Bitcoin.

Authentification : Non requise

Réponse :

{
  "ok": true,
  "service": "anchor-api",
  "bitcoin": {
    "connected": true,
    "blocks": 152321,
    "chain": "signet",
    "networkactive": true,
    "connections": 1
  },
  "timestamp": "2026-01-23T16:35:27.821Z"
}

POST /api/anchor/document

Ancre un document sur Bitcoin Signet. La transaction est créée et envoyée au mempool, puis retournée immédiatement.

Authentification : Requise (header x-api-key)

Body :

{
  "documentUid": "doc-123456",
  "hash": "a1b2c3d4e5f6..."
}

Note : La transaction est envoyée au mempool et retournée immédiatement. Aucun callback n'est supporté.

Réponse :

{
  "txid": "56504e002d95301ebcfb4b30eaedc5d3fd9a448e121ffdce4f356b8d34169e85",
  "status": "confirmed",
  "confirmations": 0,
  "block_height": 152321
}

Erreurs :

  • 400 Bad Request : Hash invalide
  • 401 Unauthorized : Clé API invalide ou manquante
  • 402 Payment Required : Solde insuffisant
  • 500 Internal Server Error : Erreur serveur

POST /api/anchor/verify

Vérifie si un hash est ancré sur Bitcoin Signet.

Authentification : Requise (header x-api-key)

Body :

{
  "hash": "a1b2c3d4e5f6...",
  "txid": "56504e002d95301ebcfb4b30eaedc5d3fd9a448e121ffdce4f356b8d34169e85" // optionnel
}

Réponse (hash trouvé) :

{
  "verified": true,
  "anchor_info": {
    "transaction_id": "56504e002d95301ebcfb4b30eaedc5d3fd9a448e121ffdce4f356b8d34169e85",
    "block_height": 152321,
    "confirmations": 0,
    "current_block_height": 152321
  }
}

Réponse (hash non trouvé) :

{
  "verified": false,
  "message": "Hash not found in recent blocks"
}

Utilisation

Exemple avec curl

# Health check
curl http://localhost:3010/health

# Ancrer un document
curl -X POST http://localhost:3010/api/anchor/document \
  -H "Content-Type: application/json" \
  -H "x-api-key: your-api-key-here" \
  -d '{
    "documentUid": "doc-123",
    "hash": "a1b2c3d4e5f6789012345678901234567890123456789012345678901234567890"
  }'

# Vérifier un ancrage
curl -X POST http://localhost:3010/api/anchor/verify \
  -H "Content-Type: application/json" \
  -H "x-api-key: your-api-key-here" \
  -d '{
    "hash": "a1b2c3d4e5f6789012345678901234567890123456789012345678901234567890"
  }'

Exemple avec le client de test

# Configurer la clé API
export API_KEY=your-api-key-here
export API_URL=http://localhost:3010

# Exécuter le test
npm test

Configuration Nginx (sur proxy 192.168.1.100)

Ajouter dans la configuration nginx du proxy :

# API Anchor sur certificator.4nkweb.com
server {
    listen 443 ssl http2;
    server_name certificator.4nkweb.com;

    ssl_certificate /etc/letsencrypt/live/certificator.4nkweb.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/certificator.4nkweb.com/privkey.pem;

    location / {
        proxy_pass http://192.168.1.103:3010;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

Note : Remplacer 192.168.1.103 par l'IP du serveur où l'API est déployée.

Architecture

Client
  ↓ HTTPS
Nginx (proxy 192.168.1.100:443)
  ↓ HTTP
API Anchor (port 3010)
  ↓ RPC
Bitcoin Signet Node (port 38332)

Sécurité

Clés API

  • Les clés API sont définies dans .env (variable API_KEYS)
  • Plusieurs clés peuvent être définies (séparées par des virgules)
  • La clé doit être envoyée dans le header x-api-key
  • Le endpoint /health ne nécessite pas d'authentification

Recommandations

  1. Ne jamais commiter .env : Le fichier .env contient des secrets
  2. Utiliser HTTPS : Via nginx avec certificats Let's Encrypt
  3. Restreindre RPCALLOWIP : Dans la configuration Bitcoin, limiter l'accès RPC
  4. Rotater les clés API : Changer régulièrement les clés API
  5. Monitoring : Surveiller les logs pour détecter les abus

Dépannage

L'API ne peut pas se connecter à Bitcoin

Vérifier :

# Vérifier que le nœud Bitcoin est accessible
curl -u bitcoin:bitcoin http://localhost:38332

# Vérifier les variables d'environnement
grep BITCOIN_RPC .env

Erreur "Insufficient balance"

Le wallet Bitcoin n'a pas assez de fonds pour créer des transactions.

Solution :

  • Miner des blocs pour obtenir des récompenses
  • Recevoir des fonds depuis un autre wallet
  • Vérifier le solde : bitcoin-cli getbalance

Erreur "Unauthorized"

La clé API est invalide ou manquante.

Solution :

  • Vérifier que le header x-api-key est présent
  • Vérifier que la clé est dans API_KEYS du .env

Logs

Les logs sont affichés sur la console avec le format :

[2026-01-23T16:35:27.821Z] [INFO] API d'ancrage Bitcoin Signet démarrée {"host":"0.0.0.0","port":3010}

Niveaux de log :

  • error : Erreurs critiques
  • warn : Avertissements
  • info : Informations générales
  • debug : Détails de débogage

Contrôlé par la variable LOG_LEVEL dans .env.

Structure du Projet

api-anchorage/
├── src/
│   ├── server.js          # Serveur Express principal
│   ├── bitcoin-rpc.js     # Client Bitcoin RPC
│   ├── logger.js          # Système de logging
│   └── routes/
│       ├── health.js       # Route health check
│       └── anchor.js      # Routes d'ancrage
├── package.json
├── .env.example
├── .env                    # Configuration (ne pas commiter)
├── README.md
└── src/test-client.js     # Client de test

Développement

Tests Locaux

# Démarrer l'API
npm run dev

# Dans un autre terminal, tester
npm test

Format de Transaction

Les transactions d'ancrage utilisent un output OP_RETURN avec le format :

  • Préfixe : "ANCHOR:" (7 bytes)
  • Hash : Hash SHA256 du document (32 bytes)

Total : 39 bytes dans l'output OP_RETURN.


Dernière mise à jour : 2026-01-23