diff --git a/stream.png b/stream.png new file mode 100644 index 00000000..384ceb3d Binary files /dev/null and b/stream.png differ diff --git a/tools/chatgui/readme.md b/tools/chatgui/readme.md index 4bd89c3a..cdbb632f 100644 --- a/tools/chatgui/readme.md +++ b/tools/chatgui/readme.md @@ -1,6 +1,6 @@ Vibechat -Децентрализованный чат, с поддержкой групп. По дизайну отправляет сообщения преимущественно напрямую адресату, а если прямое подключение невозможно то только через участников группы. +Децентрализованный чат, с поддержкой групп. По дизайну отправляет сообщения преимущественно напрямую адресату, а если прямое подключение невозможно то только через других участников этой группы. Участника группы можно сделать суперузлом и медиаузлом. Суперузел должен иметь прямой ip адрес. Такие узлы будут помогать маршрутизации между узлами, а медиаузлы - хранению контента группы. Также есть личные сообщения - которые могут проходить через промежуточные узлы, но только в зашифрованном виде, включая аттачи. Если адресат недоступен, отправитель просит медиаузел сохранить собощение и передать узлу когда он станет доступен. Контент группы хранится на узлах которые его загрузили в незашифрованном виде. @@ -12,3 +12,45 @@ - режим рации внутри группы с возможностью вызова абонента; - видеотрансляции внутри группы; - возможность смотреть все трансляции одновременно с собственной трансляцией - получается функционал видеочата. Одновременно можно использовать рацию. + + +Как работает чат. +Любой участник может создать собственную группу. По сути он генерирует пару ключей, секретный улюч хранит у себя, соответственно становится владельцем группы. Автоматически добавляет себя в список пользователей и подписывает ключом группы как корневой пользователь. Появляется группа из одного пользователя. +Дальше можно приглашать других пользователей в группу. Для этого генерируем ссылку-приглашение, которую другой пользователь вставляет к себе. Приглашая первого пользователя, важно чтобы пользователь мог напрямую подключиться к вам, поскольку только вы владеете группой и только у вас есть эта группа (никакие другие сервера и узлы не используются - только участники этой группы). + +Участники между собой обмениваются ip адресами чтобы они могли напрямую передавать данные друг другу и поддерживать связь. А также при запуске приложения искать узлы у которых не поменялись адреса и к которым можно подключиться и передавать сообщения (кто еще онлайн из этой группы). +Если у всех участников группы поменялись адреса, то подключться не получится. Для решения нужен другой участник группы с пригласительой ссылкой. По этой ссылке можно заново подключиться к другому участнику (который например был онлайн и вовремя обновлял актуальные адреса других участников) +При подключении узлы которые сейчас доступны, строят таблицу маршрутизации между собой. Таким образом они могут доставлять друг другу сообщения используя помощь других таких же узлов. Каждая группа работает раздельно - для группы A узлы других групп не используются. + +К каждая группа - это 3 базы данных, копии которых хранятся у всех пользователей этой группы и они же обмениваются обновлениями, распространяя их по остальным узлам когда узел появляется в сети. +- база пользователей. Причём добавить нового пользователя может существующий пользователь, при этом он должен заверить добавление (оставить свою подпись). Таким образом в группе образуется дерево - кто кого добавил. +- база сообщений. Построена по принципу blockchain - каждая новая запись содержит валидную подпись предыдущей. Каждое сообщение подписывается подльзователем (т.е. подделать сообщение нельзя) +- база реакций, результатов опросов, узлов зранения медиаданных - merkle база, каждый элемент подписан автором, синхронизируется между всеми узлами. Содержит лайки, кто как проголосовал, какдля сообщений - какие узлы загрузили аттачи этих сообщений. + +То есть: все данные группы распространяются только между узлами, вступившими в группу. +Лбюого участника группы можно сделать суперузлом или медиаузлом (это делает владелец группы). Это специальные узлы, помогающие подключаться пользователя и сохранять объемные вложения. +- суперузел - это узел который постоянно присутствует в сети и приоритетно принимает подключения (помогает подключаться узлам за nat/firewall). У этого узла очень желателен постоянный публичный IP адрес для стабильной работы группы через интернет. Его главная задача - связывать узлы друг с другом, а не хранить данные. +- медиаузел - узел который автоматически загружает и сохраняет аттачи опубликованные в группе чтобы при недоступности узла автора сообщений их можно было загрузить. Узел может быть одновременно и суперузлом и медиаузлом. + +Узлы группы которые онлайн, строят таблицу маршрутизации друг между другом и могут напрямую или через помощников актуализировать информацию о себе через другие узлаы. Таким образом они обновляют собственные ip адреса/порты, статусы друг друга - у кого включена рация, кто запустил трансляцию видео, кто занят (звонит) если разрешены соответствующие настройки отправки статусов. + +Также доступны личные сообщения. +Сообщения преимущественно передаются напрямую (если оба узла в сети и могут напрямую подключитсья), либо через посредника (если все 3 узла в одной группе). +Если узел недоступн то сообщения могут временно отдаваться суперузлу и аттачи медиаузлу на хранение, пока получатель недоступен. +Через посредников вся личные сообщения и аттачи отправляются в зашиврованном виде (шифруются ключом полуателя). + +Транспорт. +Каждый узел (или участник чата) имеет собственную сгенерированную пару ключей (публичный-приватный). Весь трафик между узлами шифруется этими ключами. + +Таким образом: +- личные сообщения - доступны только отправителю и получателю в расшифрованном виде, и узлу для промежуточного хранения в зашифрованном виде (если получатель оффлайн и не удалось доставить) +- сообщения и аттачи группы хранятся только у участников этой группы, в незашифрованном виде. Доступ к ним можно получить только если участник группы пригласит вас в группу и вы подключитесь. Ну либо физически скачать из устройства котороое подключено к группе. +- если аттач никем не был скачан и пока вы оффлайн - аттач недоступен для остальных. Для решения этого используется медиасервер который автоматически скачивает аттач. + +10 узлов. один узел запустил трансляцию. еще 2 суперузла в интернете. +допустим 6 узлов смотрят трансляцию. например 3 на телефоне, 3 на десктопе. Через телефон ретрансляция не автивируется (экономим заряд). десктопы и суперузлы могут ретранслировать. +узлы которые хотят смотреть трансляцию, а также суперузлы проверяют связь друг с другом и выстраивают связь друг через друга так чтобы получить оптимальный путь распространения видеопотока по всем узлам. соответственно часть узлов будет ретрансляторами - принимать поток у более близких узлов или у источника трансляции и передавать следующим узлам. +нарисуй схему иллюстрирующую такую топологию. + +Звонок. +Узлы пробуют связаться друг с драом напрямую всеми возможными способами. если это не получается то выбирают посредника с наилучшей сетевой доступностью и направляют трафик через него (в зашифрованном виде).