Vibechat
Это децентрализованный мессенджер с упором на конфиденциальность и прямой обмен данными между узлами. Работает без каких либо серверов, напрямую между участниками. Поэтому для стабильной работы группы желательно иметь хотябы одного участника который имеет постоянный ip адрес и постоянно доступен. После установки вы получаете мессенджер который не привязан ни к каким серерам, а использует для коммуникации только помощь других как вы участников групп которые вы добавили. В начале вам надо либо создать свою группу и приглашать по ссылке других участников, либо присоединиться к чьей-то группе - попросите ссылку-приглашение и присоединитесь к группе.
Поддерживает групповые чаты, видеозвонки, рацию, голосовые сообщения, видеотрансляции, файлообмен. По дизайну отправляет сообщения преимущественно напрямую адресату, а если прямое подключение невозможно то только через других участников этой группы. Участника группы можно сделать суперузлом и медиаузлом. Суперузел должен иметь прямой ip адрес. Такие узлы будут помогать маршрутизации между узлами, а медиаузлы - хранению контента группы. Также есть личные сообщения - которые могут проходить через промежуточные узлы, но только в зашифрованном виде, включая аттачи. Если адресат недоступен, отправитель просит медиаузел сохранить собощение и передать узлу когда он станет доступен. Контент группы хранится на узлах которые его загрузили в незашифрованном виде. Доступ к контенту группы получают все участники группы. Чтобы стать участником группы требуется приглашение от другого участника.
Ракже доступен следующий функционал:
- звонки и видеозвонки P2P;
- режим рации внутри группы с возможностью вызова абонента;
- видеотрансляции внутри группы;
- возможность смотреть все трансляции одновременно с собственной трансляцией - получается функционал видеочата. Одновременно можно использовать рацию.
Как работает чат. Любой участник может создать собственную группу. По сути он генерирует пару ключей, секретный улюч хранит у себя, соответственно становится владельцем группы. Автоматически добавляет себя в список пользователей и подписывает ключом группы как корневой пользователь. Появляется группа из одного пользователя. Дальше можно приглашать других пользователей в группу. Для этого генерируем ссылку-приглашение, которую другой пользователь вставляет к себе. Приглашая первого пользователя, важно чтобы пользователь мог напрямую подключиться к вам, поскольку только вы владеете группой и только у вас есть эта группа (никакие другие сервера и узлы не используются - только участники этой группы).
Участники между собой обмениваются ip адресами чтобы они могли напрямую передавать данные друг другу и поддерживать связь. А также при запуске приложения искать узлы у которых не поменялись адреса и к которым можно подключиться и передавать сообщения (кто еще онлайн из этой группы). Если у всех участников группы поменялись адреса, то подключться не получится. Для решения нужен другой участник группы с пригласительой ссылкой. По этой ссылке можно заново подключиться к другому участнику (который например был онлайн и вовремя обновлял актуальные адреса других участников) При подключении узлы которые сейчас доступны, строят таблицу маршрутизации между собой. Таким образом они могут доставлять друг другу сообщения используя помощь других таких же узлов. Каждая группа работает раздельно - для группы A узлы других групп не используются.
К каждая группа - это 3 базы данных, копии которых хранятся у всех пользователей этой группы и они же обмениваются обновлениями, распространяя их по остальным узлам когда узел появляется в сети.
- база пользователей. Причём добавить нового пользователя может существующий пользователь, при этом он должен заверить добавление (оставить свою подпись). Таким образом в группе образуется дерево - кто кого добавил.
- база сообщений. Построена по принципу blockchain - каждая новая запись содержит валидную подпись предыдущей. Каждое сообщение подписывается подльзователем (т.е. подделать сообщение нельзя)
- база реакций, результатов опросов, узлов зранения медиаданных - merkle база, каждый элемент подписан автором, синхронизируется между всеми узлами. Содержит лайки, кто как проголосовал, какдля сообщений - какие узлы загрузили аттачи этих сообщений.
То есть: все данные группы распространяются только между узлами, вступившими в группу. Лбюого участника группы можно сделать суперузлом или медиаузлом (это делает владелец группы). Это специальные узлы, помогающие подключаться пользователя и сохранять объемные вложения.
- суперузел - это узел который постоянно присутствует в сети и приоритетно принимает подключения (помогает подключаться узлам за nat/firewall). У этого узла очень желателен постоянный публичный IP адрес для стабильной работы группы через интернет. Его главная задача - связывать узлы друг с другом, а не хранить данные.
- медиаузел - узел который автоматически загружает и сохраняет аттачи опубликованные в группе чтобы при недоступности узла автора сообщений их можно было загрузить. Узел может быть одновременно и суперузлом и медиаузлом.
Узлы группы которые онлайн, строят таблицу маршрутизации друг между другом и могут напрямую или через помощников актуализировать информацию о себе через другие узлаы. Таким образом они обновляют собственные ip адреса/порты, статусы друг друга - у кого включена рация, кто запустил трансляцию видео, кто занят (звонит) если разрешены соответствующие настройки отправки статусов.
Также доступны личные сообщения. Сообщения преимущественно передаются напрямую (если оба узла в сети и могут напрямую подключитсья), либо через посредника (если все 3 узла в одной группе). Если узел недоступн то сообщения могут временно отдаваться суперузлу и аттачи медиаузлу на хранение, пока получатель недоступен. Через посредников вся личные сообщения и аттачи отправляются в зашиврованном виде (шифруются ключом полуателя).
Транспорт. Каждый узел (или участник чата) имеет собственную сгенерированную пару ключей (публичный-приватный). Весь трафик между узлами шифруется этими ключами.
Таким образом:
- личные сообщения - доступны только отправителю и получателю в расшифрованном виде, и узлу для промежуточного хранения в зашифрованном виде (если получатель оффлайн и не удалось доставить)
- сообщения и аттачи группы хранятся только у участников этой группы, в незашифрованном виде. Доступ к ним можно получить только если участник группы пригласит вас в группу и вы подключитесь. Ну либо физически скачать из устройства котороое подключено к группе.
- если аттач никем не был скачан и пока вы оффлайн - аттач недоступен для остальных. Для решения этого используется медиасервер который автоматически скачивает аттач.
10 узлов. один узел запустил трансляцию. еще 2 суперузла в интернете. допустим 6 узлов смотрят трансляцию. например 3 на телефоне, 3 на десктопе. Через телефон ретрансляция не автивируется (экономим заряд). десктопы и суперузлы могут ретранслировать. узлы которые хотят смотреть трансляцию, а также суперузлы проверяют связь друг с другом и выстраивают связь друг через друга так чтобы получить оптимальный путь распространения видеопотока по всем узлам. соответственно часть узлов будет ретрансляторами - принимать поток у более близких узлов или у источника трансляции и передавать следующим узлам. нарисуй схему иллюстрирующую такую топологию.
Звонок. Узлы пробуют связаться друг с драом напрямую всеми возможными способами. если это не получается то выбирают посредника с наилучшей сетевой доступностью и направляют трафик через него (в зашифрованном виде).