story-research-zapwall/features/priority1-implementation.md
2025-12-22 09:48:57 +01:00

86 lines
2.9 KiB
Markdown

# Implémentation Priorité 1
**Auteur** : Équipe 4NK
## Objectif
Implémenter les fonctionnalités critiques de priorité 1 :
1. Signature distante pour publication d'articles (NIP-46)
2. Génération d'invoice côté auteur lors de la publication
## Modifications
### 1. Génération d'invoice côté auteur
**Fichiers modifiés** :
- `lib/articlePublisher.ts` : Ajout de la création d'invoice lors de la publication
- `lib/payment.ts` : Vérification de l'invoice de l'auteur avant d'en créer une nouvelle
**Fonctionnement** :
- Lors de la publication, l'auteur crée une facture Lightning via Alby/WebLN
- L'invoice est stockée dans les tags de l'événement Nostr (`invoice`, `payment_hash`)
- L'invoice est également stockée dans localStorage (pour récupération rapide)
- Lors du paiement, le système vérifie d'abord si une invoice existe et n'est pas expirée
- Si aucune invoice valide, le lecteur peut en créer une nouvelle
**Avantages** :
- Meilleure traçabilité (invoice créée par l'auteur)
- L'invoice peut être réutilisée par plusieurs lecteurs
- L'invoice est visible dans l'événement Nostr (tags)
### 2. Signature distante améliorée
**Fichiers modifiés** :
- `lib/nostrRemoteSigner.ts` : Amélioration du support de signature
- `lib/articlePublisher.ts` : Support optionnel de la clé privée
- `components/ArticleEditor.tsx` : Utilisation améliorée
**Fonctionnement** :
- Si la clé privée est disponible (via NostrConnect), utilisation de la signature directe
- Si pas de clé privée, message d'erreur explicite
- Préparation pour future implémentation NIP-46 complète
**Note** : L'implémentation complète de NIP-46 nécessiterait une connexion WebSocket permanente avec un relay, ce qui est complexe. Pour l'instant, le système fonctionne avec les clés privées fournies par NostrConnect via postMessage.
## Détails techniques
### Invoice dans les tags Nostr
Les invoices créées par l'auteur sont stockées dans les tags de l'événement :
```
tags: [
['invoice', 'lnbc...'], // Invoice BOLT11
['payment_hash', 'abc123...'], // Payment hash
]
```
### Stockage local
Les invoices sont également stockées dans localStorage avec le contenu privé :
```json
{
"content": "...",
"authorPubkey": "...",
"articleId": "...",
"invoice": {
"invoice": "lnbc...",
"paymentHash": "...",
"amount": 800,
"expiresAt": 1234567890
},
"createdAt": 1234567890
}
```
## Limitations actuelles
1. **Signature distante** : NIP-46 complet non implémenté (nécessite WebSocket relay)
2. **Stockage invoice** : localStorage côté client (pas accessible entre lecteurs)
3. **Récupération invoice** : Actuellement via localStorage, idéalement depuis les tags de l'événement
## Améliorations futures
1. Parser l'invoice directement depuis les tags de l'événement Nostr
2. Implémenter NIP-46 complet pour la signature distante
3. Utiliser une base de données pour le stockage au lieu de localStorage