COMPAX VÀ MATRIX
Một khác biệt,
và những gì đi ra từ đó
Matrix là trình nhắn tin liên hợp đã trưởng thành, và phần lớn những gì được viết ra để so sánh hai bên đều do những người chưa dùng mã nguồn nào trong hai viết. Những gì dưới đây được đọc từ cả hai.
Đo ngày 27 tháng 8 năm 2026. Synapse: 246.976 dòng Python — riêng tầng lưu trữ đã 71.349. Continuwuity, một cài đặt thứ hai của cùng mạng ấy, 95.220 dòng Rust. Máy chủ này: 17.041 dòng. Cả hai bên đều đang chuyển động, và một nửa những gì bên dưới nói về hôm nay chứ không phải về bản chất của sự việc; những phần thuộc về bản chất đều được đánh dấu.
CHỖ RẼ
Ai có thẩm quyền
về việc một phòng là gì
- Một phòng là một DAG các sự kiện, mỗi sự kiện mang chuỗi ủy quyền của riêng nó.
- Khi các máy chủ bất đồng, state resolution v2 phân xử.
- Từ đó sinh ra các nhóm trạng thái, các đầu mút tiến và lùi, outlier, backfill — và 71.349 dòng chỉ riêng ở tầng lưu trữ.
- Một commit được nhận cục bộ ngay cả khi mạng bị chia cắt, rồi hợp nhất sau.
- Máy chủ là một dịch vụ chuyển phát. Một thứ tự duy nhất, do nhà của phòng giữ.
- So kỷ nguyên, nối thêm dưới cùng một khoá. Chẳng có gì để phân kỳ.
- Nên không có DAG, không có state resolution, không có backfill.
- Và một commit cần một chuyến về nhà rồi quay lại, và nhận
409khi có tranh chấp.
Sự đánh đổi trung thực theo cả hai chiều, và MLS không cho lựa chọn nào khác: áp dụng một commit sẽ huỷ các bí mật của kỷ nguyên trước. Không còn gì để quay lui về.
MỘT KHẲNG ĐỊNH ĐÁNG ĐƯỢC NÓI CHO ĐÚNG
“Máy chủ của họ đọc tin nhắn của bạn”
sai theo cả hai chiều
Trong một phòng Matrix đã mã hoá, phần thân của tin nhắn là bản mã và máy chủ không đọc nó — Megolm, hệt như MLS ở đây. Điều đúng thì hẹp hơn, và với phần lớn mọi người thì tệ hơn.
- Mã hoá là một công tắc trên phòng. Các phòng công khai thường không bật, và ở đó mọi thứ đều đọc được.
- Trạng thái phòng thì không bao giờ được mã hoá: tên, chủ đề, ảnh đại diện, thành viên, lời mời, power levels — dạng rõ ngay cả trong một phòng đã mã hoá.
- Đó không phải sơ suất. Máy chủ áp các quy tắc ủy quyền lên sự kiện, nên nó buộc phải đọc được chúng.
- Ai ở trong một phòng với ai, ai mời ai, và khi nào — máy chủ của họ luôn nhìn thấy.
- Ở đây điều đó sống trong cây MLS. Máy chủ thấy một
group_idvà một kỷ nguyên. - Và một hệ quả dễ bỏ sót: tìm kiếm phía máy chủ trong các phòng đã mã hoá hoàn toàn không chạy được với họ. Element tìm cục bộ — nên về tìm kiếm, cái này đi sau Element chứ không phải đi sau Matrix.
MỖI BÊN DỒN SỨC VÀO ĐÂU
Sức lực đổ về đâu
- Sống sót qua một lần mạng chia cắt, vì sau đó DAG hợp nhất lại.
- Mười hai phiên bản phòng đã phát hành và di trú trên một mạng đang chạy.
- Quy mô đã chứng minh trên thực địa: stream writer, bản đồ instance, sao chép Redis.
- Kiểm duyệt có chiều sâu — API quản trị, ACL phòng, cách ly phương tiện, một quy trình MSC.
- Các cài đặt của bên thứ ba được kiểm như hộp đen bằng Complement.
- Khôi phục sau khi mất hết thiết bị, qua sao lưu khoá phía máy chủ.
- Phơi ra là một
group_idvà một kỷ nguyên, và việc sắp thứ tự chỉ cần chừng ấy. - Danh tính không do máy chủ cấp: một khoá gốc ký một chứng thực thiết bị và ai cũng kiểm tra nó cục bộ.
- Thứ tự tốn một hàng — một compare-and-set, đo được 239 lần nối thêm mỗi giây trong một phòng.
- Push không mang gì cả. Của họ mang một
room_id, nên căn phòng dù sao cũng đến tay nhà cung cấp push. - Một cuộc gọi thừa hưởng căn phòng của nó: khoá phương tiện lấy từ bí mật của kỷ nguyên, nên loại một thành viên ra cũng loại họ khỏi phương tiện như một hệ quả kèm theo.
- Bot là lá trên cây, không phải một đường vòng phía máy chủ — không có chỗ nào mà văn bản rõ nằm lại để chờ một con bot.
- Một khiếu nại là chứng minh được: một bằng chứng tin nhắn cho thấy ai là tác giả. Megolm là khoá nhóm và không chứng minh được gì.
- Tiền mà cả nhóm cùng giữ, thứ hoàn toàn không có trong Matrix.
NHỮNG HỆ QUẢ
Mỗi giao thức
không làm được gì
Đây không phải bảng tỉ số. Mỗi dòng là cái giá của lựa chọn nằm ngay trên nó, và cả hai cột đều chứa những thứ mà bên tương ứng thà không có.
Matrix
Compax
Phần thân tin nhắn trong một phòng đã mã hoá
Bản mã. Megolm — máy chủ không đọc chúng.
Bản mã. MLS — y như vậy.
Mã hoá có đang bật hay không
Một công tắc cho mỗi phòng, m.room.encryption. Phòng công khai thường là không, và ở đó máy chủ đọc mọi thứ.
Không phải một công tắc. Không tồn tại phòng không mã hoá nào để mà ở trong.
Trạng thái phòng — tên, chủ đề, thành viên, lời mời, power levels
Dạng rõ, luôn luôn, ngay cả trong phòng đã mã hoá. Không phải sơ suất: máy chủ áp các quy tắc ủy quyền, nên nó phải đọc chúng.
Trong cây MLS. Máy chủ thấy group_id và kỷ nguyên.
Ai ở trong một phòng với ai
Máy chủ nhìn thấy, luôn luôn.
Không nhìn thấy. Chính điều này, chứ không phải nội dung tin nhắn, mới là khác biệt thật sự.
Tìm kiếm phía máy chủ trong một phòng đã mã hoá
Hoàn toàn không chạy — sự kiện đã mã hoá không có content.body để lập chỉ mục. Element tìm cục bộ.
Cũng không chạy, và vì đúng lý do ấy. Lối ra là lối mà Element đã chọn: một chỉ mục trong máy khách.
Một commit được nhận trong lúc mạng bị chia cắt
Có. Sự kiện được nhận cục bộ rồi sau đó được state resolution hợp nhất.
Không thể. Áp dụng một commit sẽ huỷ các bí mật của kỷ nguyên trước — hai commit trong cùng một kỷ nguyên là hai trạng thái khoá không thể dung hoà.
Lịch sử sau khi mất hết thiết bị
Sao lưu khoá phía máy chủ dưới một khoá khôi phục — cũng đầu cuối tới đầu cuối.
Mất. Một lớp vỏ mà chỉ riêng cụm từ đã mở được sẽ là một quyền truy cập vĩnh viễn không ai thu hồi nổi; nó bị từ chối một cách có chủ đích.
Quy tắc phòng do máy chủ thi hành
Có — power levels, và máy chủ từ chối một sự kiện phá vỡ chúng.
Không. Chính sách chạy trong bóng: nó đếm các bất đồng và không từ chối gì cả, bởi một commit hợp lệ bị từ chối không làm hỏng một nhóm MLS, nó kết liễu nhóm đó.
Xem trước liên kết, kiểm duyệt theo nội dung, push mang theo văn bản
Khả thi ở bất cứ đâu phòng không được mã hoá.
Không thể. Đây không phải “chưa đâu” — đây chính là thứ đã dùng để mua mọi thứ còn lại.
Tiền do nhóm nắm giữ
Không thuộc giao thức.
Năm chuỗi, khoá của mỗi người ký nằm trên thiết bị của chính họ, và khoản thanh toán đến như một tin nhắn.
VÀ CHỖ HAI BÊN GẶP NHAU
Giống nhau, ở cả hai phía
Postgres cho những gì phải còn lại và Redis cho những gì phải nhanh. Xô thẻ theo từng hành động. Lịch sử trên thiết bị thứ hai — bên họ là sao lưu khoá, ở đây là những cửa sổ niêm phong và một lần chuyển qua QR. Chờ tăng dần khi thử lại với một peer đã chết. Gộp nhiều bản ghi vào một yêu cầu. Thông báo phiên bản qua HTTP. Chặn một nhà cung cấp. Loại trùng lúc nhận. Tệp đính kèm nằm ngoài nhật ký sự kiện. Prometheus và các quy tắc cảnh báo. Và không có tìm kiếm phía máy chủ trong phòng đã mã hoá, ở cả hai bên.
TIẾP THEO
Những câu hỏi
đến trước nhất
Mười sáu câu, trả lời thẳng thắn — kể cả hai câu mà câu trả lời không phải là câu dễ chịu.