**Motivations:** - Ajouter dates manquantes dans hash_list.txt et compléter historique - Compléter blockTime manquants dans utxo_list.txt et compléter historique - Récupérer frais depuis transactions d'ancrage (OP_RETURN) et les stocker - Bouton UI pour déclencher récupération frais - Diagnostic Bloc Rewards (pourquoi ~4700 BTC au lieu de 50 BTC) **Root causes:** - hash_list.txt sans date (format ancien) - utxo_list.txt blockTime souvent vide - Frais absents du fichier (métadonnées OP_RETURN non stockées) - Pas de moyen de récupérer/compléter frais depuis UI **Correctifs:** - hash_list.txt : format étendu avec date (rétrocompatible) - utxo_list.txt : blockTime complété automatiquement lors écritures - fees_list.txt : nouveau fichier pour stocker frais - updateFeesFromAnchors() : récupère frais depuis OP_RETURN ancrages - Endpoint /api/utxo/fees/update pour déclencher récupération - Bouton "Récupérer les frais depuis les ancrages" dans section Frais (spinner) - Scripts batch : complete-hash-list-dates.js, complete-utxo-list-blocktime.js - Script diagnostic : diagnose-bloc-rewards.js (subsidy, coinbase, listunspent) **Evolutions:** - Frais chargés depuis fees_list.txt dans getUtxoList - Complétion automatique dates/blockTime lors écritures futures **Pages affectées:** - signet-dashboard/src/bitcoin-rpc.js - signet-dashboard/src/server.js - signet-dashboard/public/utxo-list.html - scripts/complete-hash-list-dates.js - scripts/complete-utxo-list-blocktime.js - scripts/diagnose-bloc-rewards.js - features/utxo-list-fees-update-and-historical-completion.md
12 KiB
Login Site with secp256k1 Authentication for Iframe Integration
Author: Équipe 4NK Date: 2026-01-25 Version: 2.0
État d'avancement
✅ Implémenté
-
Types TypeScript complets selon les spécifications :
MessageBase,Hash,Signature,EncryptionKeys,DataJsonMessageAValider,Validateurs,MembreRole,SignatureRequirementMsgChiffre,MsgSignature,MsgCleService,Contrat,Champ,Action,ActionLogin,Membre,PairLocalIdentity,RelayConfig,PairConfig,ServiceStatus,LoginPath,LoginChallenge,LoginProof
-
Utilitaires cryptographiques :
- Génération de paires de clés secp256k1
- Signature et vérification de messages
- Calcul de hash canonique (sans hash, signatures, clés)
- Canonisation JSON
-
Utilitaires BIP32 :
- Conversion UUID ↔ mots BIP32 pour le pairing
- Génération d'UUID
-
Gestion des identités locales :
- Création d'identité avec clés secp256k1
- Import d'identité (structure de base)
- Stockage LocalStorage
- Hook
useIdentity
-
Gestion des relais :
- Configuration et stockage des relais
- Test de connectivité
- GET messages chiffrés, signatures, clés
- POST message, signatures, clés
-
Gestion du pairing :
- Création de pair local avec mots BIP32
- Ajout de pair distant depuis mots BIP32
- Vérification du statut de pairing
- Stockage LocalStorage
-
Écran d'accueil :
- Affichage du statut de l'identité
- Affichage du statut de pairing
- Affichage du statut réseau
- Navigation vers les autres écrans
-
Structure de navigation :
- React Router configuré
- Routes de base pour tous les écrans
✅ Implémenté (suite)
-
Résolution du graphe contractuel :
- Service
GraphResolverpour résoudre Service → Contrat → Champ → Action → Membre → Pair - Vérification des contraintes "au moins 1 parent"
- Calcul des validateurs et signatures requises
- Cache local du graphe
- Service
-
Construction et publication des messages de login :
- Service
LoginBuilderpour construire les challenges - Génération du nonce
- Construction MessageBase avec datajson
- Chiffrement du message (base64 pour l'instant)
- Calcul du hash canonique
- Publication en ordre strict : message → signatures → clés
- Service
-
Synchronisation :
- Service
SyncServicepour synchroniser depuis les relais - Déduplication par hash
- Fetch séparé des signatures et clés
- Mise à jour du graphe local
- Compteurs de statistiques
- Service
-
Écrans complets :
- Écran d'accueil avec statuts
- Création d'identité locale
- Import d'identité
- Gestion des relais (liste, ajout, test, activation/désactivation)
- Gestion des pairs (liste, ajout local avec mots BIP32, ajout distant)
- Synchronisation globale
- Écran de login (construction du chemin, challenge, publication)
✅ Améliorations récentes
-
Chiffrement réel :
- Remplacement du base64 par AES-GCM
- Support ECDH pour le partage de clés
- Fonctions
encryptWithECDH/decryptWithECDHpour chiffrement point-à-point - Fonctions
encryptForAll/decryptForAllpour publication "pour tous"
-
Vérification locale avancée :
- Service
verification.tsavec vérification du hash canonique - Vérification des signatures secp256k1
- Cache de nonces pour anti-rejeu (
NonceCache) - Vérification des timestamps dans une fenêtre acceptable
- Intégration dans
SyncServicepour validation automatique
- Service
-
Gestion des erreurs :
- Hook
useErrorHandlerpour gestion centralisée - Composant
ErrorDisplaypour affichage utilisateur - Messages d'erreur contextuels avec codes
- Détails techniques disponibles en mode développeur
- Intégration dans tous les écrans principaux
- Hook
✅ Nouvelles fonctionnalités
-
Communication iframe Channel Messages :
- Utilitaires
iframeChannel.tspour communication bidirectionnelle - Hook
useChannelpour écouter et envoyer des messages - Support des messages :
auth-request,auth-response,login-proof,service-status,error - Intégration automatique dans l'application principale
- Envoi automatique de la preuve de login au parent
- Utilitaires
-
Cache persistant des hash :
- Classe
HashCachepour éviter le rescan des messages déjà vus - Persistance dans LocalStorage
- Pruning automatique si le cache devient trop volumineux (>10000 entrées)
- Intégration dans
SyncServicepour optimisation
- Classe
-
Écran de liste des services :
- Affichage des services découverts via synchronisation
- Statut de contrat (complet/incomplet, valide/invalide)
- Sélection directe d'un service pour login
- Navigation depuis l'écran d'accueil
-
Améliorations UX :
- Support des paramètres URL pour pré-remplir le service dans le login
- Meilleure intégration entre écrans
- Feedback visuel amélioré
🚧 À améliorer/optimiser
-
Optimisations avancées :
- Bloom filter pour éviter le rescan à grande échelle
- Arbres de Merkle (optionnel) pour synchronisation efficace
- Compression des données en cache
-
Fonctionnalités iframe :
- Support de l'activation/désactivation de services depuis l'iframe
- Gestion des événements de login depuis le parent
-
Gestion des erreurs avancée :
- Retry automatique pour les publications
- Gestion des timeouts réseau avec backoff exponentiel
- Queue de publication pour gérer les échecs
-
UI/UX supplémentaires :
- Indicateurs de progression pour les opérations longues
- Animations de transition
- Mode sombre/clair
- Internationalisation (i18n)
Objectif
Créer un site de login avec authentification basée sur des clés secp256k1, conçu pour être intégré en iframe par Channel Messages. Le site permet d'activer ou désactiver le login sur des services depuis une identité numérique à base de clé secp256k1.
Impacts
Fonctionnels
- Authentification sécurisée via signature de challenges avec clés secp256k1
- Communication bidirectionnelle avec le parent via
postMessage - Gestion de l'activation/désactivation du login par service
- Génération et stockage sécurisé des paires de clés
- Interface utilisateur accessible et responsive
Techniques
- Nouveau projet React + TypeScript avec Vite
- Utilisation de
@noble/secp256k1pour la cryptographie - Stockage local des clés et configuration via LocalStorage
- Architecture modulaire avec séparation des responsabilités
- Support iframe avec détection automatique du contexte
Sécurité
- Clés privées stockées localement (LocalStorage)
- Signature de challenges pour l'authentification
- Communication iframe sécurisée via
postMessage - Pas de transmission de clés privées
Modifications
Structure du projet
userwallet/
├── src/
│ ├── components/
│ │ ├── LoginForm.tsx # Formulaire de connexion
│ │ └── ServiceList.tsx # Liste des services avec toggles
│ ├── hooks/
│ │ ├── useAuth.ts # Hook d'authentification
│ │ └── useServices.ts # Hook de gestion des services
│ ├── types/
│ │ └── auth.ts # Types TypeScript pour l'auth
│ ├── utils/
│ │ ├── crypto.ts # Fonctions cryptographiques secp256k1
│ │ ├── iframe.ts # Communication iframe
│ │ └── storage.ts # Gestion LocalStorage
│ ├── App.tsx # Composant principal
│ ├── main.tsx # Point d'entrée
│ └── index.css # Styles globaux
├── package.json
├── tsconfig.json
├── vite.config.ts
└── eslint.config.mjs
Fonctionnalités implémentées
-
Authentification secp256k1
- Génération de paires de clés au premier chargement
- Signature de challenges pour l'authentification
- Vérification de signatures (pour usage futur)
-
Communication iframe
- Détection automatique du contexte iframe
- Messages
postMessagevers le parent - Support des messages :
auth-request,auth-response,service-toggle,service-status
-
Gestion des services
- Stockage de la configuration des services
- Activation/désactivation par service
- Synchronisation avec le parent via messages
-
Interface utilisateur
- Formulaire de connexion
- Liste des services avec toggles
- Affichage de la clé publique (tronquée)
- Design responsive avec support dark mode
Types de messages iframe
auth-request
Demande d'authentification depuis le parent.
{
type: 'auth-request',
payload: {
serviceId: string
}
}
auth-response
Réponse avec signature.
{
type: 'auth-response',
payload: {
signature: string,
publicKey: string,
message: string
}
}
service-toggle
Activation/désactivation d'un service.
{
type: 'service-toggle',
payload: {
serviceId: string,
enabled: boolean
}
}
service-status
Envoi du statut des services.
{
type: 'service-status',
payload: {
services: ServiceConfig[]
}
}
Modalités de déploiement
Prérequis
- Node.js 18+
- npm ou yarn
Installation
npm install
Développement
npm run dev
Le site sera accessible sur http://localhost:3007
Build de production
npm run build
Les fichiers de production seront générés dans dist/
Déploiement
Le site doit être déployé sur un serveur web accessible via HTTPS pour être utilisé en iframe. Le port configuré est 3007 (configurable dans vite.config.ts).
Configuration
- Port : Modifiable dans
vite.config.ts(défaut: 3007) - Stockage : LocalStorage (clés:
userwallet_keypair,userwallet_services) - Origine iframe : Le site accepte les messages de n'importe quelle origine (
*). Pour la production, restreindre à l'origine du parent.
Modalités d'analyse
Vérification du fonctionnement
-
Test en standalone
- Ouvrir
http://localhost:3007 - Vérifier la génération automatique d'une paire de clés
- Tester le formulaire de connexion
- Vérifier l'affichage de la clé publique
- Ouvrir
-
Test en iframe
- Intégrer dans une page parent avec
<iframe src="http://localhost:3007"></iframe> - Envoyer un message
auth-requestdepuis le parent - Vérifier la réception du message
auth-response - Tester l'activation/désactivation de services
- Intégrer dans une page parent avec
-
Vérification des messages
- Ouvrir la console du navigateur
- Vérifier l'absence d'erreurs
- Vérifier l'envoi des messages
postMessage
Logs et debugging
- Les erreurs sont loggées dans la console avec
console.error - Les avertissements (ex: pas en iframe) utilisent
console.warn - Utiliser les DevTools pour inspecter les messages
postMessage
Tests de sécurité
- Vérifier que les clés privées ne sont jamais transmises
- Vérifier que les signatures sont valides
- Tester la vérification de signatures avec
verifySignature()
Évolutions futures possibles
- Restriction de l'origine du parent pour la sécurité
- Support de plusieurs identités/utilisateurs
- Export/import de clés
- Chiffrement des clés privées avec mot de passe
- Intégration avec un backend pour la validation
- Support de protocoles d'authentification supplémentaires