COMPAX И MATRIX
Одно различие
и что из него следует
Matrix — зрелый федеративный мессенджер, и большую часть того, что пишут, сравнивая эти два, пишут люди, не работавшие ни с одной из этих баз кода. То, что ниже, прочитано в обеих.
Измерено 27 августа 2026 года. Synapse: 246 976 строк Python — 71 349 в одном только хранилище. Continuwuity, вторая реализация той же сети, 95 220 строк Rust. Этот сервер: 17 041 строка. Обе стороны движутся, и половина того, что ниже, — про сегодня, а не про природу вещей; места, которые про природу вещей, отмечены.
РАЗВИЛКА
Кто решает,
что такое комната
- Комната — это DAG событий, каждое несёт собственную цепочку авторизации.
- Когда серверы расходятся, спор улаживает state resolution v2.
- Отсюда группы состояния, передние и задние края, выбросы, backfill — и 71 349 строк в одном только слое хранения.
- Commit принимается локально, даже когда сеть распалась, а сливается потом.
- Сервер — служба доставки. Один порядок, который держит дом комнаты.
- Сравнить эпоху, дописать под тем же замком. Расходиться нечему.
- Значит, нет ни DAG, ни state resolution, ни backfill.
- А commit требует поездки домой и обратно и на гонке получает
409.
Размен честен в обе стороны, и MLS не оставляет тут выбора: применение commit уничтожает секреты предыдущей эпохи. Откатываться некуда.
УТВЕРЖДЕНИЕ, КОТОРОЕ СТОИТ СФОРМУЛИРОВАТЬ ТОЧНО
«Их сервер читает твои сообщения»
неверно в обе стороны
В зашифрованной комнате Matrix тело сообщения — шифротекст, и сервер его не читает: Megolm, ровно так же, как здесь MLS. То, что правда, — уже, и для большинства людей хуже.
- Шифрование — это переключатель на комнате. В публичных комнатах его обычно нет, и там читается всё.
- Состояние комнаты не шифруется никогда: название, тема, аватар, участие, приглашения, power levels — открытым текстом даже в зашифрованной комнате.
- Это не недосмотр. Сервер применяет к событиям правила авторизации, значит, обязан уметь их прочитать.
- Кто с кем в комнате, кто кого пригласил и когда — их серверу видно всегда.
- Здесь это живёт в дереве MLS. Сервер видит
group_idи эпоху. - И следствие, которое легко пропустить: серверный поиск в зашифрованных комнатах у них не работает вообще. Element ищет локально — так что в поиске это отстаёт от Element, а не от Matrix.
КУДА КАЖДЫЙ КЛАДЁТ УСИЛИЯ
Куда идут усилия
- Пережить распад сети, потому что DAG потом сливается.
- Двенадцать версий комнаты, выпущенных и смигрированных на живой сети.
- Масштаб, доказанный в поле: stream writers, карты инстансов, репликация Redis.
- Модерация вглубь — админский API, ACL комнаты, карантин медиа, процесс MSC.
- Сторонние реализации проверяются как чёрные ящики через Complement.
- Восстановление после потери всех устройств — через серверную копию ключей.
- Наружу выходят
group_idи эпоха, и именно этого требует упорядочивание. - Личность выдаёт не сервер: корневой ключ подписывает аттестацию устройства, и каждый проверяет её локально.
- Порядок стоит одной строки — compare-and-set, измерено 239 дописываний в секунду в комнате.
- Push не несёт ничего. Их push несёт
room_id, так что комната всё равно доходит до поставщика пушей. - Звонок наследует свою комнату: ключ медиа берётся из секрета эпохи, поэтому удаление участника побочно убирает его и из медиа.
- Боты — листья дерева, а не крюк через сервер: нет места, где открытый текст лежал бы ради бота.
- Жалобу можно доказать: доказательство сообщения показывает авторство. Megolm — групповой ключ и не доказывает ничего.
- Деньги, которые группа держит вместе, чего в Matrix нет вовсе.
ПОСЛЕДСТВИЯ
Чего каждый протокол
не может
Это не табло. Каждая строка — цена того выбора, что стоит над ней, и в обоих столбцах есть вещи, которых соответствующая сторона предпочла бы не иметь.
Matrix
Compax
Тела сообщений в зашифрованной комнате
Шифротекст. Megolm — сервер их не читает.
Шифротекст. MLS — то же самое.
Включено ли шифрование
Переключатель на комнату, m.room.encryption. В публичных обычно выключен, и там сервер читает всё.
Это не переключатель. Незашифрованной комнаты, в которой можно оказаться, не существует.
Состояние комнаты — название, тема, участие, приглашения, power levels
Открытым текстом, всегда, даже в зашифрованной комнате. Это не недосмотр: сервер применяет правила авторизации, значит, обязан их читать.
В дереве MLS. Сервер видит group_id и эпоху.
Кто с кем в комнате
Серверу видно, всегда.
Не видно. Именно это, а не текст сообщений, и есть настоящее различие.
Серверный поиск в зашифрованной комнате
Не работает вовсе — у зашифрованного события нет content.body, который можно проиндексировать. Element ищет локально.
Тоже не работает, и по той же причине. Выход тот же, что выбрал Element: индекс в клиенте.
Commit, принятый во время распада сети
Да. Событие принимается локально, а потом его сливает state resolution.
Невозможно. Применение commit уничтожает секреты предыдущей эпохи — два commit в одной эпохе это два несовместимых состояния ключей.
История после потери всех устройств
Серверная копия ключей под ключом восстановления — тоже сквозная.
Пропадает. Обёртка, которую открывала бы одна лишь фраза, была бы постоянным доступом, который никто не смог бы отозвать; от неё отказались намеренно.
Правила комнаты, которые соблюдает сервер
Да — power levels, и сервер отклоняет событие, которое их нарушает.
Нет. Политика работает в тени: считает расхождения и не отклоняет ничего, потому что отклонённый действительный commit не портит группу MLS, а заканчивает её.
Превью ссылок, модерация по содержимому, push с текстом
Возможно везде, где комната не зашифрована.
Невозможно. Это не «пока нет» — это то, чем оплачено всё остальное.
Деньги, которые держит группа
Не часть протокола.
Пять сетей, ключ каждого подписанта на его собственном устройстве, и платёж приходит сообщением.
И ГДЕ ОНИ СХОДЯТСЯ
Одинаково с обеих сторон
Postgres для того, что должно остаться, и Redis для того, что должно быть быстрым. Вёдра токенов на действие. История на втором устройстве — у них копия ключей, здесь запечатанные окна и передача по QR. Нарастающее ожидание при повторе к мёртвому узлу. Упаковка многих записей в один запрос. Объявление версии по HTTP. Блокировка поставщика. Отсев дубликатов на приёме. Вложения вне журнала событий. Prometheus и правила тревог. И никакого серверного поиска в зашифрованной комнате — ни с одной стороны.
ДАЛЬШЕ
Вопросы,
которые возникают первыми
Шестнадцать из них, с прямыми ответами — включая те два, где ответ не из приятных.