Некоторое время назад я рассказывал про ONYX, и до недавних пор он был централизован но вот в версии 2.0-beta сервера больше нет.
Отныне есть клиент со встроенным Tor, и не больше. Ниже расскажу, как это устроено, что получилось и чем пришлось заплатить.
Зачем убирать сервер
Центральный сервер, даже при E2E-шифровании, остаётся центральным сервером и единым рубильником. Он понятное дело не видит, но знает кто с кем и когда общается.
Как это работает сейчас
Аккаунт — это ключ
При первом запуске на устройстве генерируется криптографический ключ. Это и есть ваш аккаунт (личность).
Для восстановления на новом устройстве есть seed-фраза из 12 слов.
У каждой личности есть Account ID и fingerprint, по которому собеседники сверяют, что говорят с тем, с кем нужно.
Профиль хранится локально. Между вашими устройствами он синхронизируется через WardLink.
Tor вместо сервера
Вместе с приложением идёт Tor-демон (Windows, Linux, macOS), а на Android используется tor-android. Каждое устройство получает собственный onion-адрес. Сообщения и звонки идут напрямую между устройствами через onion-сервисы.
Два важных момента:
Всё, что идёт наружу (внешние группы, каналы,
.onion-хосты), идёт через Tor.Если Tor не запущен, запрос не уйдёт. Прямого соединения «на всякий случай» нет. Это сделано намеренно, чтобы IP не утёк из-за сбоя.
В диалоге с человеком есть экран «View Circuit», где видно цепочку, по которой идёт соединение.
Контакты
Добавить контакт можно по QR-коду или по onion-адресу. Запрос контакта может содержать комментарий. Его можно принять, отклонить или отклонить с блокировкой.
Пока вы не приняли запрос, человек не видит ваш статус, и тем более не может вам позвонить.
Доставка сообщений
Без сервера нет «почтового ящика», который хранит сообщения, пока вы оффлайн. Поэтому доставка устроена иначе: недоставленные сообщения сохраняются на отправителе и автоматически отправляются повторно. Интервал повторов настраивается, а под сообщением виден статус доставки.
Звонки
Пожалуй, главный козырь этого обновления - это то что теперь есть ЗВОНКИ, и что не мало важно они работают исключительно через Tor. Чтобы не зависеть от внешних серверов, внутри приложения поднимается встроенный локальный TURN-сервер. Качество звонка на удивление приемлимое, и через это даже можно разговаривать (задержка 1-3 секунды)! Только аудиозвонки, в чате остаётся история звонков.
Компромиссы
Было бы нечестно сказать, что всё стало лучше. Часть вещей мы потеряли осознанно.
Что убрано:
HTTP/SOCKS5-прокси. Их заменил Tor. Если хочется свой прокси (зачем?), его больше нет.
Превью ссылок. Для превью приходилось бы ходить на чужой сайт, а это либо утечка, либо лишний трафик через Tor.
Всё, что требовало сервера: удаление аккаунта на сервере, управление серверным кэшем медиа.
Что стало хуже по природе вещей:
Задержки. Tor медленнее прямого соединения, цена анонимности, и деться не куда.
Доставка зависит от онлайна. Без сервера-посредника сообщение уходит, когда получатель доступен. Повторы решают проблему, но мгновенной доставки «всегда и везде» нет.
Это осознанный шаг в сторону децентрализации, которая так важна в нынешнюю эпоху, где
Что дальше
Бета нужна, чтобы найти острые углы: нестабильные цепочки, странное поведение при смене сети, пограничные случаи с несколькими устройствами. Если найдёте баг, пишите в issues.
Скачать: https://github.com/wardcore-dev/onyx/releases/tag/v2.0-beta
becefi
Как стороны находят друг друга?
wardcore Автор
если оба человека в сети, то один отправляет другому запрос на переписку по .onion адресу собеседника в строке поиска. если получатель не в сети то запрос кешируется на устройстве отправителя и переотправляется с определенным интервалом времени.
becefi
+