**Motivations:** - Résoudre erreur "No UTXO large enough" en combinant plusieurs petits UTXOs - Refactorer api-relay avec interface StorageServiceInterface pour meilleure abstraction - Ajouter script restart-bitcoind.sh **Root causes:** - api-anchorage: logique cherchait uniquement un UTXO assez grand, ne combinait pas plusieurs petits UTXOs - api-relay: code dupliqué entre StorageService et DatabaseStorageService **Correctifs:** - api-anchorage: combinaison automatique de plusieurs petits UTXOs si aucun assez grand, ajustement frais pour inputs multiples, limite 20 UTXOs, gestion cohérente verrouillage/déverrouillage **Evolutions:** - api-relay: StorageServiceInterface (abstraction commune), refactoring routes (keys, messages, signatures, metrics, bloom) pour utiliser interface, eslint config, package updates - fixKnowledge: api-anchorage-combine-utxos.md (documentation correction) - restart-bitcoind.sh: script redémarrage bitcoind **Pages affectées:** - api-anchorage: bitcoin-rpc.js - api-relay: eslint.config.mjs, package.json, index.ts, middleware/auth.ts, routes (bloom, keys, messages, metrics, signatures), services (apiKeyService, database, relay, storageAdapter, storageInterface) - fixKnowledge: api-anchorage-combine-utxos.md - restart-bitcoind.sh
5.1 KiB
Correction : Combinaison de plusieurs petits UTXOs pour les ancrages avec provisionnement
Auteur : Équipe 4NK
Date : 2026-01-28
Problème Identifié
L'API d'ancrage retournait une erreur "No UTXO large enough for anchor with provisioning. Required: 0.00023055 BTC, Largest available: 0.000025 BTC" même lorsque le wallet contenait de nombreux petits UTXOs dont la somme était suffisante.
Symptômes
- Erreur : "No UTXO large enough for anchor with provisioning. Required: 0.00023055 BTC, Largest available: 0.000025 BTC"
- Le wallet contient plusieurs petits UTXOs de 2500 sats (0.000025 BTC) créés par le provisionnement précédent
- Aucun UTXO assez grand individuellement pour créer une transaction avec provisionnement
- L'API ne peut pas créer de transaction d'ancrage malgré un solde total suffisant
Cause Racine
La logique de sélection d'UTXOs cherchait uniquement un seul UTXO assez grand pour couvrir le montant total nécessaire (ancrage + 7 UTXOs de provisionnement + frais ≈ 0.00023055 BTC).
Problème technique : Le système ne combinait pas plusieurs petits UTXOs pour atteindre le montant requis. Tous les UTXOs disponibles étaient des petits UTXOs de 2500 sats créés par le provisionnement précédent, mais aucun UTXO individuel n'était assez grand.
Correctifs Appliqués
Combinaison automatique de plusieurs UTXOs
Fichier : api-anchorage/src/bitcoin-rpc.js
Modification : Ajout d'une logique de combinaison automatique de plusieurs petits UTXOs si aucun UTXO assez grand n'est trouvé.
Stratégie :
- Si aucun UTXO assez grand n'est trouvé, récupérer tous les petits UTXOs disponibles
- Sélectionner les UTXOs par ordre décroissant jusqu'à atteindre le montant nécessaire
- Ajuster l'estimation des frais pour tenir compte des inputs supplémentaires (~148 bytes par input)
- Créer une transaction avec plusieurs inputs combinant tous les UTXOs sélectionnés
- Verrouiller/déverrouiller tous les UTXOs de manière cohérente
Détails techniques :
- Limite de 20 UTXOs maximum pour éviter des transactions trop grandes
- Estimation des frais ajustée dynamiquement : +0.0000001 BTC par input supplémentaire
- Vérification de disponibilité de tous les UTXOs avant création de la transaction
- Marquage de tous les UTXOs comme dépensés après création réussie
- Déverrouillage de tous les UTXOs en cas d'erreur ou de retry
Modifications
Fichiers Modifiés
api-anchorage/src/bitcoin-rpc.js:- Logique de sélection d'UTXOs : combine plusieurs petits UTXOs si nécessaire
- Création de transaction : utilise plusieurs inputs au lieu d'un seul
- Calcul du change : utilise
totalSelectedAmountau lieu deselectedUtxo.amount - Vérification de disponibilité : vérifie tous les UTXOs sélectionnés
- Gestion des erreurs : déverrouille et marque tous les UTXOs comme dépensés
- Logs : inclut le nombre d'UTXOs combinés
Modalités de Déploiement
Redémarrage de l'API
-
Arrêter l'API :
ps aux | grep "node.*api-anchorage" | grep -v grep | awk '{print $2}' | xargs kill -
Redémarrer l'API :
cd /srv/4NK/<domaine>/api-anchorage npm start
Vérification
-
Tester avec plusieurs petits UTXOs :
- Vérifier que l'API peut créer un ancrage même si tous les UTXOs sont petits
- Vérifier que les logs indiquent "Combining multiple UTXOs for anchor transaction"
-
Vérifier les transactions :
- Les transactions doivent avoir plusieurs inputs si plusieurs UTXOs sont combinés
- Le change doit être calculé correctement avec le montant total des inputs
Résultat
✅ Problème résolu
- L'API peut maintenant combiner plusieurs petits UTXOs pour créer un ancrage avec provisionnement
- Plus d'erreur "No UTXO large enough" si le solde total est suffisant
- Les transactions avec plusieurs inputs sont correctement créées et gérées
- Tous les UTXOs sont correctement verrouillés/déverrouillés et marqués comme dépensés
Exemple de transaction avec UTXOs combinés :
- Transaction : N inputs (petits UTXOs) → 1 OP_RETURN + 1 ancrage (2500 sats) + 7 provisioning (2500 sats chacun) + change
- Les frais sont ajustés pour tenir compte des inputs supplémentaires
Prévention
Pour éviter ce problème à l'avenir :
- Combinaison automatique : Le système combine maintenant automatiquement plusieurs petits UTXOs si nécessaire
- Limite de taille : Limite de 20 UTXOs maximum pour éviter des transactions trop grandes
- Estimation des frais : Les frais sont ajustés dynamiquement pour les transactions avec plusieurs inputs
- Gestion cohérente : Tous les UTXOs sont gérés de manière cohérente (verrouillage, déverrouillage, marquage comme dépensé)
Pages Affectées
api-anchorage/src/bitcoin-rpc.js:- Fonction
createAnchorTransaction(): Logique de combinaison de plusieurs UTXOs - Gestion des inputs multiples dans la création de transaction
- Vérification et gestion de tous les UTXOs sélectionnés
- Fonction
fixKnowledge/api-anchorage-combine-utxos.md: Documentation (nouveau)