Skip to content
⚠️ この翻訳は機械翻訳です。ネイティブによるレビューは保留中のため、訳文に誤りが含まれる場合があります。

ADR 003 — マップベースのポリシーによるフィールド単位プライバシーモデル

ステータス: 受理済み
日付: 2026-04

文脈

Raiznetデバイスは、読み取りが機微なセンサー(例: 栽培者が競合に見られたくない作物健康データ)を持つ一方、同じデバイスの他の読み取りは意図的に公開(例: 地域マップ用の気温)であることがあります。

2つの要件が設計を導きました。

  1. プライバシーはデバイスごとだけでなく フィールド単位 で設定可能でなければならない。
  2. ポリシーは、ユーザーに2つの別個の論理デバイスを設定させることなく 宛先ごとのオーバーライド をサポートしなければならない。

決定

各センサーフィールドは FieldPolicy を持ちます。

protobuf
message FieldPolicy {
  Disposition              default_disposition = 1;
  map<string, Disposition> per_destination     = 2;
}

default_disposition は、per_destination に明示的に列挙されていない任意の宛先に適用されます。マップのキーはサーバーpubkey(hex)またはネットワークtopic文字列です。

3つの処分:

処分効果
OMITフィールドはこの宛先に送られない
PLAINフィールドは平文で伝わる
ENCRYPTEDフィールドはデバイスの対称鍵でAES-256-GCM暗号化される

根拠

1つのデバイス、複数のポリシー。 マップ方式は「2つの論理デバイス」という回避策の必要をなくします。1つのデバイスが、ローカルサーバーでは PLAIN、公開ネットワークでは ENCRYPTED、特定の第三者サーバーには OMIT — すべて1つの設定から。

UIの段階化。 マップモデルは、すべて同じデータ構造に支えられた、ユーザー向けの3段階の粒度をサポートします。

  • すべて同じ: default_disposition 設定、マップ空。
  • 公開 vs ローカル: 宛先クラスでグループ化した2エントリ。
  • 宛先ごと(上級): サーバーpubkeyまたはtopicごとに1エントリ。

リモートな所有者アクセスのための ENCRYPTED ENCRYPTED の処分は特定のケースを解決します。所有者がLAN外から自身のセンサーを追跡したいが、値を公開ネットワークに晒したくない場合です。暗号文blobは公開ネットワークを通常通り伝わります; ピアはそれを保存しますが読めません。所有者のアプリが、デバイスの対称鍵(BIP-39シードから導出)を使ってローカルで復号します。

クエリではなく分離によるセキュリティ。 2データベースアーキテクチャ(raiznet_public.db / raiznet_private.db)は接続レベルで分離を強制します。OMIT / PLAIN / ENCRYPTED モデルはポリシー層; データベースの分離は強制層です。両方が必要です。

複製は常に全体的。 フィルター(MACキュレーションリスト)は保存されるものに決して影響しません — APIレスポンスに現れるものを制御します。これによりネットワークは堅牢に保たれ、断片化を避けます。

トレードオフ

  • per_destination マップは設定された宛先の数とともに増えます。実際には、ほとんどのユーザーは既定(マップ空)か、せいぜい2エントリを使います。
  • ポリシーの変更はすでに公開されたデータに影響しません。平文の読み取りをダウンロードしたピアはそれを保持します — 追記専用ログに「非公開化」の仕組みはありません。
  • ENCRYPTED フィールドは集計に対して不透明です。ネットワークレベルの指標(H3セルごとの平均、地域グラフ)は PLAIN フィールドのみを使えます。これはバグではなく、意図的なプライバシー保証です。

帰結

  • packages/protocol/proto/device.protoFieldPolicyDispositionPrivacyPolicy を定義します。
  • apps/server/src/domain/telemetry.ts がフィールドごとの実効処分を解決します: per_destination[serverPubkeyHex] ?? default_disposition(topicレベルのオーバーライドはネットワークとともに入ります)。
  • packages/crypto/src/symmetric.ts がAES-256-GCMのフィールド暗号化と復号を所有します。
  • 所有者のアプリは、デバイスの対称鍵リング({ version → key })の維持と、任意のエンドポイントから受け取った ENCRYPTED フィールドの復号に責任を持ちます。