# 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