COMPAX ET MATRIX
Une différence,
et ce qui en découle
Matrix est le messager fédéré mature, et l’essentiel de ce qui s’écrit en comparant les deux est écrit par des gens qui n’ont utilisé ni l’une ni l’autre base de code. Ce qui suit a été lu dans les deux.
Mesuré le 27 août 2026. Synapse : 246 976 lignes de Python — 71 349 rien que dans le stockage. Continuwuity, une deuxième implémentation du même réseau, 95 220 lignes de Rust. Ce serveur : 17 041 lignes. Les deux côtés bougent, et la moitié de ce qui suit parle d’aujourd’hui plutôt que de la nature des choses ; les parties qui relèvent de la nature des choses sont signalées.
LA DIVERGENCE
Qui fait autorité
sur ce qu’est un salon
- Un salon est un DAG d’événements, chacun portant sa propre chaîne d’autorisation.
- Quand les serveurs divergent, la résolution d’état v2 tranche.
- D’où les groupes d’état, les extrémités avant et arrière, les outliers, le backfill — et 71 349 lignes rien que dans la couche de stockage.
- Un commit est accepté localement même quand le réseau se coupe, et fusionné ensuite.
- Le serveur est un service de distribution. Un seul ordre, tenu par le domicile du salon.
- Comparer l’époque, ajouter sous le même verrou. Il n’y a rien qui puisse diverger.
- Donc pas de DAG, pas de résolution d’état, pas de backfill.
- Et un commit a besoin d’un aller-retour au domicile, et reçoit un
409en cas de course.
Le compromis est honnête dans les deux sens, et MLS ne laisse pas le choix là-dessus : appliquer un commit détruit les secrets de l’époque précédente. Il n’y a rien vers quoi revenir.
UNE AFFIRMATION QU’IL VAUT MIEUX ÉNONCER JUSTE
« Leur serveur lit vos messages »
est faux dans les deux sens
Dans un salon Matrix chiffré, le corps d’un message est du texte chiffré et le serveur ne le lit pas — Megolm, exactement comme MLS ici. Ce qui est vrai est plus étroit et, pour la plupart des gens, pire.
- Le chiffrement est un interrupteur sur le salon. Les salons publics ne l’ont généralement pas, et là tout est lisible.
- L’état du salon n’est jamais chiffré : nom, sujet, avatar, appartenance, invitations, power levels — en clair même dans un salon chiffré.
- Ce n’est pas un oubli. Le serveur applique les règles d’autorisation aux événements, il doit donc pouvoir les lire.
- Qui est dans un salon avec qui, qui a invité qui, et quand — toujours visible pour leur serveur.
- Ici cela vit dans l’arbre MLS. Le serveur voit un
group_idet une époque. - Et une conséquence facile à manquer : la recherche côté serveur dans les salons chiffrés ne marche pas du tout chez eux. Element cherche localement — donc sur la recherche, ceci est en retard sur Element, pas sur Matrix.
OÙ CHACUN MET SON EFFORT
Priorités
- Survivre à une coupure du réseau, parce que le DAG fusionne ensuite.
- Douze versions de salon livrées et migrées sur un réseau en service.
- Une échelle prouvée sur le terrain : stream writers, cartes d’instances, réplication Redis.
- Modération en profondeur — API d’administration, ACL de salon, quarantaine des médias, un processus MSC.
- Implémentations tierces vérifiées en boîte noire par Complement.
- Récupération après avoir perdu tous ses appareils, via la sauvegarde de clés côté serveur.
- À découvert il y a un
group_idet une époque, et c’est tout ce qu’il faut pour ordonner. - L’identité n’est pas délivrée par le serveur : une clé racine signe une attestation d’appareil et chacun la vérifie localement.
- L’ordre coûte une ligne — un compare-and-set, mesuré à 239 ajouts par seconde dans un salon.
- Le push ne porte rien. Le leur porte un
room_id, donc le salon arrive de toute façon chez le fournisseur de push. - Un appel hérite de son salon : la clé média vient du secret de l’époque, donc retirer un membre le retire des médias par effet de bord.
- Les bots sont des feuilles de l’arbre, pas un détour côté serveur — il n’y a aucun endroit où du texte en clair se pose pour un bot.
- Une plainte est démontrable : une preuve de message établit l’auteur. Megolm est une clé de groupe et ne prouve rien.
- L’argent que le groupe détient ensemble, ce qui ne fait pas partie de Matrix du tout.
LES CONSÉQUENCES
Ce que chaque protocole
ne peut pas faire
Ce n’est pas un tableau de scores. Chaque ligne est le prix du choix qui la précède, et les deux colonnes contiennent des choses que leur camp préférerait ne pas avoir.
Matrix
Compax
Le corps des messages dans un salon chiffré
Texte chiffré. Megolm — le serveur ne les lit pas.
Texte chiffré. MLS — pareil.
Si le chiffrement est activé
Un interrupteur par salon, m.room.encryption. Les salons publics ne le sont généralement pas, et là le serveur lit tout.
Pas un interrupteur. Il n’existe pas de salon non chiffré où se trouver.
L’état du salon — nom, sujet, appartenance, invitations, power levels
En clair, toujours, même dans un salon chiffré. Pas un oubli : le serveur applique les règles d’autorisation, il doit donc les lire.
Dans l’arbre MLS. Le serveur voit group_id et l’époque.
Qui est dans un salon avec qui
Visible par le serveur, toujours.
Non visible. C’est cela, et non le texte des messages, la vraie différence.
La recherche côté serveur dans un salon chiffré
Ne marche pas du tout — l’événement chiffré n’a pas de content.body à indexer. Element cherche localement.
Ne marche pas non plus, et pour la même raison. La sortie est celle qu’Element a prise : un index dans le client.
Un commit accepté pendant une coupure du réseau
Oui. L’événement est accepté localement puis fusionné par la résolution d’état.
Impossible. Appliquer un commit détruit les secrets de l’époque précédente — deux commits dans une même époque, ce sont deux états de clés incompatibles.
L’historique après avoir perdu tous ses appareils
Sauvegarde de clés côté serveur sous une clé de récupération — de bout en bout elle aussi.
Perdu. Une enveloppe que la phrase seule pourrait ouvrir serait un accès permanent que personne ne pourrait révoquer ; cela a été refusé exprès.
Les règles du salon appliquées par le serveur
Oui — les power levels, et le serveur rejette un événement qui les enfreint.
Non. La politique tourne dans l’ombre : elle compte les désaccords et ne rejette rien, car un commit valide rejeté ne gâte pas un groupe MLS, il y met fin.
Aperçus de liens, modération par le contenu, push portant du texte
Possible partout où un salon n’est pas chiffré.
Impossible. Ce n’est pas un « pas encore » — c’est ce avec quoi tout le reste a été acheté.
L’argent détenu par le groupe
Ne fait pas partie du protocole.
Cinq chaînes, la clé de chaque signataire sur son propre appareil, le paiement qui arrive comme un message.
ET LÀ OÙ ILS SE REJOIGNENT
Pareil, des deux côtés
Postgres pour ce qui doit durer et Redis pour ce qui doit être rapide. Des seaux à jetons par action. L’historique sur un deuxième appareil — chez eux la sauvegarde de clés, ici des fenêtres scellées et un transfert par QR. Attente croissante entre les tentatives sur un pair mort. Regrouper de nombreux enregistrements en une seule requête. Annonce de version par HTTP. Bloquer un fournisseur. Déduplication à la réception. Pièces jointes hors du journal d’événements. Prometheus et des règles d’alerte. Et aucune recherche côté serveur dans un salon chiffré, ni d’un côté ni de l’autre.
ENSUITE
Les questions
qui viennent en premier
Seize d’entre elles, répondues franchement — y compris les deux où la réponse n’est pas la plus confortable.