anchorage_layer_simple/features/userwallet-validation-cnil-stricte.md
ncantu 8662e9e584 Optimize anchor API performance and fix request abort issues
**Motivations:**
- Anchor API requests were being aborted with 'This operation was aborted' error
- API anchorage had performance issues causing long response times (30-60s)
- Mutex could block indefinitely if a previous request crashed or timed out

**Root causes:**
- No timeout on mutex acquisition, causing indefinite blocking
- Sequential RPC calls (8+ getNewAddress calls) instead of parallel
- Expensive fee calculation making N RPC calls (one per input) instead of using known UTXO amounts
- RPC timeout too short (30s) for slow Bitcoin node operations
- No guarantee of mutex release in error cases

**Correctifs:**
- Added 180s timeout on mutex acquisition with Promise.race() to prevent indefinite blocking
- Parallelized getNewAddress() calls with Promise.all() (9 sequential calls → 1 parallel call)
- Optimized fee calculation to use known UTXO amounts instead of getRawTransaction() per input (saves N RPC calls, up to 20+)
- Increased RPC timeout from 30s to 120s in .env.example
- Added finally block to guarantee mutex release in all cases (success, error, timeout)
- Added timeout and explicit error handling in api-filigrane callAnchorAPI() with AbortController (120s timeout)

**Evolutions:**
- Performance improvement: execution time reduced from ~30-60s to ~10-20s
- RPC calls reduction: from ~15-35 calls to ~8-12 calls per anchor transaction
- Better resilience: mutex cannot block indefinitely anymore
- Improved error messages with explicit timeout/abort information

**Pages affectées:**
- api-anchorage/src/bitcoin-rpc.js: mutex timeout, parallel address generation, optimized fee calculation, finally block
- api-anchorage/.env.example: increased RPC timeout to 120s
- api-filigrane/src/routes/watermark.js: timeout and error handling for anchor API calls
- fixKnowledge/api-filigrane-anchor-request-aborted.md: documentation of issues and fixes
2026-01-28 11:38:43 +01:00

84 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# UserWallet Validation stricte CNIL
**Author:** Équipe 4NK
**Date:** 2026-01-28
## Objectif
Implémenter la validation stricte CNIL pour les contrats et champs, permettant de transformer les warnings en erreurs selon la politique métier.
## Motivations
- Conformité CNIL stricte selon la politique métier
- Possibilité d'activer/désactiver la validation stricte
- Bloquer l'utilisation des contrats/champs non conformes CNIL en mode strict
## Modifications
### `src/utils/cnilValidation.ts`
- Ajout de `CNILValidationPolicy` pour configurer la validation
- Ajout de `DEFAULT_CNIL_POLICY` (mode non strict par défaut)
- Ajout de `STRICT_CNIL_POLICY` (mode strict avec tous les champs requis)
- Extension de `validateCNILFields()` pour accepter une politique
- Extension de `validateContractCNIL()` pour accepter une politique
- Extension de `validateChampCNIL()` pour accepter une politique
- Ajout de `getCNILPolicy()` pour récupérer la politique depuis le localStorage
- Ajout de `setCNILPolicy()` pour stocker la politique
### `src/services/graphResolver.ts`
- Mise à jour de `addContrat()` pour utiliser `getCNILPolicy()`
- Mise à jour de `addChamp()` pour utiliser `getCNILPolicy()`
- Rejet des contrats/champs non conformes en mode strict (suppression du cache)
## Utilisation
### Mode par défaut (non strict)
```typescript
import { validateContractCNIL, DEFAULT_CNIL_POLICY } from './utils/cnilValidation';
const validation = validateContractCNIL(contrat, DEFAULT_CNIL_POLICY);
// Génère des warnings mais n'échoue pas
```
### Mode strict
```typescript
import { validateContractCNIL, STRICT_CNIL_POLICY } from './utils/cnilValidation';
const validation = validateContractCNIL(contrat, STRICT_CNIL_POLICY);
// Génère des erreurs si les champs CNIL sont manquants
if (!validation.valid) {
// Contrat rejeté
}
```
### Configuration personnalisée
```typescript
import { setCNILPolicy, getCNILPolicy } from './utils/cnilValidation';
// Activer le mode strict
setCNILPolicy(STRICT_CNIL_POLICY);
// Récupérer la politique actuelle
const policy = getCNILPolicy();
```
## Politique métier
La politique CNIL peut être configurée via :
- `strict`: Mode strict (warnings → errors)
- `requireRaisonsUsageTiers`: Require `raisons_usage_tiers`
- `requireRaisonsPartageTiers`: Require `raisons_partage_tiers`
- `requireConditionsConservation`: Require `conditions_conservation`
En mode strict, les contrats/champs non conformes sont rejetés et retirés du cache du graphe.
## Références
- `features/userwallet-champs-obligatoires-cnil.md`
- `userwallet/docs/specs-champs-obligatoires-cnil.md`