**Motivations:** - Implement BIP39 mnemonic import for identity creation - Add password-based key protection for enhanced security - Improve pairing workflow with QR code and URL display - Migrate hash cache from LocalStorage to IndexedDB for better scalability - Update signet-dashboard and mempool components **Root causes:** - N/A (feature implementations) **Correctifs:** - N/A (no bug fixes in this commit) **Evolutions:** - BIP39 mnemonic import: Support for 12/24 word English mnemonics with BIP32 derivation path m/44'/0'/0'/0/0 - Key protection: Password-based encryption of private keys at rest with unlock/lock functionality - Pairing workflow: QR code and URL display for device pairing, form-based word exchange between devices - IndexedDB migration: Hash cache moved from LocalStorage to IndexedDB to avoid size limitations - Global action bar: URL parameter support for navigation - Pairing connection: Enhanced pairing status management **Pages affectées:** - userwallet/src/utils/identity.ts - userwallet/src/utils/keyProtection.ts - userwallet/src/utils/sessionUnlockedKey.ts - userwallet/src/utils/indexedDbStorage.ts - userwallet/src/utils/cache.ts - userwallet/src/utils/pairing.ts - userwallet/src/components/UnlockScreen.tsx - userwallet/src/components/PairingDisplayScreen.tsx - userwallet/src/components/PairingSetupBlock.tsx - userwallet/src/components/GlobalActionBar.tsx - userwallet/src/components/HomeScreen.tsx - userwallet/src/components/ImportIdentityScreen.tsx - userwallet/src/components/DataExportImportScreen.tsx - userwallet/src/hooks/useIdentity.ts - userwallet/src/hooks/usePairingConnected.ts - userwallet/src/services/syncService.ts - userwallet/src/services/pairingConfirm.ts - userwallet/src/App.tsx - userwallet/package.json - userwallet/docs/specs.md - userwallet/docs/storage.md - userwallet/docs/synthese.md - signet-dashboard/public/*.html - signet-dashboard/public/app.js - signet-dashboard/public/styles.css - mempool (submodule updates) - hash_list.txt, hash_list_cache.txt, utxo_list.txt, utxo_list_cache.txt, fees_list.txt - features/*.md (documentation files)
6.1 KiB
6.1 KiB
Synthèse structurée – UserWallet & API Relay
Author: Équipe 4NK
Date: 2026-01-26
1. userwallet/docs
ports.md
- UserWallet (Vite) : port 3018 (
vite.config.ts). - api-relay (Express) : port 3019 (ou
PORT), défaut 3019 dansindex.ts. Le README api-relay indique 3019. - Ports à éviter : 3007, 8080, 3015–3017.
specs.md
Spécification du login décentralisé (secp256k1, contrats, pairing mFA, relais) :
- Modèle : messages publiés sans signatures ni clés ; signatures et clés publiées séparément ; tout adressé par hash canonique ; récupération par GET uniquement (pull).
- Objets : Service, Contrat, Champ, Action, ActionLogin, Membre, Pair, MessageBase, Hash, Signature, Validateurs, MsgChiffre, MsgSignature, MsgCle.
- Graphe : Service → Contrat → Champ → Action(login) → Membre → Pair ; contraintes « au moins 1 parent ».
- Pairing : UUID pair ↔ mots BIP32 ; pairing obligatoire pour login.
- Écrans : accueil, création/import identité, relais, pairing, sync, services, chemin login, challenge, signatures mFA, publication, résultat.
- Machine à états : S_INIT → S_HOME, S_SYNC_GLOBAL, S_PAIR_, S_LOGIN_, etc., avec erreurs récupérables / fatales.
storage.md
- Relais : stockage hybride (mémoire +
./data/messages.json). Messages +seenHashespersistés ; signatures et clés non persistées (perdues au redémarrage). - Front : LocalStorage (
userwallet_identity,userwallet_relays,userwallet_pairs,userwallet_hash_cache, plus legacyuserwallet_keypair,userwallet_services). Graphe en mémoire uniquement (GraphResolver).
2. userwallet/ (frontend)
Stack
- React 18, React Router, Vite, TypeScript.
- Crypto :
@noble/secp256k1,@noble/hashes. - Pas de state global (hooks + services).
Structure
- /components : Home, CreateIdentity, ImportIdentity, Login, PairManagement, RelaySettings, Sync, ServiceList, ErrorDisplay, etc.
- /hooks : useIdentity, useChannel, useErrorHandler, useServices, etc.
- /services : GraphResolver, LoginBuilder, SyncService.
- /utils : relay, storage, identity, crypto, canonical, encryption, verification, cache, bip32, pairing, iframeChannel, etc.
- /types : identity, message, contract, auth, etc.
Points notables
- Identité : création (secp256k1), import (clé hex 64 car. ou phrase BIP39, dérivation m/44'/0'/0'/0/0 ; passphrase BIP39 non supportée).
- Relais : config dans LocalStorage, test
/health, GET/POST messages/signatures/keys viautils/relay. - Pairing : BIP32 UUID ↔ mots,
PairConfigavecmembres_parents_uuid,is_local,can_sign. - Graphe : GraphResolver avec caches (services, contrats, champs, actions, membres, pairs),
resolveLoginPath, validation des parents. - Login : LoginBuilder (challenge, nonce, chiffrement « for all », preuve avec signatures), publication message → signatures → clés.
- Sync : SyncService appelle les relais, HashCache (LocalStorage), déduplication, fetch clés/signatures, vérification hash/signatures/timestamp, mise à jour du graphe.
- Iframe : iframeChannel + useChannel ; messages
auth-request,auth-response,login-proof,service-status,error; postMessage vers parent avec'*'.
3. api-relay (backend relais)
Stack
- Express, CORS, JSON. TypeScript, tsx en dev.
- Pas de base de données : mémoire + persistance optionnelle (
./data).
Structure
- /routes : messages, signatures, keys, health.
- /services : StorageService, RelayService.
- /types : message (MsgChiffre, MsgSignature, MsgCle, Stored), config.
Endpoints
- GET /health :
{ status: 'ok', timestamp }. - GET /messages?start=&end=&service= : messages dans la fenêtre, optionnellement par service.
- POST /messages : enregistrement + relais.
- GET /messages/:hash : message par hash.
- GET/POST /signatures/:hash et /signatures : idem pour signatures.
- GET/POST /keys/:hash et /keys : idem pour clés.
Comportement
- Storage : messages, signatures, keys en mémoire ;
seenHashespour déduplication. Persistance : messages +seenHashesdansmessages.json; signatures et clés non sauvegardées. - Relay :
PEER_RELAYSen env ; relais des messages/signatures/clés vers les pairs via POST.
Correctif relais (POST /messages)
- Vérifier
alreadySeen = storage.hasSeenHash(msg.hash)avantstoreMessage. - Puis
storage.storeMessage(stored). - Relayer seulement si
!alreadySeen:await relay.relayMessage(msg)etstored.relayed = true.
Autres points
- config.ts : RelayConfig avec
relay_enabled,max_message_age_days, etc. Non utilisé dansindex.ts(config réelle : PORT, HOST, STORAGE_PATH, PEER_RELAYS). - README : port par défaut 3019.
4. Liens entre UserWallet et api-relay
- UserWallet appelle les endpoints du relais (messages, signatures, keys, health) via
utils/relay. - Types alignés : MsgChiffre, MsgSignature, MsgCle (structure équivalente, noms français).
- UserWallet utilise
datajson_public(services_uuid, types_uuid, timestamp, etc.) comme le relais. - Ports : front 3018, relais 3019 (voir
ports.md).
5. Synthèse
| Élément | userwallet | api-relay |
|---|---|---|
| Rôle | Front login décentralisé (secp256k1, contrats, pairing mFA) | Relais stockage + diffusion messages/signatures/clés |
| Port | 3018 | 3019 |
| Stockage | LocalStorage (identité, relais, pairs, hash cache) | Mémoire + JSON (messages, seenHashes) ; sig/keys non persistées |
| Specs | Aligné avec specs.md (graphe, ordre message→sig→clés, pull-only) | Séparation messages / signatures / clés, dédup par hash |