218 lines
6.3 KiB
Markdown
218 lines
6.3 KiB
Markdown
# Nostr Paywall - Site d'articles avec aperçus gratuits et contenu payant
|
|
|
|
**Auteur** : Équipe 4NK
|
|
|
|
## Objectif
|
|
|
|
Implémenter un site d'articles sur Nostr permettant :
|
|
- L'affichage d'aperçus gratuits (notes publiques)
|
|
- Le déblocage du contenu complet après un zap Lightning de 800 sats
|
|
- La connexion via NostrConnect (préconisé use.nsec.app)
|
|
- Une interface moderne et intuitive en TypeScript/Next.js
|
|
|
|
## Impacts
|
|
|
|
### Utilisateurs
|
|
- Accès gratuit aux aperçus d'articles
|
|
- Possibilité de débloquer le contenu complet via paiement Lightning instantané
|
|
- Connexion sécurisée via NostrConnect sans partager de clés privées
|
|
- Expérience utilisateur fluide avec gestion des paiements intégrée
|
|
|
|
### Développeurs
|
|
- Architecture modulaire avec séparation des responsabilités
|
|
- Utilisation de `nostr-tools` pour toutes les opérations Nostr
|
|
- TypeScript pour la sécurité de type
|
|
- Hooks React personnalisés pour la gestion de l'état
|
|
- Service de connexion NostrConnect réutilisable
|
|
|
|
### Technique
|
|
- Dépendance principale : `nostr-tools` (bibliothèque standard Nostr)
|
|
- Framework : Next.js 14 avec React 18
|
|
- Styling : Tailwind CSS
|
|
- Relay par défaut : wss://relay.damus.io
|
|
- Bridge NostrConnect : https://use.nsec.app
|
|
|
|
## Modifications
|
|
|
|
### Structure du projet
|
|
|
|
```
|
|
nostr_paywall/
|
|
├── pages/
|
|
│ ├── index.tsx # Page principale avec liste des articles
|
|
│ └── _app.tsx # Configuration Next.js
|
|
├── components/
|
|
│ ├── ConnectButton.tsx # Bouton de connexion NostrConnect
|
|
│ └── ArticleCard.tsx # Carte d'article avec aperçu et déblocage
|
|
├── hooks/
|
|
│ ├── useNostrConnect.ts # Hook pour la connexion NostrConnect
|
|
│ └── useArticles.ts # Hook pour la gestion des articles
|
|
├── lib/
|
|
│ ├── nostr.ts # Service Nostr (publications, abonnements, zaps)
|
|
│ └── nostrconnect.ts # Service NostrConnect (NIP-46)
|
|
├── types/
|
|
│ └── nostr.ts # Types TypeScript pour Nostr
|
|
└── styles/
|
|
└── globals.css # Styles globaux avec Tailwind
|
|
```
|
|
|
|
### Composants clés
|
|
|
|
#### `lib/nostr.ts` - Service Nostr
|
|
- `SimplePool` pour la gestion des connexions aux relais
|
|
- Méthodes pour publier et s'abonner aux événements
|
|
- Parsing des articles depuis les événements kind:1
|
|
- Gestion des messages privés chiffrés (kind:4) avec NIP-04
|
|
- Création de zap requests (kind:9734)
|
|
- Vérification des zap receipts (kind:9735)
|
|
|
|
#### `lib/nostrconnect.ts` - Service NostrConnect
|
|
- Implémentation du protocole NIP-46 via use.nsec.app
|
|
- Communication via messages postMessage avec popup
|
|
- Persistance de l'état de connexion dans localStorage
|
|
- Gestion du profil utilisateur
|
|
|
|
#### `components/ArticleCard.tsx`
|
|
- Affichage de l'aperçu (contenu public)
|
|
- Bouton de déblocage conditionnel (nécessite connexion)
|
|
- Création de zap request lors du clic
|
|
- Vérification du paiement et chargement du contenu privé
|
|
- Affichage du contenu complet une fois débloqué
|
|
|
|
### Format des articles
|
|
|
|
Les articles sont publiés sous forme d'événements Nostr avec :
|
|
|
|
**Note publique (kind:1)** - Aperçu :
|
|
- Tags : `title`, `preview`, `zap` (montant en sats)
|
|
- Contenu : Aperçu de l'article
|
|
|
|
**Message privé (kind:4)** - Contenu complet :
|
|
- Tag `e` : ID de l'article lié
|
|
- Contenu : Contenu complet chiffré avec NIP-04
|
|
- Envoyé après réception du zap
|
|
|
|
### Flux de paiement
|
|
|
|
1. Utilisateur clique sur "Unlock for 800 sats"
|
|
2. Création d'un zap request (kind:9734) avec tags `p`, `e`, `amount`
|
|
3. Le zap request est publié sur le relay
|
|
4. L'utilisateur complète le paiement via son wallet Lightning
|
|
5. Vérification du zap receipt (kind:9735) sur le relay
|
|
6. Déchiffrement et affichage du contenu privé
|
|
|
|
## Modalités de déploiement
|
|
|
|
### Prérequis
|
|
- Node.js 18+ et npm
|
|
- Accès à un relay Nostr public ou privé
|
|
- Configuration de variables d'environnement optionnelles
|
|
|
|
### Variables d'environnement
|
|
|
|
Créer un fichier `.env.local` :
|
|
|
|
```env
|
|
NEXT_PUBLIC_NOSTR_RELAY_URL=wss://relay.damus.io
|
|
NEXT_PUBLIC_NOSTRCONNECT_BRIDGE=https://use.nsec.app
|
|
```
|
|
|
|
### Installation
|
|
|
|
```bash
|
|
npm install
|
|
```
|
|
|
|
### Développement
|
|
|
|
```bash
|
|
npm run dev
|
|
```
|
|
|
|
Le site sera accessible sur http://localhost:3000
|
|
|
|
### Build de production
|
|
|
|
```bash
|
|
npm run build
|
|
npm start
|
|
```
|
|
|
|
### Déploiement
|
|
|
|
Le projet peut être déployé sur :
|
|
- Vercel (recommandé pour Next.js)
|
|
- Netlify
|
|
- Tout hébergeur supportant Node.js
|
|
|
|
**Important** : Pour la production, configurer :
|
|
- Variables d'environnement dans le panneau d'administration
|
|
- HTTPS (obligatoire pour NostrConnect)
|
|
- Relay Nostr fiable et performant
|
|
|
|
## Modalités d'analyse
|
|
|
|
### Logs et debugging
|
|
|
|
Les erreurs sont loggées dans la console du navigateur :
|
|
- Erreurs de connexion aux relais
|
|
- Erreurs de déchiffrement
|
|
- Erreurs de parsing d'articles
|
|
|
|
### Métriques à surveiller
|
|
|
|
1. **Connectivité**
|
|
- Taux de connexion réussie via NostrConnect
|
|
- Temps de réponse des relais
|
|
|
|
2. **Articles**
|
|
- Nombre d'articles chargés
|
|
- Temps de chargement des aperçus
|
|
- Taux de conversion (aperçu → déblocage)
|
|
|
|
3. **Paiements**
|
|
- Nombre de zap requests créés
|
|
- Taux de confirmation des zaps
|
|
- Temps moyen entre zap request et receipt
|
|
|
|
4. **Utilisateurs**
|
|
- Nombre d'utilisateurs connectés
|
|
- Profils chargés avec succès
|
|
|
|
### Points d'amélioration
|
|
|
|
1. **Gestion des zaps**
|
|
- Implémentation complète du flux Lightning avec intégration wallet
|
|
- Webhooks pour les confirmations de zap
|
|
- Interface de paiement intégrée (LNURL, Lightning Address)
|
|
|
|
2. **Sécurité**
|
|
- Vérification des signatures des zap receipts
|
|
- Validation stricte des événements reçus
|
|
- Gestion des erreurs de déchiffrement
|
|
|
|
3. **Performance**
|
|
- Mise en cache des articles chargés
|
|
- Pagination pour les grandes listes
|
|
- Indexation des articles par tags
|
|
|
|
4. **UX**
|
|
- Feedback visuel pendant le traitement des zaps
|
|
- Gestion des états de chargement
|
|
- Messages d'erreur plus explicites
|
|
|
|
### Tests recommandés
|
|
|
|
1. **Tests unitaires**
|
|
- Parsing d'événements en articles
|
|
- Déchiffrement de messages privés
|
|
- Création de zap requests
|
|
|
|
2. **Tests d'intégration**
|
|
- Flux complet de connexion NostrConnect
|
|
- Flux complet de déblocage d'article
|
|
- Gestion des erreurs réseau
|
|
|
|
3. **Tests end-to-end**
|
|
- Scénario utilisateur complet (connexion → aperçu → paiement → contenu)
|