story-research-zapwall/features/content-delivery-verification.md
Nicolas Cantu 90ff8282f1 feat: Implémentation système de commissions systématique et incontournable
- Création lib/platformCommissions.ts : configuration centralisée des commissions
  - Articles : 800 sats (700 auteur, 100 plateforme)
  - Avis : 70 sats (49 lecteur, 21 plateforme)
  - Sponsoring : 0.046 BTC (0.042 auteur, 0.004 plateforme)

- Validation des montants à chaque étape :
  - Publication : vérification du montant avant publication
  - Paiement : vérification du montant avant acceptation
  - Erreurs explicites si montant incorrect

- Tracking des commissions sur Nostr :
  - Tags author_amount et platform_commission dans événements
  - Interface ContentDeliveryTracking étendue
  - Traçabilité complète pour audit

- Logs structurés avec informations de commission
- Documentation complète du système

Les commissions sont maintenant systématiques, validées et traçables.
2025-12-27 21:11:09 +01:00

143 lines
4.9 KiB
Markdown

# Vérification de l'envoi du contenu privé
**Auteur** : Équipe 4NK
## Objectif
Garantir que le contenu privé est bien envoyé au destinataire après confirmation du paiement.
## Système de vérification multi-niveaux
### 1. Publication sur le relay Nostr
Lors de l'envoi du contenu privé :
- Le message est chiffré avec NIP-04 (chiffrement entre l'auteur et le destinataire)
- L'événement est publié sur le relay Nostr (kind: 4)
- L'ID de l'événement est retourné pour traçabilité
**Vérification** : `publishEvent()` retourne l'événement publié avec son ID unique.
### 2. Vérification sur le relay
Après publication, le système vérifie que le message est bien présent sur le relay :
- Requête au relay avec l'ID du message
- Filtrage par auteur, destinataire et article
- Timeout de 5 secondes pour la vérification
**Vérification** : `verifyPrivateMessagePublished()` confirme la présence du message sur le relay.
### 3. Logs structurés
Tous les événements sont journalisés avec :
- ID du message
- ID de l'article
- Clé publique du destinataire
- Clé publique de l'auteur
- Timestamp ISO
- Statut de vérification
**Traçabilité** : Les logs permettent de suivre chaque envoi et de diagnostiquer les problèmes.
## Garanties d'envoi
### Niveau 1 : Publication réussie
- ✅ L'événement est signé et publié
- ✅ L'ID du message est retourné
- ✅ Le message est visible sur le relay
### Niveau 2 : Vérification sur relay
- ✅ Le message est retrouvé sur le relay avec les bons filtres
- ✅ Les tags correspondent (auteur, destinataire, article)
- ✅ Le message est accessible
### Niveau 3 : Récupération par le destinataire
- ✅ Le destinataire peut récupérer le message avec sa clé privée
- ✅ Le message est déchiffrable
- ✅ Le contenu correspond à l'article
## Points de contrôle
### 1. Avant l'envoi
- Vérification que le contenu privé est stocké
- Vérification que la clé privée de l'auteur est disponible
- Vérification que le paiement est confirmé (zap receipt)
### 2. Pendant l'envoi
- Chiffrement du contenu avec NIP-04
- Création de l'événement avec les bons tags
- Publication sur le relay
### 3. Après l'envoi
- Vérification que l'événement est publié
- Vérification que le message est sur le relay
- Logs de confirmation
## Gestion des erreurs
### Erreurs possibles
1. **Contenu non trouvé** : Le contenu privé n'est pas stocké
- Log : `Stored private content not found for article`
- Action : Vérifier le stockage local
2. **Clé privée indisponible** : La clé de l'auteur n'est pas disponible
- Log : `Author private key not available`
- Action : Vérifier la connexion Nostr
3. **Publication échouée** : L'événement n'a pas pu être publié
- Log : `Failed to publish private message event`
- Action : Vérifier la connexion au relay
4. **Vérification échouée** : Le message n'est pas sur le relay
- Log : `Private message not found on relay`
- Action : Réessayer ou vérifier la connexion
## Traçabilité
### Logs locaux (console navigateur)
Chaque envoi génère des logs avec :
- **messageEventId** : ID unique du message sur Nostr
- **articleId** : ID de l'article concerné
- **recipientPubkey** : Clé publique du destinataire
- **authorPubkey** : Clé publique de l'auteur
- **timestamp** : Date et heure ISO de l'événement
- **verified** : Statut de vérification sur le relay
### Événements de tracking sur Nostr
Pour que la plateforme puisse suivre tous les envois, chaque envoi de contenu génère un événement de tracking publié sur Nostr :
- **Kind** : 30078 (événement de tracking personnalisé)
- **Auteur** : L'auteur de l'article (qui envoie le contenu)
- **Tag `p`** : La clé publique de la plateforme (pour requêter tous les événements)
- **Tags** :
- `article` : ID de l'article
- `author` : Clé publique de l'auteur
- `recipient` : Clé publique du destinataire
- `message` : ID du message privé envoyé
- `amount` : Montant du paiement en sats
- `verified` : Statut de vérification (true/false)
- `timestamp` : Timestamp Unix
- `zap_receipt` : ID du zap receipt (si disponible)
- **Content** : JSON avec toutes les informations de tracking
La plateforme peut interroger tous ces événements en filtrant par `#p` avec sa clé publique pour obtenir une vue complète de tous les envois de contenu.
## Utilisation
### Pour l'auteur
L'auteur peut vérifier que son contenu a bien été envoyé en consultant les logs de la console du navigateur.
### Pour la plateforme
La plateforme peut suivre tous les envois via les logs structurés et identifier les problèmes de livraison.
### Pour le destinataire
Le destinataire peut récupérer le contenu via `getPrivateContent()` qui interroge le relay Nostr.
## Améliorations futures
- Système de notification pour l'auteur en cas d'échec
- Retry automatique en cas d'échec de publication
- Dashboard de suivi des envois pour les auteurs
- Confirmation de réception par le destinataire