COMPAX Y MATRIX
Una diferencia,
y lo que se sigue
Matrix es el mensajero federado maduro, y casi todo lo que se escribe comparando los dos lo escribe gente que no ha usado ninguna de las dos bases de código. Lo que sigue se leyó de las dos.
Medido el 27 de agosto de 2026. Synapse, 246 976 líneas de Python — 71 349 solo en el almacenamiento. Continuwuity, una segunda implementación de la misma red, 95 220 líneas de Rust. Este servidor, 17 041 líneas. Los dos lados se mueven, y la mitad de lo que hay abajo es sobre hoy y no sobre la naturaleza de las cosas; las partes que sí lo son están marcadas.
LA DIVERGENCIA
Quién es la autoridad
sobre qué es una sala
- Una sala es un DAG de eventos, cada uno con su propia cadena de autorización.
- Cuando los servidores no coinciden, lo resuelve la resolución de estado v2.
- De ahí los grupos de estado, los extremos hacia delante y hacia atrás, los outliers, el backfill — y 71 349 líneas solo en la capa de almacenamiento.
- Un commit se acepta localmente incluso cuando la red se parte, y se fusiona después.
- El servidor es un servicio de entrega. Un solo orden, sostenido por la casa de la sala.
- Comparar la época, añadir bajo el mismo bloqueo. No hay nada que pueda divergir.
- Así que no hay DAG, ni resolución de estado, ni backfill.
- Y un commit necesita un viaje de ida y vuelta a casa, y recibe un
409si hay carrera.
El intercambio es honesto en las dos direcciones, y MLS no deja elección al respecto: aplicar un commit destruye los secretos de la época anterior. No hay nada a lo que volver.
UNA AFIRMACIÓN QUE CONVIENE PRECISAR
«Su servidor lee tus mensajes»
es falso en las dos direcciones
En una sala cifrada de Matrix el cuerpo de un mensaje es texto cifrado y el servidor no lo lee — Megolm, exactamente como aquí es MLS. Lo cierto es algo más estrecho y, para la mayoría, peor.
- El cifrado es un interruptor de la sala. Las salas públicas normalmente no lo tienen, y allí todo es legible.
- El estado de la sala nunca se cifra: nombre, tema, avatar, membresía, invitaciones, power levels — texto plano incluso en una sala cifrada.
- No es un descuido. El servidor aplica las reglas de autorización a los eventos, así que tiene que poder leerlos.
- Quién está en una sala con quién, quién invitó a quién y cuándo — siempre visible para su servidor.
- Aquí eso vive en el árbol MLS. El servidor ve un
group_idy una época. - Y una consecuencia fácil de pasar por alto: la búsqueda en el servidor dentro de salas cifradas no les funciona en absoluto. Element busca localmente — así que en búsqueda esto va por detrás de Element, no por detrás de Matrix.
DÓNDE PONE CADA UNO SU ESFUERZO
Enfoque
- Sobrevivir a una partición de la red, porque el DAG se fusiona después.
- Doce versiones de sala publicadas y migradas en una red en marcha.
- Escala probada sobre el terreno: stream writers, mapas de instancias, replicación de Redis.
- Moderación en profundidad — API de administración, ACLs de sala, cuarentena de medios, un proceso MSC.
- Implementaciones de terceros comprobadas como cajas negras por Complement.
- Recuperación tras perder todos los dispositivos, mediante copia de claves en el servidor.
- A la vista hay un
group_idy una época, y eso es lo que hace falta para ordenar. - La identidad no la emite el servidor: una clave raíz firma una atestación de dispositivo y todo el mundo la comprueba localmente.
- Ordenar cuesta una fila — un compare-and-set, medido en 239 añadidos por segundo en una sala.
- El push no lleva nada. El suyo lleva un
room_id, así que la sala llega igualmente al proveedor de push. - Una llamada hereda su sala: la clave de medios sale del secreto de la época, así que quitar a un miembro lo quita de los medios como efecto secundario.
- Los bots son hojas del árbol, no un desvío por el servidor — no hay ningún sitio donde el texto plano se pose para un bot.
- Una queja es demostrable: una prueba de mensaje muestra la autoría. Megolm es una clave de grupo y no prueba nada.
- Dinero que el grupo guarda junto, algo que no forma parte de Matrix en absoluto.
LAS CONSECUENCIAS
Lo que cada protocolo
no puede hacer
No es un marcador. Cada línea es el precio de la elección que hay encima, y las dos columnas contienen cosas que su lado preferiría no tener.
Matrix
Compax
Cuerpos de mensaje en una sala cifrada
Texto cifrado. Megolm — el servidor no los lee.
Texto cifrado. MLS — lo mismo.
Si el cifrado está activado
Un interruptor por sala, m.room.encryption. Las públicas normalmente no lo tienen, y allí el servidor lo lee todo.
No es un interruptor. No hay ninguna sala sin cifrar en la que estar.
Estado de la sala — nombre, tema, membresía, invitaciones, power levels
Texto plano, siempre, incluso en una sala cifrada. No es un descuido: el servidor aplica las reglas de autorización, así que tiene que leerlas.
En el árbol MLS. El servidor ve group_id y la época.
Quién está en una sala con quién
Visible para el servidor, siempre.
No visible. Esto, y no el texto de los mensajes, es la diferencia real.
Búsqueda en el servidor dentro de una sala cifrada
No funciona en absoluto — el evento cifrado no tiene content.body que indexar. Element busca localmente.
Tampoco funciona, y por la misma razón. La salida es la misma que tomó Element: un índice en el cliente.
Un commit aceptado durante una partición de la red
Sí. El evento se acepta localmente y después lo fusiona la resolución de estado.
Imposible. Aplicar un commit destruye los secretos de la época anterior — dos commits en una época son dos estados de clave incompatibles.
Historial tras perder todos los dispositivos
Copia de claves en el servidor bajo una clave de recuperación — también de extremo a extremo.
Se pierde. Una envoltura que la frase por sí sola pudiera abrir sería un acceso permanente que nadie podría revocar; se rechazó a propósito.
Reglas de la sala impuestas por el servidor
Sí — power levels, y el servidor rechaza un evento que las incumpla.
No. La política corre en sombra: cuenta desacuerdos y no rechaza nada, porque un commit válido rechazado no estropea un grupo MLS, lo termina.
Vistas previas de enlaces, moderación por contenido, push que lleva texto
Posible dondequiera que una sala no esté cifrada.
Imposible. Esto no es un «todavía no» — es aquello con lo que se compró todo lo demás.
Dinero que guarda el grupo
No forma parte del protocolo.
Cinco cadenas, la clave de cada firmante en su propio dispositivo, el pago llegando como un mensaje.
Y DONDE COINCIDEN
Lo mismo, en los dos lados
Postgres para lo que debe durar y Redis para lo que debe ser rápido. Cubos de fichas por acción. Historial en un segundo dispositivo — su copia de claves, ventanas selladas y una transferencia por QR aquí. Reintentos con espera creciente ante un par muerto. Agrupar muchos registros en una sola petición. Anuncio de versión por HTTP. Bloquear a un proveedor. Deduplicación en la recepción. Adjuntos fuera del registro de eventos. Prometheus y reglas de alerta. Y nada de búsqueda en el servidor dentro de una sala cifrada, en ninguno de los dos lados.
SIGUIENTE
Las preguntas
que vienen primero
Dieciséis de ellas, respondidas sin rodeos — incluidas las dos donde la respuesta no es la cómoda.