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
- 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.
- 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.
- 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ć.
- 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_idi 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
- 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.
- Na wierzchu jest
group_idi 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.