anchorage_layer_simple/features/userwallet-contrat-login-reste-a-faire.md
ncantu f7f9442156 Fix Bitcoin miner PSBT signing after bitcoind restart
**Motivations:**
- Miner stopped producing blocks after bitcoind and mempool restart
- PSBT signing failed with "PSBT signing failed" error
- descriptorprocesspsbt failed with "Argument list too long" error due to large PSBT size (1.5MB)

**Root causes:**
- descriptorprocesspsbt called via command line exceeded argument length limit when PSBT is large
- walletprocesspsbt succeeded but could not mark PSBT as complete because it cannot sign artificial signet transactions (to_spend/spend) which are not real UTXOs in wallet
- After restart, the miner needed descriptorprocesspsbt to sign artificial signet transactions, but command line approach failed

**Correctifs:**
- Modified miner to use JSON-RPC HTTP API directly for descriptorprocesspsbt instead of command line
- PSBT is now passed via HTTP request body, avoiding command line argument length limit
- Added fallback to walletprocesspsbt if HTTP RPC fails
- Updated mine.sh to use -rpcwallet and -datadir correctly for wallet operations

**Evolutions:**
- Miner now uses HTTP JSON-RPC for large PSBTs, making it more robust for signet mining with many transactions
- Improved error handling with fallback mechanisms

**Pages affectées:**
- miner: Modified PSBT signing logic to use HTTP JSON-RPC for descriptorprocesspsbt
- mine.sh: Updated to use -rpcwallet and -datadir correctly
2026-01-27 23:30:19 +01:00

97 lines
8.3 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.

# Contrat et login reste à faire
**Author:** Équipe 4NK
**Date:** 2026-01-26
## 1. Principe (rappel)
Le login décentralisé repose sur :
- **Graphe contractuel** : Service → Contrat → Champ → Action(login) → Membre → Pair ; contraintes « au moins 1 parent ».
- **Validateurs** : signatures requises pour laction login, liées aux pairs/membres du graphe.
- **Pairing mFA** : obligatoire ; au moins un pair attendu par laction login doit être disponible.
- **Publication en trois temps** : message chiffré (sans sig ni clés) → signatures → clés ; tout adressé par hash canonique, récupéré par GET (pull-only).
- **Vérification locale** : conformité graphe + signatures + anti-rejeu (nonce, fenêtre temporelle) ; pas dautorité centrale.
Référence : `userwallet/docs/specs.md` (modèle, objets, machine à états, catalogue).
---
## 2. Déjà en place
- **Identité** : création secp256k1, import (hex ou BIP39), protection par mot de passe, déverrouillage.
- **Pairing** : 8 mots BIP32-style, WordInputGrid, confirmation croisée « membre finaliser », IndexedDB, statut « Connecté ».
- **Relais** : config, health, GET/POST messages/signatures/keys, **GET /bloom** ; sync, HashCache (IndexedDB), dédup, fetch clés/signatures.
- **Graphe** : GraphResolver, caches (services, contrats, champs, actions, membres, pairs), `resolveLoginPath`.
- **Login** : LoginBuilder (challenge, nonce, chiffrement « for all »), construction preuve, publication message → signatures → clés. **Notifications relais** : `runCollectLoop` `onProgress`, `collectProgress`, affichage « Signatures collectées : X / Y » dans LoginCollectShare. **Anti-rejeu** : NonceStore (IndexedDB), vérification timestamp (fenêtre), `X_NONCE_REUSED` / `X_TIMESTAMP_OUT_OF_WINDOW` avant publish.
- **Iframe** : auth-request / auth-response / login-proof, useChannel, postMessage.
- **Écrans** : Home, CreateIdentity, ImportIdentity, RelaySettings, Sync, Manage Pairs, Pairing (setup + display), Services, Login, Data Export/Import, Unlock. Navigation via GlobalActionBar.
---
## 3. Reste à faire (principes contrat & login)
### 3.1 Machine à états formelle
- **Fait** : `loginStateMachine` (états S_LOGIN_*, événements E_*), `useLoginStateMachine`, dispatch dans LoginScreen, Retour → E_BACK ; G_PAIRING_SATISFIED, E_ADD_PAIR / E_SYNC_NOW. **Timeouts** : `RELAY_FETCH_TIMEOUT_MS` sur tous les fetch relay (GET/POST). Pas de backoff. Voir `features/userwallet-login-state-machine.md`, `features/userwallet-timeouts-backoff.md`.
- **À prévoir** : timeouts sur collecte signatures (fetch relay) si distinct.
### 3.2 Écrans et UX alignés specs
**À valider avant implémentation.** Voir `features/userwallet-ecrans-login-a-valider.md`.
- **Service iframe** : fourni par channel message (contrat + contrats fils). Si absent → contrat par défaut en dur dans le front jusquà réception.
- **Écrans login** : déjà en place. **Notifications relais** : progression collecte signatures (X/Y) implémentée via `onProgress` dans `runCollectLoop` et affichage dans `LoginCollectShare` ; voir `features/userwallet-notifications-relais.md`. Reste à faire : réagir à dautres événements relais si extension (ex. push) — hash à fetch pour signatures, contrats, membres, pairs, actions, champs.
- Cette section **évoluera avec l'avancement des tests** une fois validée.
- **Sélection service / sélection membre** : écrans dédiés « choisir le service cible du login » et « choisir le membre (quand plusieurs) » avec liste, statuts, validation des prérequis (action login, pairs).
- **Construction du chemin login** : écran dédié avec résumé (service → contrat → action login → membre → pairs), tableau « signatures requises » (validateurs, qui doit signer, manquante/reçue/valide/invalide), boutons Synchroniser / Démarrer login.
- **Message de login à valider** : écran avec résumé public (service, type, timestamp, relais), nonce (mode avancé), « signer ».
- **Collecte signatures mFA** : écran listant les signatures requises (clé, pair/membre, état), actions « signer avec ce device », « demander signature sur autre pair », « rafraîchir » (fetch), « voir détail ».
- **Publication du login** : écran dédié (ou étape claire) avec ordre strict message → signatures → clés, statut par relais, erreurs explicites.
- **Vérification locale + résultat** : écran/étape « vérification locale finale » (hash, signatures, graphe, anti-rejeu) puis succès / échec avec diagnostics (signatures manquantes, objets manquants, etc.).
### 3.3 États et diagnostics visibles
- **Message reçu mais indéchiffrable (clé manquante)** et **message déchiffré mais non validé (signature manquante)** : **fait**. Sync retourne `indechiffrable` et `nonValide` ; SyncScreen affiche « Indéchiffrables (clé manquante) » et « Non validés (ex. signature manquante) ».
- **Contrat incomplet** : affichage explicite lorsque le graphe est incomplet (LoginScreen : `path.statut === 'incomplet'`, erreur « Chemin incomplet »).
- **Statut par relais** : **fait**. Sync retourne `relayStatus` (endpoint + ok) ; SyncScreen affiche « Statut relais » (OK / indisponible par relais).
### 3.4 Anti-rejeu et nonce
- **Nonce unique** : **fait**. Chaque login utilise un nonce ; pas de republication du même nonce.
- **Cache `nonce_vus`** : **fait**. `NonceStore` (IndexedDB, `userwallet_nonce_cache`), TTL 1 h ; `init` / `hasUsed` / `markUsed`. Vérification timestamp via `verifyTimestamp` (fenêtre 5 min).
- **Erreurs** : **fait**. `X_NONCE_REUSED`, `X_TIMESTAMP_OUT_OF_WINDOW` avant publish ; messages explicites dans LoginScreen.
### 3.5 Validation et conformité
- **Fait** : `verifyMessageSignaturesStrict`, `filterSignaturesByAuthorizedPubkeys` ; `buildAllowedPubkeys` (résolution `cle_publique` depuis pairs) ; `checkCardinalitySupported` (refus si `cardinalite_minimale > 1`) ; **`checkDependenciesSatisfied`** (membres des `dependances` doivent avoir ≥1 signature dans la preuve, via pair du membre) ; contrats version non supportée exclus ; `contrat_version` affiché. Voir `features/userwallet-validation-conformite.md`.
- **Fait** : support de `cardinalite_minimale > 1` via **collecte distante** (2 devices). Device 1 publie message + sigs locales, boucle de collecte (fetch sigs par hash), Device 2 signe via `/login-sign?hash=...&nonce=...` (lien/QR) et poste sa sig. Voir `features/userwallet-collecte-distante-2-devices.md`.
### 3.6 Scan et optimisation (optionnel)
- **Bloom filter** : **fait**. `getBloom(relay)` ; `utils/bloom``fetchAndLoadBloom` ; sync fetch les Bloom, `fetchKeys` skip `getKeys` quand `!bloom.has(hash)` (pas de faux négatifs). Voir `features/userwallet-bloom-usage-sync.md`.
- **Merkle trees** : checkpointing / accélération de scan (optionnel, non implémenté).
### 3.7 Côté service (hors userwallet)
- **Acceptation de session** : le service (application qui consomme le login) doit vérifier la preuve en ne sappuyant que sur contrats + signatures (sans serveur central). Rejouer la construction du graphe depuis les UUID/messages disponibles, vérifier hash, signatures, anti-rejeu.
- **Politique anti-rejeu** : TTL nonce, fenêtre timestamp, cache nonce_vus.
---
## 4. Synthèse
| Domaine | Statut | Priorité |
|--------|--------|----------|
| Machine à états login | Fait (loginStateMachine, useLoginStateMachine, dispatch) | — |
| Écrans sélection service / membre, chemin login, collecte sig, publication, vérification | À valider avant implémentation (voir userwallet-ecrans-login-a-valider) ; notifications relais (progression X/Y) fait (userwallet-notifications-relais) | Haute |
| États « indéchiffrable » / « signature manquante » / statut relais visibles | Fait (Sync) | — |
| Anti-rejeu (nonce, fenêtre, cache) | Fait (NonceStore, verifyTimestamp, X_*) | — |
| Validation stricte validateurs + clé autorisée | Fait (strict verify, version contrats) | — |
| Version contrats | Fait (supported check, affichage) | — |
| Bloom API + usage sync | Fait (`getBloom`, `fetchAndLoadBloom`, skip key fetch) | — |
| Merkle (scan) | Optionnel, non implémenté | Basse |
Les éléments de la section « Déjà en place » restent le socle ; les développements cidessus les complètent pour coller au principe « contrat + login » décrit dans `specs.md`.