Как устроен BitChat и почему мессенджеры на Bluetooth mesh снова в тренде
Когда на музыкальном фестивале или в горах полностью пропадает сотовая связь, привычные приложения превращаются в бесполезные иконки. Сигнал уходит в никуда, а вышки перегружены. В таких ситуациях выручают peer-to-peer решения, умеющие передавать данные напрямую с одного смартфона на другой.
Проект BitChat предлагает интересный подход к этой проблеме. Разработчики объединили оффлайновую локальную сеть на Bluetooth LE и глобальный протокол Nostr. Получился гибридный мессенджер в стиле классического IRC, работающий без аккаунтов и без центральных серверов.
Как устроена передача сообщений
В базе BitChat лежит двойная архитектура. Приложение автоматически подстраивает транспорт под текущие условия связи.
Первый уровень: Bluetooth LE Mesh. Если адресат находится рядом, сообщение уходит напрямую. Когда получатель находится дальше зоны действия Bluetooth, пакет передвигается по цепочке через смартфоны других пользователей. Архитектура поддерживает до 7 таких промежуточных шагов (hops). Интернета для этого не требуется. За безопасность ответит протокол Noise, который отвечает за сквозное шифрование пакетов на локальном уровне.
Второй уровень: протокол Nostr. Если прямой Bluetooth-канал недоступен, но есть выход в сеть, BitChat отправляет данные через публичные ретрансляторы Nostr.
Для организации публичных комнат используются геошарды (geohash). Уровень точности зависит от длины строки координатного хеша:
block(7 символов): чат в пределах городского кварталаneighborhood(6 символов): уровень районаcity(5 символов): общегородской чатregion(2 символа): целая страна
При отправке личного сообщения мессенджер сначала ищет прямое Bluetooth-соединение. Если соседних устройств нет, он переключается на Nostr и запаковывает текст с помощью алгоритма NIP-17. Когда нет ни интернета, ни соседей по Bluetooth, сообщение встает в очередь до появления любого доступного канала.
Особенности реализации и интерфейс
Внешне BitChat напоминает текстовые чаты конца девяностых. Здесь поддерживаются привычные команды вроде /slap, /msg или /who. Процесс регистрации полностью отсутствует. При первом запуске приложение генерирует временные криптографические ключи, не запрашивая ни номер телефона, ни email.
Несколько любопытных технических решений в проекте:
- Экстренное удаление. Тройной тап по экрану безвозвратно очищает локальное хранилище и криптографические ключи.
- Сжатие трафика. Данные перед отправкой сжимаются через LZ4, что критично для низкой пропускной способности Bluetooth LE.
- Оптимизация энергопотребления. В оффлайн-режиме чат динамически меняет интервалы сканирования эфира, сохраняя заряд аккумулятора.
- Открытый код. Репозиторий выложен под лицензией Unlicense, его можно свободно разбирать на форки или использовать в коммерческих продуктах.
Как запустить проект
Исходный код написан на Swift для iOS и macOS.
Быстрее всего запустить десктопную версию через утилиту just:
brew install just
just run
Команда скомпилирует приложение и запустит его на вашем Mac. Очистить сгенерированные файлы после тестов можно вызовом just clean.
Для сборки под iOS в Xcode придется выполнить стандартную процедуру подготовки конфигурации:
cd bitchat
cp Configs/Local.xcconfig.example Configs/Local.xcconfig
После этого остается открыть bitchat.xcodeproj, прописать ваш Developer Team ID в файле Local.xcconfig и обновить имя группы в entitlements.
Зачем изучать этот репозиторий
Применять BitChat как основной мессенджер на каждый день вряд ли кто-то станет. Однако проект представляет огромный интерес с инженерной точки зрения.
В коде можно посмотреть опрятную реализацию кастомного бинарного протокола поверх CoreBluetooth, работу с геохешами и интеграцию с Nostr-реле. При этом приложение уже готово к использованию и опубликовано в App Store, так что его вполне можно держать на устройстве как запасной вариант связи для походов или крупных концертов.