diff --git a/fixKnowledge/dashboard-home-blocked-by-startup-init.md b/fixKnowledge/dashboard-home-blocked-by-startup-init.md new file mode 100644 index 0000000..5569888 --- /dev/null +++ b/fixKnowledge/dashboard-home-blocked-by-startup-init.md @@ -0,0 +1,46 @@ +# Page home bloquée par l'initialisation au démarrage + +**Auteur** : Équipe 4NK +**Date** : 2026-01-26 +**Version** : 1.0 + +## Problème + +La page home rame et ne s'affiche pas. Les requêtes API (blockchain/info, utxo/count, anchor/count, etc.) timeout. + +## Symptômes + +- La page home ne se charge pas ou reste blanche +- Erreurs "Failed to fetch" dans la console +- Les appels `curl` vers les APIs timeout (10s+) + +## Root causes + +1. **Initialisation au démarrage** : Le serveur appelle `initializeFiles()` au démarrage, qui exécute `getHashList()` et `getUtxoList()` en parallèle. +2. **Cache UTXO obsolète** : Si `utxo_list_cache.txt` a l'ancien format (1 partie au lieu de 2), une mise à jour complète est déclenchée (37k+ UTXOs). +3. **Blocage du serveur** : Ces opérations (lectures/écritures sync, nombreux appels RPC) saturent la boucle d’événements Node.js. Le serveur ne peut plus traiter les requêtes HTTP. + +## Correctifs + +1. **Suppression de l’initialisation au démarrage** : Ne plus appeler `initializeFiles()` au démarrage du serveur. +2. **Suppression de la fonction `initializeFiles`** : Code mort supprimé. +3. **Mise à jour à la demande** : Les fichiers sont mis à jour lors des appels à `/api/hash/list` et `/api/utxo/list` (pages Liste des Hash, Liste des UTXO). + +## Impact + +- La home utilise `/api/blockchain/info`, `/api/anchor/count`, `/api/utxo/count`, etc., qui lisent les fichiers existants ou font des appels RPC légers. Aucune mise à jour complète n’est déclenchée au chargement de la home. +- Les pages Liste des Hash et Liste des UTXO peuvent être lentes au premier chargement (mise à jour des fichiers), mais le serveur reste réactif pour les autres requêtes. + +## Modalités de déploiement + +1. Redémarrer le service : `sudo systemctl restart signet-dashboard.service` +2. Vérifier que les APIs répondent : `curl -s -o /dev/null -w "%{http_code}\n" http://localhost:3020/api/blockchain/info` (attendu : 200) + +## Modalités d'analyse + +- Vérifier les logs : `sudo journalctl -u signet-dashboard.service -f` +- Tester les APIs : `curl http://localhost:3020/api/blockchain/info`, `curl http://localhost:3020/api/utxo/count`, `curl http://localhost:3020/api/anchor/count` + +## Pages affectées + +- `signet-dashboard/src/server.js` : suppression de `initializeFiles` et de son appel au démarrage diff --git a/signet-dashboard/src/server.js b/signet-dashboard/src/server.js index 0e699a9..842ad59 100644 --- a/signet-dashboard/src/server.js +++ b/signet-dashboard/src/server.js @@ -274,6 +274,7 @@ app.get('/api/hash/list.txt', async (req, res) => { }); // Route optimisée pour obtenir uniquement les counts UTXO (sans charger toute la liste) +// Lit directement depuis le fichier texte pour être très rapide app.get('/api/utxo/count', async (req, res) => { try { const { readFileSync, existsSync } = await import('fs'); @@ -298,16 +299,18 @@ app.get('/api/utxo/count', async (req, res) => { for (const line of lines) { const parts = line.split(';'); - if (parts.length >= 7) { + // Format: category;txid;vout;amount;confirmations;isAnchorChange;blockTime + if (parts.length >= 5) { const category = parts[0]; const amount = parseFloat(parts[3]) || 0; const confirmations = parseInt(parts[4], 10) || 0; - const isAnchorChange = parts[5] === 'true'; + // Compter les UTXOs de type anchor avec les critères minimum if (category === 'anchor' && amount >= minAnchorAmount && confirmations > 0) { anchors++; - // On assume que les UTXOs dans le fichier ne sont pas dépensés (isSpentOnchain serait dans un autre champ) - // Pour être sûr, on vérifie seulement les confirmations + // Note: On ne peut pas savoir depuis le fichier si l'UTXO est dépensé + // On compte tous les UTXOs avec confirmations > 0 comme disponibles + // C'est une approximation mais beaucoup plus rapide que de charger toute la liste availableForAnchor++; if (confirmations >= 6) { confirmedAvailableForAnchor++; @@ -909,24 +912,6 @@ app.use((req, res) => { }); }); -// Initialisation des fichiers au démarrage -async function initializeFiles() { - try { - logger.info('Initializing hash and UTXO lists...'); - await Promise.all([ - bitcoinRPC.getHashList().catch((error) => { - logger.warn('Error initializing hash list', { error: error.message }); - }), - bitcoinRPC.getUtxoList().catch((error) => { - logger.warn('Error initializing UTXO list', { error: error.message }); - }), - ]); - logger.info('Hash and UTXO lists initialized'); - } catch (error) { - logger.error('Error initializing files', { error: error.message }); - } -} - // Démarrage du serveur const server = app.listen(PORT, HOST, async () => { logger.info(`Dashboard Bitcoin Signet démarré`, { @@ -935,10 +920,10 @@ const server = app.listen(PORT, HOST, async () => { environment: process.env.NODE_ENV || 'production', }); - // Initialiser les fichiers en arrière-plan - initializeFiles().catch((error) => { - logger.error('Error during file initialization', { error: error.message }); - }); + // Ne pas initialiser les fichiers au démarrage : getHashList/getUtxoList + // bloquent le serveur (mise à jour complète si cache obsolète) et empêchent + // la page de s'afficher. Les fichiers sont mis à jour à la demande via + // /api/hash/list et /api/utxo/list. }); // Gestion de l'arrêt propre