BitChatの仕組みと、Bluetooth meshメッシングが再びトレンドになっている理由

音楽フェスや山間部でcellularサービスが完全に消失すると、おなじみのアプリは無意味なアイコンと化します。信号はどこにも届かず、基地局は過負荷状態です。こんな状況で、データをスマートフォンの間で直接送受信できるピアツーピアソリューションが活躍します。
BitChatプロジェクトはこの問題に対する興味深いアプローチを提供します。開発者たちはBluetooth LE上のオフラインローカルネットワークとグローバルなNostrプロトコルを組み合わせました。結果は、アカウントも中央サーバーも不要で動作する、クラシックIRCスタイルのハイブリッドメッシングです。
メッセージ伝送の仕組み
BitChatは二重アーキテクチャ上に構築されています。 앱は現在の接続状況に基づいて自動的にトランスポートを調整します。
第一レベル:Bluetooth LE Mesh。受信者が近距離にいる場合、メッセージは直接送信されます。受信者がBluetoothの範囲外にいる場合、パケットは他のユーザーのスマートフォンを介してチェーン状に伝わります。アーキテクチャは最大7つの中間ホップをサポートしています。これにはインターネットは不要です。セキュリティはNoiseプロトコルによって処理され、ローカルレベルでパケットのエンドツーエンド暗号化を提供します。
第二レベル:Nostrプロトコル。直接的なBluetoothチャンが利用できないがネットワークアクセスがある場合は、BitChatはパブリックのNostrリレーを通じてデータを送信します。
パブリックのルームはジオハッシュを使用して整理され、座標ハッシュ文字列の長さによって精度レベルが決まります:
block(7文字):街区レベルのチャットneighborhood(6文字):地区レベルcity(5文字):全市域のチャットregion(2文字):国全体
プライベートメッセージの送信時、メッシングはまず直接Bluetooth接続を探します。近隣デバイスがない場合、Nostrに切り替えNIP-17アルゴリズムでテキストをパックします。インターネットもBluetooth近隣もない場合、メッセージは利用可能なチャンが現れるまでキューに溜められます。
実装の詳細とインターフェース
ビジュアル的には、BitChatは90年代後半のテキストチャットに似ています。/nick、/join、/msgなどの使い慣れたコマンドをサポートしています。登録プロセスは一切不要です。初回起動時に電話番号やメールアドレスの入力なしで一時的な暗号鍵を生成します。
プロジェクト内の興味深い技術的ソリューションがいくつかあります:
- 緊急削除。画面を3回タップするとローカルストレージと暗号鍵が完全に消去されます。
- トラフィック圧縮。送信前にLZ4でデータが圧縮され、Bluetooth LEの狭い帯域幅に重要です。
- 消費電力最適化。オフラインモードでは、チャットはエーテルスキャン間隔を動的に変更し、バッテリーを節約します。
- オープンソース。リポジトリはUnlicenseで公開されており、自由にフォークしたり商用製品に使用できます。
プロジェクトの実行方法
ソースコードはSwiftでiOSとmacOS向けに書かれています。
Desktop版を最も素早く実行する方法は、makeユーティリティを使用することです:
brew install just
just run
このコマンドでアプリがコンパイルされ、Mac上で起動します。テスト後に生成ファイルをクリーンアップするには、make cleanを呼び出します。
XcodeでiOS向けにビルドするには、標準的な設定準備を実行する必要があります:
cd bitchat
cp Configs/Local.xcconfig.example Configs/Local.xcconfig
その後、simply open bitchat.xcodeproj、プロジェクトファイルのSigning & CapabilitiesでDeveloper Team IDを設定し、entitlementsのグループ名を更新するだけです。
このリポジトリを学習する理由
BitChatを日常的な主要メッシングとして使う人は誰もいないでしょう。しかし、工学的観点からすると、このプロジェクトは非常に大きな関心事です。
コードには、CoreBluetooth上のカスタムバイナリプロトコルのクリーンな実装、ジオハッシュの処理、Nostrリレーの統合が見つかります。同時に、アプリ自体はすでに使用可能な状態でApp Storeに公開されているため、ハイキングや大規模なコンサート時のバックアップ通信オプションとしてデバイスに保存しておくことができます。
関連プロジェクト