COMPAX

COMPAX I MATRIX

Jedna różnica
i co z niej wynika

Matrix to dojrzały komunikator federacyjny, a większość tego, co się pisze, porównując oba, piszą ludzie, którzy nie używali żadnej z tych baz kodu. To, co poniżej, zostało odczytane z obu.

Zmierzone 27 sierpnia 2026. Synapse: 246 976 wierszy Pythona — 71 349 w samej warstwie przechowywania. Continuwuity, druga implementacja tej samej sieci, 95 220 wierszy Rusta. Ten serwer: 17 041 wierszy. Obie strony się ruszają, a połowa tego, co niżej, dotyczy dzisiaj, a nie natury rzeczy; miejsca, które dotyczą natury rzeczy, są zaznaczone.

ROZEJŚCIE

Kto rozstrzyga,
czym jest pokój

Matrix — serwer
  • Pokój to DAG zdarzeń, z których każde niesie własny łańcuch autoryzacji.
  • Kiedy serwery się nie zgadzają, rozstrzyga state resolution v2.
  • Stąd grupy stanu, krańce w przód i wstecz, outliery, backfill — i 71 349 wierszy w samej warstwie przechowywania.
  • Commit jest przyjmowany lokalnie nawet wtedy, gdy sieć się rozpada, a scalany później.
Compax — drzewo MLS
  • Serwer jest usługą doręczania. Jeden porządek, trzymany przez dom pokoju.
  • Porównaj epokę, dopisz pod tą samą blokadą. Nie ma czemu się rozejść.
  • Więc nie ma DAG-u, nie ma state resolution, nie ma backfillu.
  • A commit potrzebuje podróży do domu i z powrotem, i przy wyścigu dostaje 409.

Wymiana jest uczciwa w obie strony, a MLS nie zostawia w tej sprawie wyboru: zastosowanie commita niszczy sekrety poprzedniej epoki. Nie ma do czego wrócić.

TWIERDZENIE, KTÓRE WARTO POSTAWIĆ DOKŁADNIE

„Ich serwer czyta twoje wiadomości”
jest nieprawdą w obie strony

W zaszyfrowanym pokoju Matriksa treść wiadomości to szyfrogram i serwer jej nie czyta — Megolm, dokładnie tak jak tutaj MLS. To, co prawdziwe, jest węższe i dla większości ludzi gorsze.

Co naprawdę jest odsłonięte
  • Szyfrowanie to przełącznik pokoju. Pokoje publiczne zwykle go nie mają, a tam wszystko da się przeczytać.
  • Stan pokoju nigdy nie jest szyfrowany: nazwa, temat, awatar, członkostwo, zaproszenia, power levels — jawnie nawet w pokoju zaszyfrowanym.
  • To nie przeoczenie. Serwer stosuje do zdarzeń reguły autoryzacji, więc musi umieć je przeczytać.
Więc prawdziwą różnicą jest graf
  • Kto jest z kim w pokoju, kto kogo zaprosił i kiedy — dla ich serwera zawsze widoczne.
  • Tutaj to żyje w drzewie MLS. Serwer widzi group_id i epokę.
  • I konsekwencja, którą łatwo przeoczyć: wyszukiwanie po stronie serwera w zaszyfrowanych pokojach u nich w ogóle nie działa. Element szuka lokalnie — więc w wyszukiwaniu to jest za Elementem, a nie za Matriksem.

W CO KAŻDY WKŁADA WYSIŁEK

Gdzie idzie wysiłek

Matrix — zasięg i eksploatacja
  • Przetrwanie rozpadu sieci, bo DAG i tak się potem scala.
  • Dwanaście wersji pokoju wydanych i zmigrowanych na działającej sieci.
  • Skala udowodniona w boju: stream writery, mapy instancji, replikacja Redisa.
  • Moderacja w głąb — API administracyjne, ACL-e pokoju, kwarantanna mediów, proces MSC.
  • Implementacje osób trzecich sprawdzane jako czarne skrzynki przez Complement.
  • Odzyskanie po utracie wszystkich urządzeń, przez kopię kluczy po stronie serwera.
Compax — czego serwer nie może
  • Na wierzchu jest group_id i epoka, i tyle właśnie potrzeba do porządkowania.
  • Tożsamości nie wydaje serwer: klucz główny podpisuje poświadczenie urządzenia, a każdy sprawdza je lokalnie.
  • Porządek kosztuje jeden wiersz — compare-and-set, zmierzone na 239 dopisań na sekundę w pokoju.
  • Push nie niesie niczego. Ich niesie room_id, więc pokój i tak trafia do dostawcy pushów.
  • Rozmowa dziedziczy swój pokój: klucz mediów pochodzi z sekretu epoki, więc usunięcie uczestnika usuwa go z mediów przy okazji.
  • Boty są liśćmi drzewa, a nie objazdem przez serwer — nie ma miejsca, w którym jawny tekst leżałby dla bota.
  • Skargę da się udowodnić: dowód wiadomości pokazuje autorstwo. Megolm to klucz grupowy i nie dowodzi niczego.
  • Pieniądze, które grupa trzyma wspólnie, czego w Matriksie nie ma w ogóle.

KONSEKWENCJE

Czego każdy protokół
nie potrafi

To nie tabela wyników. Każdy wiersz jest ceną wyboru stojącego nad nim, a w obu kolumnach są rzeczy, których dana strona wolałaby nie mieć.

Matrix

Compax

Treść wiadomości w zaszyfrowanym pokoju

Szyfrogram. Megolm — serwer jej nie czyta.

Szyfrogram. MLS — tak samo.

Czy szyfrowanie jest włączone

Przełącznik na pokój, m.room.encryption. Publiczne zwykle go nie mają, a tam serwer czyta wszystko.

To nie przełącznik. Nie ma niezaszyfrowanego pokoju, w którym można by być.

Stan pokoju — nazwa, temat, członkostwo, zaproszenia, power levels

Jawnie, zawsze, nawet w pokoju zaszyfrowanym. To nie przeoczenie: serwer stosuje reguły autoryzacji, więc musi je czytać.

W drzewie MLS. Serwer widzi group_id i epokę.

Kto jest z kim w pokoju

Widoczne dla serwera, zawsze.

Niewidoczne. To, a nie treść wiadomości, jest prawdziwą różnicą.

Wyszukiwanie po stronie serwera w zaszyfrowanym pokoju

Nie działa w ogóle — zaszyfrowane zdarzenie nie ma content.body do zindeksowania. Element szuka lokalnie.

Też nie działa, i z tego samego powodu. Wyjście jest to samo, które wybrał Element: indeks w kliencie.

Commit przyjęty podczas rozpadu sieci

Tak. Zdarzenie jest przyjmowane lokalnie, a potem scalane przez state resolution.

Niemożliwe. Zastosowanie commita niszczy sekrety poprzedniej epoki — dwa commity w jednej epoce to dwa niezgodne stany kluczy.

Historia po utracie wszystkich urządzeń

Kopia kluczy po stronie serwera pod kluczem odzyskiwania — też od końca do końca.

Przepada. Opakowanie, które sama fraza mogłaby otworzyć, byłoby stałym dostępem, którego nikt nie mógłby cofnąć; odmówiono tego celowo.

Reguły pokoju egzekwowane przez serwer

Tak — power levels, a serwer odrzuca zdarzenie, które je łamie.

Nie. Polityka chodzi w cieniu: liczy niezgodności i nie odrzuca niczego, bo odrzucony poprawny commit nie psuje grupy MLS, tylko ją kończy.

Podglądy linków, moderacja po treści, push niosący tekst

Możliwe wszędzie tam, gdzie pokój nie jest zaszyfrowany.

Niemożliwe. To nie jest „jeszcze nie” — to jest to, czym zapłacono za całą resztę.

Pieniądze trzymane przez grupę

Nie należy do protokołu.

Pięć łańcuchów, klucz każdego podpisującego na jego własnym urządzeniu, płatność przychodząca jako wiadomość.

I GDZIE SIĘ SPOTYKAJĄ

To samo po obu stronach

Postgres do tego, co ma przetrwać, i Redis do tego, co ma być szybkie. Kubełki żetonów na akcję. Historia na drugim urządzeniu — u nich kopia kluczy, tutaj zapieczętowane okna i przekazanie przez QR. Rosnące odczekiwanie przy ponawianiu do martwego peera. Pakowanie wielu rekordów w jedno żądanie. Ogłaszanie wersji po HTTP. Blokowanie dostawcy. Odsiewanie duplikatów przy odbiorze. Załączniki poza dziennikiem zdarzeń. Prometheus i reguły alertów. I żadnego wyszukiwania po stronie serwera w zaszyfrowanym pokoju — po żadnej ze stron.

DALEJ

Pytania,
które padają najpierw

Szesnaście, z odpowiedziami wprost — łącznie z tymi dwoma, gdzie odpowiedź nie jest wygodna.