ADR 003 — マップベースのポリシーによるフィールド単位プライバシーモデル
ステータス: 受理済み
日付: 2026-04
文脈
Raiznetデバイスは、読み取りが機微なセンサー(例: 栽培者が競合に見られたくない作物健康データ)を持つ一方、同じデバイスの他の読み取りは意図的に公開(例: 地域マップ用の気温)であることがあります。
2つの要件が設計を導きました。
- プライバシーはデバイスごとだけでなく フィールド単位 で設定可能でなければならない。
- ポリシーは、ユーザーに2つの別個の論理デバイスを設定させることなく 宛先ごとのオーバーライド をサポートしなければならない。
決定
各センサーフィールドは FieldPolicy を持ちます。
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.protoがFieldPolicy、Disposition、PrivacyPolicyを定義します。apps/server/src/domain/telemetry.tsがフィールドごとの実効処分を解決します:per_destination[serverPubkeyHex] ?? default_disposition(topicレベルのオーバーライドはネットワークとともに入ります)。packages/crypto/src/symmetric.tsがAES-256-GCMのフィールド暗号化と復号を所有します。- 所有者のアプリは、デバイスの対称鍵リング(
{ version → key })の維持と、任意のエンドポイントから受け取ったENCRYPTEDフィールドの復号に責任を持ちます。