COMPAX

COMPAX UND MATRIX

Ein Unterschied,
und was daraus folgt

Matrix ist der ausgereifte föderierte Messenger, und das meiste, was die beiden vergleicht, schreiben Leute, die keine der beiden Codebasen benutzt haben. Was folgt, wurde in beiden nachgelesen.

Gemessen am 27. August 2026. Synapse: 246.976 Zeilen Python — 71.349 allein in der Speicherschicht. Continuwuity, eine zweite Implementierung desselben Netzes, 95.220 Zeilen Rust. Dieser Server: 17.041 Zeilen. Beide Seiten bewegen sich, und die Hälfte des Folgenden handelt vom Heute und nicht vom Wesen der Sache; die Stellen, die vom Wesen der Sache handeln, sind markiert.

DIE WEGGABELUNG

Wer entscheidet,
was ein Raum ist

Matrix — der Server
  • Ein Raum ist ein DAG aus Ereignissen, jedes mit seiner eigenen Autorisierungskette.
  • Wenn Server sich uneinig sind, entscheidet die Zustandsauflösung v2.
  • Daher Zustandsgruppen, vordere und hintere Extremitäten, Outliers, Backfill — und 71.349 Zeilen allein in der Speicherschicht.
  • Ein Commit wird lokal angenommen, auch wenn das Netz auseinanderfällt, und danach zusammengeführt.
Compax — der MLS-Baum
  • Der Server ist ein Zustelldienst. Eine Reihenfolge, gehalten vom Zuhause des Raums.
  • Epoche vergleichen, unter derselben Sperre anhängen. Da ist nichts, was auseinanderlaufen könnte.
  • Also kein DAG, keine Zustandsauflösung, kein Backfill.
  • Und ein Commit braucht einen Weg nach Hause und zurück, und bekommt bei einem Rennen eine 409.

Der Tausch ist in beide Richtungen ehrlich, und MLS lässt darüber keine Wahl: einen Commit anzuwenden zerstört die Geheimnisse der vorigen Epoche. Es gibt nichts, wohin man zurückrollen könnte.

EINE BEHAUPTUNG, DIE MAN GENAU NEHMEN SOLLTE

„Deren Server liest deine Nachrichten“
ist in beide Richtungen falsch

In einem verschlüsselten Matrix-Raum ist der Rumpf einer Nachricht Geheimtext, und der Server liest ihn nicht — Megolm, genau wie hier MLS. Was stimmt, ist enger und für die meisten schlimmer.

Was tatsächlich offen liegt
  • Verschlüsselung ist ein Schalter am Raum. Öffentliche Räume haben ihn meist nicht, und dort ist alles lesbar.
  • Der Raumzustand ist nie verschlüsselt: Name, Thema, Avatar, Mitgliedschaft, Einladungen, power levels — Klartext auch in einem verschlüsselten Raum.
  • Das ist kein Versehen. Der Server wendet die Autorisierungsregeln auf Ereignisse an, also muss er sie lesen können.
Der wirkliche Unterschied ist also der Graph
  • Wer mit wem in einem Raum ist, wer wen eingeladen hat und wann — für deren Server immer sichtbar.
  • Hier lebt das im MLS-Baum. Der Server sieht eine group_id und eine Epoche.
  • Und eine Folge, die man leicht übersieht: serverseitige Suche in verschlüsselten Räumen funktioniert bei ihnen überhaupt nicht. Element sucht lokal — bei der Suche liegt das hier also hinter Element zurück, nicht hinter Matrix.

WORAUF JEDE SEITE IHRE MÜHE VERWENDET

Schwerpunkt

Matrix — Reichweite und Betrieb
  • Eine Netzteilung überstehen, weil der DAG danach zusammenläuft.
  • Zwölf Raumversionen ausgeliefert und im laufenden Netz migriert.
  • Skalierung im Feld bewiesen: Stream Writers, Instanzkarten, Redis-Replikation.
  • Moderation in der Tiefe — Admin-API, Raum-ACLs, Medien-Quarantäne, ein MSC-Prozess.
  • Fremdimplementierungen als Blackbox geprüft, von Complement.
  • Wiederherstellung nach dem Verlust aller Geräte, über serverseitiges Schlüssel-Backup.
Compax — was der Server nicht kann
  • Offen liegen eine group_id und eine Epoche, und mehr braucht die Reihenfolge nicht.
  • Identität wird nicht vom Server ausgegeben: ein Wurzelschlüssel signiert eine Geräte-Attestierung, und jeder prüft sie lokal.
  • Reihenfolge kostet eine Zeile — ein Compare-and-Set, gemessen mit 239 Anhängen pro Sekunde in einem Raum.
  • Push trägt nichts. Ihres trägt eine room_id, also erreicht der Raum den Push-Anbieter ohnehin.
  • Ein Anruf erbt seinen Raum: der Medienschlüssel kommt aus dem Epochengeheimnis, also nimmt das Entfernen eines Mitglieds es nebenbei auch aus den Medien heraus.
  • Bots sind Blätter im Baum, kein Umweg über den Server — es gibt keine Stelle, an der für einen Bot Klartext liegt.
  • Eine Beschwerde ist beweisbar: ein Nachrichtenbeweis zeigt die Urheberschaft. Megolm ist ein Gruppenschlüssel und beweist nichts.
  • Geld, das die Gruppe gemeinsam hält — was bei Matrix überhaupt nicht vorkommt.

DIE FOLGEN

Was jedes Protokoll
nicht kann

Keine Punktetafel. Jede Zeile ist der Preis der Entscheidung darüber, und in beiden Spalten steht etwas, das die jeweilige Seite lieber nicht hätte.

Matrix

Compax

Nachrichtenrümpfe in einem verschlüsselten Raum

Geheimtext. Megolm — der Server liest sie nicht.

Geheimtext. MLS — dasselbe.

Ob Verschlüsselung an ist

Ein Schalter pro Raum, m.room.encryption. Öffentliche sind es meist nicht, und dort liest der Server alles.

Kein Schalter. Es gibt keinen unverschlüsselten Raum, in dem man sein könnte.

Raumzustand — Name, Thema, Mitgliedschaft, Einladungen, power levels

Klartext, immer, auch in einem verschlüsselten Raum. Kein Versehen: der Server wendet die Autorisierungsregeln an, also muss er sie lesen.

Im MLS-Baum. Der Server sieht group_id und die Epoche.

Wer mit wem in einem Raum ist

Für den Server sichtbar, immer.

Nicht sichtbar. Das, und nicht der Nachrichtentext, ist der wirkliche Unterschied.

Serverseitige Suche in einem verschlüsselten Raum

Funktioniert überhaupt nicht — das verschlüsselte Ereignis hat kein content.body zum Indizieren. Element sucht lokal.

Funktioniert auch nicht, und aus demselben Grund. Der Ausweg ist derselbe, den Element genommen hat: ein Index im Client.

Ein Commit, der während einer Netzteilung angenommen wird

Ja. Das Ereignis wird lokal angenommen und danach von der Zustandsauflösung zusammengeführt.

Unmöglich. Einen Commit anzuwenden zerstört die Geheimnisse der vorigen Epoche — zwei Commits in einer Epoche sind zwei unvereinbare Schlüsselzustände.

Verlauf nach dem Verlust aller Geräte

Serverseitiges Schlüssel-Backup unter einem Wiederherstellungsschlüssel — ebenfalls Ende zu Ende.

Weg. Eine Hülle, die die Phrase allein öffnen könnte, wäre ein dauerhafter Zugang, den niemand widerrufen kann; sie wurde mit Absicht abgelehnt.

Raumregeln, die der Server durchsetzt

Ja — power levels, und der Server weist ein Ereignis zurück, das sie bricht.

Nein. Die Richtlinie läuft im Schatten: sie zählt Abweichungen und weist nichts zurück, denn ein zurückgewiesener gültiger Commit verdirbt eine MLS-Gruppe nicht, er beendet sie.

Linkvorschauen, Moderation nach Inhalt, Push mit Text darin

Möglich, wo immer ein Raum nicht verschlüsselt ist.

Unmöglich. Das ist kein „noch nicht“ — das ist die Währung, mit der alles andere bezahlt wurde.

Geld, das die Gruppe hält

Nicht Teil des Protokolls.

Fünf Chains, der Schlüssel jedes Signierenden auf dem eigenen Gerät, und die Zahlung kommt als Nachricht an.

UND WO SIE SICH TREFFEN

Dasselbe, auf beiden Seiten

Postgres für das, was bleiben muss, und Redis für das, was schnell sein muss. Token-Buckets je Aktion. Verlauf auf einem zweiten Gerät — bei ihnen das Schlüssel-Backup, hier versiegelte Fenster und eine Übergabe per QR. Warteabstände beim erneuten Versuch an einem toten Peer. Viele Datensätze in einer Anfrage bündeln. Versionsankündigung über HTTP. Einen Anbieter blockieren. Entdoppelung beim Empfang. Anhänge außerhalb des Ereignisprotokolls. Prometheus und Alarmregeln. Und keine serverseitige Suche in einem verschlüsselten Raum, auf keiner der beiden Seiten.

WEITER

Die Fragen,
die zuerst kommen

Sechzehn davon, klar beantwortet — auch die zwei, bei denen die Antwort nicht die bequeme ist.