COMPAX

COMPAX E MATRIX

Una differenza,
e quello che ne segue

Matrix è il messaggero federato maturo, e quasi tutto quello che si scrive confrontando i due lo scrive gente che non ha usato né l’una né l’altra base di codice. Quello che segue è stato letto in entrambe.

Misurato il 27 agosto 2026. Synapse: 246.976 righe di Python — 71.349 solo nello storage. Continuwuity, una seconda implementazione della stessa rete, 95.220 righe di Rust. Questo server: 17.041 righe. Entrambe le parti si muovono, e metà di quello che c’è sotto riguarda l’oggi e non la natura delle cose; i punti che riguardano la natura delle cose sono segnalati.

LA DIVERGENZA

Chi ha l’autorità
su che cosa sia una stanza

Matrix — il server
  • Una stanza è un DAG di eventi, ognuno con la propria catena di autorizzazione.
  • Quando i server non sono d’accordo, decide la risoluzione di stato v2.
  • Da qui i gruppi di stato, le estremità in avanti e all’indietro, gli outlier, il backfill — e 71.349 righe nel solo strato di storage.
  • Un commit viene accettato in locale anche quando la rete si spezza, e unito dopo.
Compax — l’albero MLS
  • Il server è un servizio di consegna. Un solo ordine, tenuto dalla casa della stanza.
  • Confronta l’epoca, accoda sotto lo stesso lock. Non c’è niente che possa divergere.
  • Quindi niente DAG, niente risoluzione di stato, niente backfill.
  • E un commit ha bisogno di un viaggio di andata e ritorno a casa, e in caso di corsa riceve un 409.

Lo scambio è onesto in entrambe le direzioni, e MLS non lascia scelta al riguardo: applicare un commit distrugge i segreti dell’epoca precedente. Non c’è niente a cui tornare.

UN’AFFERMAZIONE CHE VALE LA PENA DIRE BENE

«Il loro server legge i tuoi messaggi»
è sbagliato in entrambe le direzioni

In una stanza Matrix cifrata il corpo di un messaggio è testo cifrato e il server non lo legge — Megolm, esattamente come qui è MLS. Quello che è vero è più stretto e, per la maggior parte delle persone, peggiore.

Che cosa è davvero scoperto
  • La cifratura è un interruttore sulla stanza. Le stanze pubbliche di solito non ce l’hanno, e lì tutto è leggibile.
  • Lo stato della stanza non è mai cifrato: nome, argomento, avatar, appartenenza, inviti, power levels — in chiaro anche in una stanza cifrata.
  • Non è una svista. Il server applica le regole di autorizzazione agli eventi, quindi deve poterli leggere.
Quindi la differenza vera è il grafo
  • Chi sta in una stanza con chi, chi ha invitato chi e quando — sempre visibile al loro server.
  • Qui questo vive nell’albero MLS. Il server vede un group_id e un’epoca.
  • E una conseguenza facile da mancare: da loro la ricerca lato server nelle stanze cifrate non funziona affatto. Element cerca in locale — quindi sulla ricerca questo è indietro rispetto a Element, non rispetto a Matrix.

DOVE OGNUNO METTE IL PROPRIO SFORZO

Dove va lo sforzo

Matrix — portata e gestione
  • Sopravvivere a una rete che si spezza, perché il DAG poi si riunisce.
  • Dodici versioni di stanza rilasciate e migrate su una rete in esercizio.
  • Scala dimostrata sul campo: stream writer, mappe di istanze, replica Redis.
  • Moderazione in profondità — API di amministrazione, ACL di stanza, quarantena dei media, un processo MSC.
  • Implementazioni di terzi verificate a scatola chiusa da Complement.
  • Recupero dopo aver perso tutti i dispositivi, tramite backup delle chiavi lato server.
Compax — quello che il server non può fare
  • Allo scoperto ci sono un group_id e un’epoca, ed è tutto ciò che serve per ordinare.
  • L’identità non la rilascia il server: una chiave radice firma un’attestazione del dispositivo e ognuno la verifica in locale.
  • L’ordine costa una riga — un compare-and-set, misurato a 239 accodamenti al secondo in una stanza.
  • Il push non porta niente. Il loro porta un room_id, così la stanza arriva comunque al fornitore di push.
  • Una chiamata eredita la sua stanza: la chiave dei media viene dal segreto dell’epoca, quindi togliere un membro lo toglie dai media come effetto collaterale.
  • I bot sono foglie dell’albero, non una deviazione lato server — non c’è nessun posto in cui il testo in chiaro si posi per un bot.
  • Una lamentela è dimostrabile: una prova di messaggio mostra chi l’ha scritto. Megolm è una chiave di gruppo e non prova niente.
  • I soldi che il gruppo tiene insieme, che in Matrix non esistono affatto.

LE CONSEGUENZE

Quello che ciascun protocollo
non può fare

Non è un tabellone. Ogni riga è il prezzo della scelta che sta sopra di essa, ed entrambe le colonne contengono cose che la rispettiva parte preferirebbe non avere.

Matrix

Compax

Corpi dei messaggi in una stanza cifrata

Testo cifrato. Megolm — il server non li legge.

Testo cifrato. MLS — lo stesso.

Se la cifratura è accesa

Un interruttore per stanza, m.room.encryption. Quelle pubbliche di solito non lo sono, e lì il server legge tutto.

Non è un interruttore. Non esiste una stanza non cifrata in cui stare.

Stato della stanza — nome, argomento, appartenenza, inviti, power levels

In chiaro, sempre, anche in una stanza cifrata. Non è una svista: il server applica le regole di autorizzazione, quindi deve leggerle.

Nell’albero MLS. Il server vede group_id e l’epoca.

Chi sta in una stanza con chi

Visibile al server, sempre.

Non visibile. È questo, e non il testo dei messaggi, la differenza vera.

Ricerca lato server in una stanza cifrata

Non funziona affatto — l’evento cifrato non ha un content.body da indicizzare. Element cerca in locale.

Non funziona nemmeno qui, e per la stessa ragione. La via d’uscita è la stessa che ha preso Element: un indice nel client.

Un commit accettato durante una rete spezzata

Sì. L’evento viene accettato in locale e poi unito dalla risoluzione di stato.

Impossibile. Applicare un commit distrugge i segreti dell’epoca precedente — due commit in un’epoca sono due stati di chiavi incompatibili.

Cronologia dopo aver perso tutti i dispositivi

Backup delle chiavi lato server sotto una chiave di recupero — anch’esso da estremo a estremo.

Persa. Un involucro che la sola frase potesse aprire sarebbe un accesso permanente che nessuno potrebbe revocare; è stato rifiutato apposta.

Regole della stanza fatte rispettare dal server

Sì — i power levels, e il server rifiuta un evento che li viola.

No. La politica gira in ombra: conta i disaccordi e non rifiuta niente, perché un commit valido rifiutato non guasta un gruppo MLS, lo chiude.

Anteprime dei link, moderazione sul contenuto, push che porta testo

Possibile ovunque una stanza non sia cifrata.

Impossibile. Questo non è un «non ancora» — è la moneta con cui è stato comprato tutto il resto.

Soldi tenuti dal gruppo

Non fa parte del protocollo.

Cinque catene, la chiave di ogni firmatario sul proprio dispositivo, il pagamento che arriva come un messaggio.

E DOVE SI INCONTRANO

Uguale, da entrambe le parti

Postgres per ciò che deve durare e Redis per ciò che deve essere veloce. Secchi di gettoni per azione. Cronologia su un secondo dispositivo — da loro il backup delle chiavi, qui finestre sigillate e un trasferimento via QR. Attesa crescente fra i tentativi su un peer morto. Raggruppare molti record in una sola richiesta. Annuncio di versione via HTTP. Bloccare un fornitore. Deduplicazione alla ricezione. Allegati fuori dal registro degli eventi. Prometheus e regole di allarme. E nessuna ricerca lato server in una stanza cifrata, da nessuna delle due parti.

POI

Le domande
che vengono per prime

Sedici, con risposte dirette — comprese le due in cui la risposta non è quella comoda.