anchorage_layer_simple/fixKnowledge/api-anchorage-null-includes-error.md
ncantu 4d3028da0c Docs API dashboard et skipIfExists
**Motivations:**
- Aligner la doc API du dashboard avec les évolutions (pagination serveur, base SQLite, frais, mining, hash, UTXO, etc.)
- Documenter le paramètre skipIfExists de l'API d'ancrage
- Corriger les références /health pour le dashboard (utiliser /api/blockchain/info)

**Root causes:**
- N/A (évolution documentation)

**Correctifs:**
- N/A

**Evolutions:**
- Section API Dashboard dans api-docs.html ; endpoints utxo/count, utxo/list (pagination, category), utxo/fees, fees/update, hash/list, hash/generate, mining, transactions, anchor/example
- Paramètre skipIfExists et réponses old: true/false pour POST /api/anchor/document
- DASHBOARD.md : liste endpoints à jour, tests sans /health
- DOMAINS_AND_PORTS.md : tests dashboard via /api/blockchain/info
- features/dashboard-api-docs-update.md

**Pages affectées:**
- signet-dashboard/public/api-docs.html
- docs/DASHBOARD.md
- docs/DOMAINS_AND_PORTS.md
- features/dashboard-api-docs-update.md
- api-anchorage/src/bitcoin-rpc.js, bitcoin-rpc.js.backup
- data/sync-utxos.log
- fixKnowledge/api-anchorage-null-includes-error.md, api-anchorage-rbf-replacement-error.md
2026-01-28 12:18:33 +01:00

125 lines
4.3 KiB
Markdown

# Correction: Erreur "Cannot read properties of null (reading 'includes')" dans l'API d'ancrage
**Auteur** : Équipe 4NK
**Date** : 2026-01-28
**Fichier concerné** : `api-anchorage/src/bitcoin-rpc.js`
## Problème
L'API d'ancrage retournait une erreur `500 Internal Server Error` avec le message :
```
Cannot read properties of null (reading 'includes')
```
### Symptômes
- Erreur lors de l'appel à l'endpoint `/api/anchor/document`
- L'API Key est correctement validée (visible dans les logs)
- L'erreur se produit lors de l'analyse des outputs de la transaction créée
### Impact
- Les requêtes d'ancrage échouent avec une erreur 500
- Aucune transaction n'est créée
- Les utilisateurs ne peuvent pas ancrer de documents
## Root Cause
Dans la fonction `createAnchorTransaction()` du fichier `bitcoin-rpc.js`, à la ligne 710, le code utilisait la variable `provisioningAddresses` (paramètre de la fonction qui peut être `null`) au lieu de `finalProvisioningAddresses` (variable locale définie à la ligne 257 qui contient toujours un tableau valide).
**Code problématique (ligne 710) :**
```javascript
else if (provisioningAddresses.includes(outputAddress) && Math.abs(outputAmount - provisioningAmountRounded) < 0.00000001) {
```
Quand `provisioningAddresses` est `null` (valeur par défaut du paramètre), l'appel à `.includes()` lève l'erreur "Cannot read properties of null (reading 'includes')".
## Correctifs
### Modification du code
**Fichier** : `api-anchorage/src/bitcoin-rpc.js`
**Ligne 710** : Remplacer l'utilisation de `provisioningAddresses` par `finalProvisioningAddresses` avec une vérification de sécurité.
**Avant :**
```javascript
else if (provisioningAddresses.includes(outputAddress) && Math.abs(outputAmount - provisioningAmountRounded) < 0.00000001) {
```
**Après :**
```javascript
else if (finalProvisioningAddresses && finalProvisioningAddresses.includes(outputAddress) && Math.abs(outputAmount - provisioningAmountRounded) < 0.00000001) {
```
### Explication
- `finalProvisioningAddresses` est défini à la ligne 257 avec la logique : `provisioningAddresses || allAddresses.slice(1, 1 + provisioningCount)`
- Cette variable contient toujours un tableau valide (même vide) et ne peut pas être `null`
- La vérification `finalProvisioningAddresses &&` ajoute une sécurité supplémentaire pour éviter toute erreur future
## Modifications
### Fichiers Modifiés
- `api-anchorage/src/bitcoin-rpc.js` : Correction de la ligne 710
## Modalités de Déploiement
1. **Redémarrer le service systemd** :
```bash
sudo systemctl restart anchorage-api
```
2. **Vérifier que le service est actif** :
```bash
sudo systemctl status anchorage-api
```
3. **Tester l'endpoint** :
```bash
curl -X POST http://localhost:3010/api/anchor/document \
-H "Content-Type: application/json" \
-H "x-api-key: <your-api-key>" \
-d '{
"hash": "a1b2c3d4e5f6789012345678901234567890123456789012345678901234567890"
}'
```
## Modalités d'Analyse
### Vérification du problème
1. **Consulter les logs** :
```bash
sudo journalctl -u anchorage-api -n 100 --no-pager
```
2. **Rechercher l'erreur** :
- Chercher "Cannot read properties of null (reading 'includes')"
- Vérifier la stack trace pour identifier la ligne exacte
3. **Vérifier les paramètres** :
- Vérifier que `provisioningAddresses` peut être `null` dans les appels
- Vérifier que `finalProvisioningAddresses` est bien défini avant utilisation
### Tests de validation
1. **Test avec provisioningAddresses null** (cas par défaut) :
- L'appel sans paramètre `provisioningAddresses` doit fonctionner
- `finalProvisioningAddresses` doit être un tableau généré automatiquement
2. **Test avec provisioningAddresses fourni** :
- L'appel avec un tableau d'adresses doit fonctionner
- Les outputs de provisioning doivent être correctement identifiés
3. **Test avec provisioningCount = 0** :
- Si aucun provisioning n'est nécessaire, `finalProvisioningAddresses` doit être un tableau vide
- Aucune erreur ne doit être levée
## Notes
- Cette erreur se produisait uniquement lors de l'analyse des outputs de la transaction créée
- La transaction était créée avec succès, mais l'analyse des outputs échouait
- La correction garantit que `finalProvisioningAddresses` est toujours un tableau valide avant l'appel à `.includes()`