COMPAX

COMPAX И MATRIX

Одно различие
и что из него следует

Matrix — зрелый федеративный мессенджер, и большую часть того, что пишут, сравнивая эти два, пишут люди, не работавшие ни с одной из этих баз кода. То, что ниже, прочитано в обеих.

Измерено 27 августа 2026 года. Synapse: 246 976 строк Python — 71 349 в одном только хранилище. Continuwuity, вторая реализация той же сети, 95 220 строк Rust. Этот сервер: 17 041 строка. Обе стороны движутся, и половина того, что ниже, — про сегодня, а не про природу вещей; места, которые про природу вещей, отмечены.

РАЗВИЛКА

Кто решает,
что такое комната

Matrix — сервер
  • Комната — это DAG событий, каждое несёт собственную цепочку авторизации.
  • Когда серверы расходятся, спор улаживает state resolution v2.
  • Отсюда группы состояния, передние и задние края, выбросы, backfill — и 71 349 строк в одном только слое хранения.
  • Commit принимается локально, даже когда сеть распалась, а сливается потом.
Compax — дерево MLS
  • Сервер — служба доставки. Один порядок, который держит дом комнаты.
  • Сравнить эпоху, дописать под тем же замком. Расходиться нечему.
  • Значит, нет ни DAG, ни state resolution, ни backfill.
  • А commit требует поездки домой и обратно и на гонке получает 409.

Размен честен в обе стороны, и MLS не оставляет тут выбора: применение commit уничтожает секреты предыдущей эпохи. Откатываться некуда.

УТВЕРЖДЕНИЕ, КОТОРОЕ СТОИТ СФОРМУЛИРОВАТЬ ТОЧНО

«Их сервер читает твои сообщения»
неверно в обе стороны

В зашифрованной комнате Matrix тело сообщения — шифротекст, и сервер его не читает: Megolm, ровно так же, как здесь MLS. То, что правда, — уже, и для большинства людей хуже.

Что открыто на самом деле
  • Шифрование — это переключатель на комнате. В публичных комнатах его обычно нет, и там читается всё.
  • Состояние комнаты не шифруется никогда: название, тема, аватар, участие, приглашения, power levels — открытым текстом даже в зашифрованной комнате.
  • Это не недосмотр. Сервер применяет к событиям правила авторизации, значит, обязан уметь их прочитать.
Значит, настоящее различие — это граф
  • Кто с кем в комнате, кто кого пригласил и когда — их серверу видно всегда.
  • Здесь это живёт в дереве MLS. Сервер видит group_id и эпоху.
  • И следствие, которое легко пропустить: серверный поиск в зашифрованных комнатах у них не работает вообще. Element ищет локально — так что в поиске это отстаёт от Element, а не от Matrix.

КУДА КАЖДЫЙ КЛАДЁТ УСИЛИЯ

Куда идут усилия

Matrix — охват и эксплуатация
  • Пережить распад сети, потому что DAG потом сливается.
  • Двенадцать версий комнаты, выпущенных и смигрированных на живой сети.
  • Масштаб, доказанный в поле: stream writers, карты инстансов, репликация Redis.
  • Модерация вглубь — админский API, ACL комнаты, карантин медиа, процесс MSC.
  • Сторонние реализации проверяются как чёрные ящики через Complement.
  • Восстановление после потери всех устройств — через серверную копию ключей.
Compax — чего сервер не может
  • Наружу выходят 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 и правила тревог. И никакого серверного поиска в зашифрованной комнате — ни с одной стороны.

ДАЛЬШЕ

Вопросы,
которые возникают первыми

Шестнадцать из них, с прямыми ответами — включая те два, где ответ не из приятных.