Спецификация матрицы

Matrix определяет набор открытых API для децентрализованной связи, подходящих для безопасной публикации, сохранения и подписки на данные через глобальную открытую федерацию серверов без единой точки управления. Области применения включают мгновенные сообщения (IM), передачу голоса по IP (VoIP), связь в Интернете вещей (IoT) и объединение существующих коммуникационных платформ, создавая основу для новой открытой экосистемы связи в реальном времени.

Чтобы предложить изменения в спецификации Matrix, см. пояснения в разделе «Предложения по изменению спецификации Matrix» .

API матрицы

Техническое задание состоит из следующих частей:

Кроме того, на этой вводной странице содержится основная информация, необходимая для понимания конкретных API, включая раздел, описывающий общую архитектуру .

Matrix API Viewer полезен для просмотра клиент-серверного API.

Введение в API-интерфейсы Matrix

Matrix — это набор открытых API для открытой федеративной связи в сфере мгновенных сообщений (IM), IP-телефонии (VoIP) и Интернета вещей (IoT), разработанный для создания и поддержки новой глобальной экосистемы связи в реальном времени. Цель состоит в том, чтобы предоставить открытый децентрализованный уровень публикации/подписки для интернета для безопасного сохранения и публикации/подписки на объекты JSON. Данная спецификация является результатом стандартизации API, используемых различными компонентами экосистемы Matrix для взаимодействия друг с другом.

Принципы, которым стремится следовать  Matrix, следующие:

  • Прагматичные, удобные для веб-использования API (например, JSON поверх REST).
  • [Не усложняй и не глупи]
    • Предоставить простую архитектуру с минимальным количеством зависимостей от сторонних разработчиков.
    • Полностью открытая федерация — любой желающий должен иметь возможность участвовать в глобальной сети Matrix.
    • Полностью открытый стандарт — стандарт с общедоступной документацией, не накладывающий никаких обязательств по лицензированию интеллектуальной собственности или патентов.
  • Расширение прав и возможностей конечного пользователя
    • Пользователь должен иметь возможность выбирать сервер и клиенты, которые он использует.
    • Пользователь должен иметь возможность контролировать уровень конфиденциальности своей переписки.
    • Пользователь должен точно знать, где хранятся его данные.
  • Полностью децентрализованная система — нет единых точек контроля над разговорами или сетью в целом.
  • Учимся на ошибках истории, чтобы избежать ее повторения.
    • Стремление взять лучшие аспекты XMPP, SIP, IRC, SMTP, IMAP и NNTP, избегая при этом их недостатков.

Функциональные возможности, предоставляемые Matrix, включают в себя:

  • Создание и управление полностью распределенными чатами без единых точек контроля или сбоев.
  • Криптографически защищенная синхронизация состояния помещения с обеспечением полной согласованности данных в глобальной открытой сети объединенных серверов и сервисов.
  • Отправка и получение расширяемых сообщений в помещении с (опциональным) сквозным шифрованием.
  • Расширенное управление пользователями (приглашение, присоединение, выход, исключение, блокировка) осуществляется с помощью системы привилегий пользователей, основанной на уровнях власти.
  • Расширяемое управление состоянием комнаты (название комнаты, псевдонимы, темы, блокировки).
  • Расширенные возможности управления профилями пользователей (аватары, отображаемые имена и т. д.)
  • Управление учетными записями пользователей (регистрация, вход, выход)
  • Использование идентификаторов третьих сторон (3PID), таких как адреса электронной почты, номера телефонов, учетные записи соц. сетей, для аутентификации, идентификации и поиска пользователей в Matrix.
  • Доверенная федерация серверов идентификации для:
    • Публикация открытых ключей пользователей для PKI
    • Сопоставление 3PID с идентификаторами матрицы

Конечная цель Matrix — стать повсеместным уровнем обмена сообщениями для синхронизации произвольных данных между группами людей, устройств и сервисов — будь то мгновенные сообщения, настройка VoIP-звонков или любые другие объекты, которые необходимо надежно и постоянно передавать из точки А в точку Б совместимым и федеративным образом.

Уровни требований

Ключевые слова «MUST», «MUST NOT», «REQUIRED», «SHALL», «SHALL NOT», «SHOULD», «SHOULD NOT», «RECOMMENDED», «MAY» и «OPTIONAL» во всех частях спецификации следует интерпретировать в соответствии с описанием в RFC 2119.

В зависимости от обстоятельств некоторые разделы спецификации могут быть необязательными. Например, модули клиент-серверного API применяются в зависимости от сценария использования. Уровень требований, выраженный ключевыми словами, встречающимися в таком разделе, актуален только в том случае, если сам раздел применим.

Предложения по изменению технических характеристик

Чтобы предложить изменения в спецификации Matrix, см. пояснения в разделе «Предложения по изменению спецификации Matrix» .

Архитектура

Matrix определяет API для синхронизации расширяемых JSON-объектов, известных как «события», между совместимыми клиентами, серверами и сервисами. Клиентами обычно являются приложения для обмена сообщениями/VoIP или устройства/хабы IoT, которые взаимодействуют, синхронизируя историю коммуникаций со своим «домашним сервером» с помощью «API клиент-сервер». Каждый домашний сервер хранит историю коммуникаций и информацию об учетных записях всех своих клиентов и обменивается данными с более широкой экосистемой Matrix, синхронизируя историю коммуникаций с другими домашними серверами и их клиентами.

Клиенты обычно общаются друг с другом, отправляя события в контексте виртуальной «комнаты». Данные комнаты реплицируются на всех домашних серверах , пользователи которых участвуют в данной комнате. Таким образом, ни один домашний сервер не контролирует и не владеет данной комнатой . Домашние серверы моделируют историю общения как частично упорядоченный граф событий, известный как «граф событий комнаты», который синхронизируется с обеспечением согласованности между участвующими серверами с помощью «API сервер-сервер». Этот процесс синхронизации общей истории разговоров между домашними серверами, управляемыми разными сторонами, называется «федерацией». Matrix оптимизирует свойства доступности и разделения в соответствии с теоремой CAP за счет согласованности.

Например, чтобы клиент A отправил сообщение клиенту B, клиент A выполняет HTTP PUT-запрос необходимого JSON-события на свой домашний сервер (HS) с использованием API клиент-сервер. Домашний сервер A добавляет это событие в свою копию графа событий комнаты, подписывая сообщение в контексте графа для обеспечения целостности. Затем домашний сервер A реплицирует сообщение на домашний сервер B, выполняя HTTP PUT-запрос с использованием API сервер-сервер. Домашний сервер B аутентифицирует запрос, проверяет подпись события, авторизует содержимое события, а затем добавляет его в свою копию графа событий комнаты. Затем клиент B получает сообщение со своего домашнего сервера посредством долговременного GET-запроса.

Как происходит обмен данными между клиентами:

 { Matrix client A } { Matrix client B } ^ | ^ | | events | Client-Server API | events | | V | V +------------------+ +------------------+ | |---------( HTTPS )--------->| | | homeserver | | homeserver | | |<--------( HTTPS )----------| | +------------------+ Server-Server API +------------------+ History Synchronisation (Federation) 

Пользователи

Каждому клиенту присваивается учетная запись пользователя, которая идентифицируется в Matrix с помощью уникального «идентификатора пользователя». Этот идентификатор связан с домашним сервером, который выдал учетную запись, и имеет следующий вид:

@localpart:domain 

Полную информацию о структуре идентификаторов пользователей см. в разделе «Грамматика идентификаторов» в приложениях .

Устройства

В спецификации Matrix термин «устройство» имеет особое значение. Как пользователь, я могу иметь несколько устройств: настольный клиент, несколько веб-браузеров, устройство Android, iPhone и т. д. В целом, они относятся к реальному устройству в физическом мире, но у вас может быть несколько браузеров на физическом устройстве или несколько клиентских приложений Matrix на мобильном устройстве, каждое из которых будет представлять собой отдельное устройство.

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

Когда пользователь впервые использует клиент, он регистрируется как новое устройство. Срок службы устройств может зависеть от типа клиента. Веб-клиент, вероятно, потеряет все свое состояние при выходе из системы и будет создавать новое устройство каждый раз при входе в систему, чтобы гарантировать, что криптографические ключи не будут переданы новому пользователю. В мобильном клиенте повторное использование устройства может быть допустимым, если сессия входа в систему истекает, при условии, что пользователь остается тем же.

Устройства идентифицируются по уникальному идентификатору device_id, который является единственным в рамках возможностей конкретного пользователя.

Пользователь может присвоить устройству удобочитаемое отображаемое имя, чтобы упростить управление своими устройствами.

События

Все данные, которыми обмениваются в Matrix, выражаются в виде «события». Как правило, каждое действие клиента (например, отправка сообщения) соответствует ровно одному событию. Каждое событие имеет идентификатор, typeкоторый используется для различения различных типов данных. Значения ДОЛЖНЫ иметь уникальное глобальное пространство имен в соответствии с соглашениями об именовании пакетовtype Java , например . Специальное пространство имен верхнего уровня зарезервировано для событий, определенных в спецификации Matrix — например, является типом события для мгновенных сообщений. События обычно отправляются в контексте «Комнаты».com.example.myapp.eventm.m.room.message

Содержимое событий считается недостоверными данными. Это означает, что любое приложение, использующее Matrix, должно проверить, соответствует ли содержимое события ожидаемой форме/схеме, прежде чем использовать его в неизменном виде.

Нельзя с уверенностью предполагать, что тело события будет содержать все ожидаемые поля ожидаемых типов.

Более подробную информацию о том, почему это предположение небезопасно, см. в документе MSC2801 .

Графы событий

События, которыми обмениваются участники внутри комнаты, хранятся в ориентированном ациклическом графе (DAG), называемом «графом событий». Частичный порядок этого графа определяет хронологический порядок событий внутри комнаты. Каждое событие в графе имеет список из нуля или более «родительских» событий, которые относятся к любым предшествующим событиям, не имеющим хронологического преемника с точки зрения домашнего сервера, создавшего это событие.

Как правило, у события есть один родитель: самое последнее сообщение в комнате на момент его отправки. Однако домашние серверы могут законно конкурировать друг с другом при отправке сообщений, в результате чего у одного события может быть несколько преемников. Таким образом, следующее событие, добавленное в граф, будет иметь несколько родителей. Каждый граф событий имеет одно корневое событие без родителей.

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

Структура помещения

Комната — это концептуальное пространство, где пользователи могут отправлять и получать события. События отправляются в комнату, и все участники этой комнаты, имеющие достаточный доступ, получат это событие. Комнаты внутри системы однозначно идентифицируются с помощью «идентификаторов комнат», которые имеют следующий вид:

!opaque_id:domain 

Для каждой комнаты существует ровно один идентификатор. Хотя идентификатор комнаты и содержит домен, он используется лишь для глобального присвоения имен идентификаторам комнат. Комната НЕ находится в указанном домене.

Полную информацию о структуре идентификатора комнаты см. в разделе «Грамматика идентификаторов» в приложениях .

Следующая концептуальная схема показывает m.room.messageотправку события в комнату !qporfwt:matrix.org:

{ @alice:matrix.org } { @bob:example.org } | ^ | | [HTTP POST] [HTTP GET] Room ID: !qporfwt:matrix.org Room ID: !qporfwt:matrix.org Event type: m.room.message Event type: m.room.message Content: { JSON object } Content: { JSON object } | | V | +------------------+ +------------------+ | homeserver | | homeserver | | matrix.org | | example.org | +------------------+ +------------------+ | ^ | [HTTP PUT] | | Room ID: !qporfwt:matrix.org | | Event type: m.room.message | | Content: { JSON object } | `-------> Pointer to the preceding message ------` PKI signature from matrix.org Transaction-layer metadata PKI Authorization header  .................................... | Shared Data | | State: | | Room ID: !qporfwt:matrix.org | | Servers: matrix.org, example.org | | Members: | | - @alice:matrix.org | | - @bob:example.org | | Messages: | | - @alice:matrix.org | | Content: { JSON object } | |....................................| 

Федерация поддерживает общие структуры данных для каждой комнаты между несколькими домашними серверами. Данные разделены на message eventsи state events.

Сообщения о событиях: Они описывают кратковременные, разовые действия в помещении, такие как мгновенные сообщения, установление VoIP-соединения, передача файлов и т. д. В целом, они описывают коммуникационную активность.

События состояния: Они описывают обновления определенной постоянной информации («состояния»), связанной с комнатой, такой как название комнаты, тема, состав участников, участвующие серверы и т. д. Состояние моделируется как таблица поиска пар ключ/значение для каждой комнаты, где каждый ключ представляет собой кортеж из state_keyи event type. Каждое событие состояния обновляет значение заданного ключа.

Состояние комнаты в данный момент времени определяется путем рассмотрения всех событий, предшествующих данному событию и включающих его в граф. В случаях, когда события описывают одно и то же состояние, применяется алгоритм разрешения конфликтов слияния. Алгоритм разрешения состояний является транзитивным и не зависит от состояния сервера, поскольку он должен последовательно выбирать одно и то же событие независимо от сервера или порядка получения событий. События подписываются исходным сервером (подпись включает родительские связи, тип, глубину и хеш полезной нагрузки) и передаются по федерации участвующим серверам в комнате, в настоящее время с использованием топологии полной сетки. Серверы также могут запрашивать заполнение событий по федерации у других серверов, участвующих в комнате.

Типы событий не ограничиваются теми, которые определены в данной спецификации. Новые или пользовательские типы событий могут быть созданы по желанию с использованием соглашения об именовании пакетов Java. Например, com.example.game.scoreсобытие может быть отправлено клиентами, и другие клиенты получат его через Matrix, при условии, что у клиента есть доступ к com.exampleпространству имен.

Псевдонимы комнат

Каждой комнате также может быть несколько «псевдонимов комнат», которые выглядят следующим образом:

#room_alias:domain 

Подробную информацию о структуре псевдонима комнаты см . в разделе «Грамматика идентификаторов» в приложениях .

Псевдоним комнаты «указывает» на идентификатор комнаты и представляет собой удобочитаемую метку, по которой комнаты публикуются и обнаруживаются. Идентификатор комнаты, на который указывает псевдоним, можно получить, посетив указанный домен. Обратите внимание, что сопоставление псевдонима комнаты с идентификатором комнаты не является фиксированным и может со временем изменяться, указывая на другой идентификатор комнаты. По этой причине клиентам СЛЕДУЕТ один раз преобразовать псевдоним комнаты в идентификатор комнаты, а затем использовать этот идентификатор в последующих запросах.

При разрешении псевдонима комнаты сервер также ответит списком серверов, находящихся в этой комнате, которые можно использовать для присоединения.

HTTP GET #matrix:example.org !aaabaa:matrix.org | ^ | | _______V____________________|____ | example.org | | Mappings: | | #matrix >> !aaabaa:matrix.org | | #golf >> !wfeiofh:sport.com | | #bike >> !4rguxf:matrix.org | |________________________________| 

Личность

Пользователи в Matrix идентифицируются по своему идентификатору пользователя Matrix. Однако для идентификации пользователей Matrix также могут использоваться существующие пространства имен сторонних идентификаторов. «Идентификатор» Matrix описывает как идентификатор пользователя, так и любые другие существующие идентификаторы из пространств имен сторонних организаций, связанные с его учетной записью. Пользователи Matrix могут связывать сторонние идентификаторы (3PID), такие как адреса электронной почты, учетные записи в социальных сетях и номера телефонов, со своим идентификатором пользователя. Связывание 3PID создает сопоставление между 3PID и идентификатором пользователя. Это сопоставление затем может использоваться пользователями Matrix для определения идентификаторов пользователей своих контактов. Для обеспечения подлинности сопоставления между 3PID и идентификатором пользователя используется глобальный федеративный кластер доверенных «серверов идентификации» (IS) для проверки 3PID, а также для сохранения и репликации сопоставлений.

Использование информационной системы (ИС) не является обязательным условием для того, чтобы клиентское приложение стало частью экосистемы Matrix. Однако без неё клиенты не смогут искать идентификаторы пользователей, используя сторонние идентификаторы (3PID).

Профили

Пользователи могут публиковать произвольные данные типа ключ/значение, связанные с их учетной записью.

  • например, удобочитаемое имя пользователя, URL-адрес фотографии профиля, контактная информация (адрес электронной почты, номера телефонов, URL-адреса веб-сайтов и т. д.).

Личные данные пользователя

Пользователи также могут хранить в своей учетной записи произвольные закрытые данные типа ключ/значение — например, настройки клиента или параметры конфигурации сервера, для которых нет специального API. API симметричен управлению данными профиля.

Общие понятия

Во всех API-интерфейсах Matrix есть ряд общих черт. Они описаны здесь.

пространства имен

Использование пространств имен помогает предотвратить конфликты между различными приложениями и самой спецификацией. В тех случаях, когда используются пространства имен, m.префиксы указывают на то, что поле контролируется спецификацией. Пользовательские или неуказанные пространства имен, используемые на практике, ДОЛЖНЫ использовать соглашение об именовании пакетов Java для предотвращения конфликтов.

Например, типы событий, определенные в спецификации, находятся в пространстве имен под специальным m.префиксом, однако любой клиент может отправить пользовательский тип события, например com.example.game.score(при условии, что у клиента есть права доступа к com.exampleпространству имен), без необходимости помещать событие в это m.пространство имен.

Временные метки

Если не указано иное, временные метки представляют собой количество миллисекунд, прошедших с начала эпохи Unix (1970-01-01 00:00:00 UTC), но без учета високосных секунд, так что каждые сутки составляют ровно 86 400 000 миллисекунд.

Это означает, что метки времени могут повторяться в течение високосных секунд. Большинство языков программирования предоставляют метки времени в этом формате изначально, например, ECMAScript . В спецификации это может обозначаться как POSIX, Unix или просто «время в миллисекундах».

Версии спецификаций

Вся матрица выпускается под единым номером спецификации в форме vX.Y.

  • Изменение, приводящее к Xсущественным или критическим изменениям, отражает именно это изменение. Точное время увеличения этого числа оставлено на усмотрение основной команды разработчиков спецификации, однако оно предназначено для таких изменений, как отказ от JSON, изменение алгоритма подписи или когда большое количество Yизменений заслуживает повышения номера основной версии.
  • Изменение Yпредставляет собой обратно совместимое или «управляемое» обратно совместимое изменение спецификации, обычно в виде новых функций.

Кроме того, к версии спецификации могут быть применены произвольные метаданные, если за ней следует -. Например, v1.1-alpha. Использование этого не строго регламентировано, но предназначено для использования в предварительных сборках спецификации.

Обратите внимание, что хотя v1.2предполагается обратная совместимость с v1.1, нет гарантии, что будущие версии будут полностью обратно совместимы с v1.1. Например, если /testбудет введен в v1.1и объявлен устаревшим в v1.2, то его можно будет удалить в v1.3. Более подробная информация об этом описана в политике устаревания ниже.

Версионирование конечных точек

Все API-интерфейсы в спецификации имеют индивидуальные версии. Это означает, что /v3/sync(например) может быть объявлен устаревшим в пользу другого /v4/syncбез каких-либо последствий /v3/profile. Сервер, поддерживающий эту функцию, /v4/syncпродолжит обслуживать сервер /v3/profileтак же, как и раньше.

Когда MSC предлагает внести критические изменения в конечную точку, он также должен объявить существующую конечную точку устаревшей. Для некоторых конечных точек это может быть неявным, например, /v4/syncпутем введения (объявления устаревшей /v3/sync), однако для более сложных примеров MSC должен явно объявить конечную точку устаревшей.

Политика амортизации

Для перехода от стабильного (по умолчанию) состояния к устаревшему требуется MSC. После того, как состояние устаревает достаточно долго (обычно 1 версия), его можно удалить из спецификации с помощью другого MSC.

Реализации Matrix обязаны реализовывать устаревшую функциональность спецификации, хотя, если эта функциональность впоследствии будет удалена, реализация может отказаться от её поддержки (если она не рекламирует поддержку версии, включающей устаревшую функциональность). Например, если /test была объявлена ​​устаревшей в v1.2 и удалена в v1.3, то реализация, которая хочет рекламировать поддержку , v1.2 должна будет реализовать /test, даже если она также рекламирует поддержку v1.3. Если эта реализация рекламирует только поддержку , v1.3 то ей не потребуется реализовывать /test.

Устаревшее версионирование

До внедрения этой системы различные API-интерфейсы Matrix версионировались индивидуально. С новым подходом к версионированию спецификаций это больше невозможно.

Для исторической справки, версии API были обозначены примерно так: rX.Y.Z где обозначает критическое изменение,  обратно совместимое изменение, а Z— исправление или незначительное изменение API.

Текущая глобальная система версионирования была введена в v1.1Matrix 1.0 не соответствовала напрямую версии спецификации; вместо этого она основывалась на следующих версиях для отдельных API:

API/Спецификация Версия
API клиент-сервер р0.5.0
API сервер-сервер р0.1.2
API сервиса приложений р0.1.1
API службы идентификации р0.2.0
API шлюза push-уведомлений р0.1.0
Варианты помещений 1, 2, 3, 4, 5

v1.0 Серверы не должны возвращать этот параметр в GET /_matrix/client/versions ответе.

Лицензия

Спецификация Matrix распространяется под лицензией Apache License, Version 2.0 .