Add automatic provisioning reduction when funds are insufficient

**Motivations:**
- Permettre l'ancrage même si les fonds sont insuffisants pour le provisioning complet
- Réduire automatiquement le provisioning si nécessaire au lieu d'échouer
- Garantir qu'un ancrage minimal peut toujours être créé si les fonds sont suffisants

**Root causes:**
- Le système échouait si les fonds étaient insuffisants pour le provisioning complet (7 UTXOs)
- Aucune logique de fallback pour réduire le provisioning ou permettre un ancrage minimal
- Les utilisateurs devaient manuellement réduire le provisioning ou obtenir plus de fonds

**Correctifs:**
- Ajout d'une logique de réduction automatique du provisioning si les fonds sont insuffisants
- Réduction progressive : 7 → 6 → 5 → 4 → 3 → 2 → 1 → 0 UTXOs de provisioning
- En dernier recours, permet un ancrage sans provisioning (juste l'ancrage du hash)
- Récursion avec provisioning réduit si l'essai initial échoue

**Evolutions:**
- Le système essaie maintenant automatiquement avec un provisioning réduit si nécessaire
- L'ancrage est toujours créé si les fonds sont suffisants pour au moins l'ancrage minimal
- Les logs indiquent quand le provisioning est réduit automatiquement

**Pages affectées:**
- api-anchorage/src/bitcoin-rpc.js
- fixKnowledge/api-anchorage-utxo-robustness-improvements.md
This commit is contained in:
ncantu 2026-01-28 15:17:54 +01:00
parent 1090e39a8a
commit b17387664c
2 changed files with 41 additions and 3 deletions

View File

@ -527,6 +527,34 @@ class BitcoinRPC {
} }
if (totalSelectedAmount < finalTotalNeeded) { if (totalSelectedAmount < finalTotalNeeded) {
// Si les fonds sont insuffisants, essayer de réduire le provisioning progressivement
// Ne réduire que si numberOfProvisioningUtxos n'a pas été explicitement fourni
if (numberOfProvisioningUtxos === null && provisioningCount > 0) {
logger.info('Insufficient funds for full provisioning, trying with reduced provisioning', {
currentProvisioning: provisioningCount,
totalAvailable: totalAvailable,
required: finalTotalNeeded,
});
// Essayer avec un provisioning réduit (récursion)
// Réduire progressivement : 7 -> 6 -> 5 -> 4 -> 3 -> 2 -> 1 -> 0
const reducedProvisioning = Math.max(0, provisioningCount - 1);
logger.info('Retrying with reduced provisioning', {
newProvisioning: reducedProvisioning,
hash: hash.substring(0, 16) + '...',
});
// Libérer le mutex avant la récursion
releaseMutex();
if (mutexSafetyTimeout) {
clearTimeout(mutexSafetyTimeout);
}
// Réessayer avec provisioning réduit
return this.createAnchorTransaction(hash, recipientAddress, null, reducedProvisioning, retryCount);
}
// Si on ne peut pas réduire le provisioning ou si on est déjà à 0, échouer
const largestUtxo = availableUtxos[0]; const largestUtxo = availableUtxos[0];
// Suggérer des solutions dans le message d'erreur // Suggérer des solutions dans le message d'erreur
@ -535,7 +563,7 @@ class BitcoinRPC {
if (shortfall > 0) { if (shortfall > 0) {
suggestion = ` Total available from all ${availableUtxos.length} UTXOs: ${totalAvailable.toFixed(8)} BTC. ` + suggestion = ` Total available from all ${availableUtxos.length} UTXOs: ${totalAvailable.toFixed(8)} BTC. ` +
`Shortfall: ${shortfall.toFixed(8)} BTC. ` + `Shortfall: ${shortfall.toFixed(8)} BTC. ` +
`Solutions: 1) Use faucet to get more funds, 2) Mine more blocks, 3) Consolidate UTXOs via dashboard, 4) Reduce provisioning count.`; `Solutions: 1) Use faucet to get more funds, 2) Mine more blocks, 3) Consolidate UTXOs via dashboard.`;
} else { } else {
suggestion = ` All ${availableUtxos.length} available UTXOs total ${totalAvailable.toFixed(8)} BTC, which should be sufficient. ` + suggestion = ` All ${availableUtxos.length} available UTXOs total ${totalAvailable.toFixed(8)} BTC, which should be sufficient. ` +
`This may be a fee estimation issue. Consider consolidating UTXOs via dashboard to create larger UTXOs.`; `This may be a fee estimation issue. Consider consolidating UTXOs via dashboard to create larger UTXOs.`;

View File

@ -200,6 +200,18 @@ Pour éviter ce problème à l'avenir :
3. **Messages d'erreur informatifs** : Inclure des suggestions de solutions dans les messages d'erreur 3. **Messages d'erreur informatifs** : Inclure des suggestions de solutions dans les messages d'erreur
4. **Consolidation automatique** : Considérer l'ajout d'une consolidation automatique des UTXOs quand ils deviennent trop nombreux 4. **Consolidation automatique** : Considérer l'ajout d'une consolidation automatique des UTXOs quand ils deviennent trop nombreux
## Solutions Automatiques
Le système réduit maintenant automatiquement le provisioning si les fonds sont insuffisants :
1. **Réduction automatique du provisioning** : Si les fonds sont insuffisants pour le provisioning complet (7 UTXOs), le système essaie automatiquement avec un provisioning réduit (6, 5, 4, 3, 2, 1, 0)
2. **Ancrage minimal** : En dernier recours, le système permet un ancrage sans provisioning (juste l'ancrage du hash)
**Comportement** :
- Essai initial avec provisioning complet (7 UTXOs par défaut)
- Si échec, réduction progressive jusqu'à 0 UTXO de provisioning
- L'ancrage est toujours créé si les fonds sont suffisants pour au moins l'ancrage minimal
## Solutions Recommandées ## Solutions Recommandées
Si le problème persiste malgré ces améliorations : Si le problème persiste malgré ces améliorations :
@ -216,8 +228,6 @@ Si le problème persiste malgré ces améliorations :
- Activer le mining si désactivé - Activer le mining si désactivé
- Attendre que les blocs soient minés et confirmés - Attendre que les blocs soient minés et confirmés
4. **Réduire le provisioning** : Réduire le nombre d'UTXOs de provisioning (modifier le code si nécessaire)
## Pages Affectées ## Pages Affectées
- `api-anchorage/src/bitcoin-rpc.js` : - `api-anchorage/src/bitcoin-rpc.js` :