技術 · GProtocol

GProtocol プロトコル

GProtocol は、アプリとノード間のすべての通信を定義します。リクエストとレスポンスの形式、62 個のアクション、エラーの表現方法、そして暗号文でなければならないフィールドです。

現行バージョン 8.0.0

トランスポートとバージョン

  • アプリからノード:WebSocket + JSON。フィールド名はすべてキャメルケースです。
  • ノード間:libp2p。プロトコル ID は /gather/message/1.0.0 のような形式です。ノード間のプロトコルはノード内部で実装されており、GProtocol には含まれません。
  • バージョンの規則:互換性を壊す変更はメジャーバージョンを上げ、マイナーバージョンではフィールドの追加のみ行います。ログイン時にプロトコルのバージョンを送り、メジャーバージョンが一致しないリクエストは拒否され、アップグレードを促します。
  • リアルタイム系のアクション(入力中表示や通話のシグナリングなど)は、届けられなければ破棄され、オフラインメッセージとしては保存されません。

リクエストとレスポンス

requestType
regular はノードが処理し、route はピアツーピアで転送する
action
アクションのパス。例:/message/send
requestId
レスポンスとリクエストを対応づけるために使う
submitter / receiver
双方のアドレス。送信者はノードによって認証済みの ID に置き換えられる
data
業務データ。内容にあたるものはすべてアプリ側で暗号化済み
signature
リクエストの署名
errorKey
エラーは key で表し、アプリはその key に応じて端末の言語で文言を表示する。ノードが返した文字列がそのままユーザーに表示されることはない

ノードから見たメッセージ

アプリが入口ノードに送る 1 対 1 メッセージの例です。ルーティングに必要な項目は平文で、内容はただの暗号文です。

wss://…/ws · /message/send
{
  "requestType": "route",
  "action": "/message/send",
  "requestId": "9c1e…a42f",
  "submitter": "N4k2…Qx7",
  "receiver": "Np8V…3dL",
  "timestamp": 1794420000000,
  "data": "q8Zr4t…/Hk1yWQ==",
  "signature": "3045…e1b0"
}

イメージ:項目名は GProtocol 8.0.0 と同じで、値は架空の例です。

14 モジュール、62 アクション

削除済みのモジュールは掲載していません。

モジュールアクション数用途
/user10ハンドシェイク、ログイン・ログアウト、ハートビート、オンライン状態、ピアツーピアのプロフィール交換
/message9送信、確認応答、オフラインの取得、既読、入力中、送信取り消し、編集、リアクション
/file8分割アップロードとダウンロード、認証情報による取得
/call71 対 1 通話のシグナリング、ICE と中継の設定
/friend6友だち申請、承認、拒否、削除、一覧
/key6X3DH プリキーのアップロード、取得、補充、残量低下の通知
/group4匿名ファンアウト、暗号化された状態ブロックの読み書き、送信取り消し(ノードはグループを保持しない)
/push3プッシュトークンの登録、解除、テスト
/backup2暗号化した関係バックアップとお気に入りのバックアップ
/device2このノード上のアクティブなセッション、強制ログアウト
/node2ノードの ID 証明、ノードディレクトリ
/card · /security · /tip3連絡先カード、セーフティコードの照合、投げ銭の転送

プロトコルのセキュリティ設計

ログイン

ウォレットの鍵が「ユーザー · 端末 · タイムスタンプ」に署名します。ノードはごく短い時間枠内の署名のみを受け付け、同時にプロトコルのメジャーバージョンも確認します。

ノードの ID

アプリが乱数を送り、ノードが署名して返します。アプリは公開鍵とノード ID が一致することを確認し、運営者の帰属証明とリリースマニフェストも検証します。

オフラインメールボックス

メールボックス ID は毎日変わります。内容は X25519 で封緘され、送信者は封緘の内側に入ります。取得と確認応答にはいずれも署名が必要です。

グループ

ノードに見えるのは匿名の配信先と暗号化された状態ブロックだけで、グループ名もメンバーも見えません。

ファイル

取得用の認証情報はファイル鍵から導出され、ノードは共有リストを保存しません。

バックアップ

バックアップの保存場所はクライアントが導出し、書き込みには署名が必要です。ネットワーク全体で共有する鍵は廃止されました。

プロトコルの状況

GProtocol はまだ凍結されておらず、公開前にメジャーバージョンが変わる可能性があります。メジャーバージョンをまたぐ互換性は現在提供していません。プロトコル定義ライブラリは現時点では公開していません。