Architecture

Velum compte six couches. Chacune en sait juste assez pour faire son travail, et rien de plus.

Les couches

Couche Voit Ne voit pas
App Tes messages en clair, tes contacts, ta phrase de récupération Rien des autres utilisateurs
Enveloppe Un message chiffré pour un appareil précis Ne quitte pas le téléphone sans être découpée
Fragments Des morceaux de même taille, avec l’empreinte de leur reçu Contenu, expéditeur, taille réelle
Nœuds Des fragments opaques, les boîtes du jour, des reçus Qui envoie, qui reçoit, ce qui est dit
Passerelle Les connexions et les trames JSON qu’elle relaie Le contenu ; les identités ne circulent jamais en clair
Chaîne Paiements, tokens, ordres, reçus, récompenses Les messages et qui parle à qui

App

L’app génère la phrase de récupération, dérive les clés (identité, portefeuille, boîte aux lettres) et crée une clé d’appareil qui ne quitte jamais le téléphone. Elle stocke les conversations dans une base SQLite chiffrée avec SQLCipher ; la clé vit dans le trousseau avec WHEN_UNLOCKED_THIS_DEVICE_ONLY, elle ne part donc pas dans les sauvegardes iCloud.

Quand tu envoies un message, l’app :

  1. Signe le contenu avec la clé d’appareil.
  2. Le scelle pour chaque appareil du destinataire et pour tes autres appareils (ainsi l’historique est identique partout).
  3. Complète chaque enveloppe jusqu’à une taille fixe et la découpe en 5 fragments.
  4. Envoie chaque fragment par un nœud différent, vers la boîte du jour du destinataire.

Enveloppe

Une enveloppe est un message chiffré pour un seul appareil. Format :

[1 octet version = 2][32 o clé éphémère X25519][1088 o kemCt ML-KEM-768][24 o nonce][texte chiffré]

À l’extérieur de l’enveloppe, rien n’identifie l’expéditeur (expéditeur scellé). À l’intérieur se trouvent le contenu signé par l’appareil d’origine, l’identité de l’expéditeur et la signature qui relie cet appareil à cette identité. Détails dans Cryptographie.

Fragments

Chaque enveloppe est complétée jusqu’à une taille fixe (2 Ko, 8 Ko, 32 Ko, 128 Ko, 512 Ko, 2 Mo ou 8 Mo) puis découpée avec Reed–Solomon 3 sur 5 : trois morceaux quelconques suffisent à la reconstituer. Chaque morceau porte l’empreinte SHA-512 du secret de son reçu. Détails dans Fragments et reçus.

Nœuds

Un nœud est un programme qui tourne sur un ordinateur de la communauté. Il fait trois choses :

  • Ouvrir des ponts. Un pont est une route que le nœud ouvre et maintient entre expéditeurs et boîtes : il accepte des morceaux (il en est le carrier), les garde et les livre quand le propriétaire ouvre sa boîte (il en est le courier).
  • Produire des blocs. Les nœuds complets se relaient pour assembler des blocs, avec un objectif de 2 secondes par tour ; le rythme réel est mesuré.
  • Découvrir des VEL. À chaque époque, le nœud publie une réclamation agrégée du travail de ses ponts ; après vérification par échantillonnage, il découvre sa part des VEL de l’époque.

Il existe des nœuds complets (ordinateur, ils produisent des blocs) et des nœuds légers (l’app sur téléphone, ils ne font que livrer des fragments). Pour chaque morceau, un tirage public désigne 3 candidats et l’app utilise le plus proche. Voir Monter un nœud.

Passerelle

La passerelle publique (wss://velum.consultorabim.com/hub) est le point de rendez-vous : les nœuds s’y présentent en signant un message d’accueil, les apps y envoient des requêtes RPC et l’explorateur y reçoit les blocs en direct. La passerelle ne fait que relayer des trames ; elle ne possède aucune clé qui lui permettrait de lire quoi que ce soit.

Pour résister aux blocages, il existe plusieurs passerelles sur des domaines différents avec ECH, les nœuds se connectent directement entre eux (ws://host:7420/ws) et chaque nœud annonce son adresse dans la chaîne (endpoint). Voir Résistance à la censure.

App ──ws──▶ Passerelle /hub?role=client ──▶ Nœud choisi (RPC)      ou direct : ws://noeud:7420/ws?role=client
Nœud ──ws──▶ Passerelle /hub?role=node  ◀─▶ autres nœuds           et direct entre nœuds : ?role=node
Web ──ws──▶ Passerelle /hub?role=watch  ◀── blocs et statistiques en direct

Chaîne

Une blockchain propre, sans dépendance externe. Elle conserve :

  • Les soldes en VEL et en tokens, et le nonce de chaque portefeuille.
  • Les inscriptions de nœuds, leur niveau et leurs crédits de livraison.
  • Les réclamations de travail (racines de Merkle), les vérifications par échantillonnage et les récompenses.
  • Le prix de l’oracle à chaque époque et le solde de la Réserve du Réseau.
  • Les pseudos publics (name.register).
  • Les tokens, les cagnottes de tokens pour les nœuds, les ordres et les transactions du marché.
  • Les appareils attestés (uniquement le hash de leur clé, sans identité).

Elle ne conserve jamais les messages, les contacts, les listes d’appareils ni les identités de messagerie. Voir Consensus et blocs.

Ce qui est séparé, et pourquoi

Séparation Objectif
Clé d’identité ≠ clé de portefeuille Que personne ne puisse relier tes conversations à tes paiements.
Clé d’appareil propre à chaque appareil Retirer un appareil sans recréer le compte.
Boîte différente chaque jour et par appareil Que les nœuds ne puissent suivre personne dans le temps.
Reçu sans signature ni adresse Que découvrir des VEL ne trahisse pas le destinataire.