技術 · システム構成

アプリ、ノード、ノードネットワーク

Gather は 2 つの部分でできています。スマートフォンに入れるアプリと、互いにピアとして接続するノードです。アプリが接続するのは入口ノード 1 台だけで、ノード同士がネットワークを作り、暗号文の中継と一時保管を担います。

アプリ

  • Flutter で記述し、1 つのコードで Android と iOS の両方に対応します。
  • 暗号化と復号はすべてアプリ内で行われ、鍵は OS のセキュアストレージに保存されます。
  • グループ、ブロックリスト、お気に入り、タグなどのユーザーデータは、アプリ本体または暗号化バックアップにのみ保存され、ノードには渡しません。
  • ブランド別ビルドに対応しており、同じコードから異なるブランドのアプリを生成できます。

アプリがノードに接続する仕組み

  • 暗号化された WebSocket(TLS)で入口ノードに接続します。
  • アプリはノードの識別に TLS 証明書を使いません。アプリがノードに乱数を送り、ノードが自身の Ed25519 鍵で署名し、アプリは公開鍵からノード ID が導かれることを確認したうえで、運営者の帰属証明とリリースマニフェストを検証します。
  • アプリは複数の入口を内蔵しており、現在のノードが使えないときは自動的に次のノードへ切り替えます。

ノード間

  • go-libp2p と Kademlia DHT。接続は TLS または Noise で暗号化され、NAT 検出、ホールパンチング、中継に対応します。
  • 独自の gossip でハートビートとリリースマニフェストをノード間に伝播します。伝播範囲には上限があります。
  • ノード探索はシャーディングされており、ネットワーク全体が同じノードに問い合わせることはありません。
  • コードにシードノードは一切内蔵しておらず、シードは設定からのみ読み込みます。

運用

  • 運営者は自分のノード間で非公開の集計を行えます。報告するのは許可リストにあるカウントと列挙値のみで、アドレスや IP は含まれず、報告は署名の検証とリプレイ防止を行います。
  • ノードのバイナリは再現可能ビルドの手順で作られ、ソフトウェア部品表(SBOM)が付属します。