ネットワーク
設計仕様
このページは連合型ネットワーク層 — topic、マニフェスト、フィルター、全複製 — を仕様化します。まだ実装されていません: 今日ノードは独立しており、複製は設計段階です(ADR-004)。ロードマップ を参照してください。
Raiznetネットワークは topic で識別されます — ピア発見のキーとして使われる、人間が読める文字列です。誰でも新しいtopicを選んでネットワークを作れます。誰でも既存のネットワークのtopicに接続して参加できます。
Topic
topic文字列に強制されたフォーマットはありませんが、慣例は次です。
raiznet:public:<組織>:<バージョン>例:
raiznet:public:arateki:v1— Aratekiの公式ネットワークraiznet:public:coop-verdao:v1— ある協同組合のネットワークraiznet:public:embrapa-nordeste:v1— ある研究機関のネットワーク
topicは 秘密ではありません。topicを知ることがネットワークへの参加に十分です。本当のプライバシーは local_only モードで動かすことであり、topicの不透明さに頼ることではありません。
NetworkManifest
ネットワークを作る者が創設者です。創設者は NetworkManifest イベントを自身の公開イベントログに、自身のユーザー鍵で署名して公開します。
name: string
topic: string
description: string?
default_filter_pubkey: bytes(32)?
created_at: uint64
signature: bytes(64)マニフェストは時間とともに更新できます(新しい追記専用イベントが投影状態を上書きします)。ユーザーがマニフェストに同意できない、または別のルールを望む場合、別のtopicで自分のネットワークを作ります — 許可不要の軽量フォークです。
創設者はマニフェストを書いたこと以外に技術的特権を持ちません。創設者の default_filter_pubkey は、ネットワークに参加する新しいサーバーで既定で有効になり、フィルター一覧の先頭に表示されます — UIの優先順位だけです。
複製
複製は常に全体的です。 すべてのサーバーは、ネットワーク内で発見したすべてのデバイスログを複製します。フィルターは保存されるものに決して影響しません — APIレスポンス、地図、集計に何が現れるかを制御するクエリ時のレンズです。これによりネットワークは堅牢に保たれます。データは広く分散され、特定のノードだけが特定のデータを保持するという断片化がありません。
サーバーモード
| モード | swarm発見 | 外部から見える |
|---|---|---|
public | 設定済みのすべてのtopicで告知 | はい |
local_only | swarmに一切接続しない | いいえ |
hybrid | topicで告知; 各デバイスが個別に publish_to を制御 | 部分的に |
local_only サーバーはグローバルメッシュから不可視です。ローカルWi-Fiネットワークのデバイスと所有者のアプリにのみ提供します。
フィルター
フィルターは、サーバーノードが公開する構成可能なMACキュレーションリストです。各フィルターはキュレーションイベントの追記専用ログです。
type: mac_verified | mac_flagged | mac_banned | mac_unflagged
mac: bytes(6)
reason: string?
created_at: uint64
signature: bytes(64) // フィルター作成者のユーザー鍵で署名フィルターの現在の状態は、現時点までのすべてのイベントの投影です。追加と削除は常に追記専用です — 破壊的な編集はありません。
クライアントは Roaring Bitmaps に支えられた集合演算で複数のフィルターを組み合わせます。
| 組み合わせ | 効果 |
|---|---|
| 和(Union) | 選択した任意のフィルターで検証されたMACを受理 — 最大カバレッジ |
| 積(Intersection) | MACはすべてのフィルターに現れる必要がある — 最大の厳格さ |
| 差(Difference) | 否定フィルターでフラグされたMACを除外 |
Aratekiのフィルターは raiznet:public:arateki:v1 の既定として機能します。Aratekiがそのネットワークの創設者だからです。他のネットワーク創設者も自分のフィルターと同じ関係を持ちます。独占は誰にもありません — 任意のサーバーがフィルターを公開でき、任意のクライアントがどれを信頼するかを選べます。
ネットワークへの参加
- サーバーがピア発見層を介してtopicに接続する。
- ピアが既知のデバイスのリスト(pubkey、MAC、H3セル)を交換する。
- ピアが利用可能なフィルターとカタログも交換する。
- サーバーが
NetworkManifestのdefault_filter_pubkeyを有効化する(設定されていれば)。 - サーバーがネットワークで見たすべてのデバイスログを複製する。
- フィルターはクエリ時に適用される — APIが返すものを決め、保存されるものは決めない。
複数のネットワーク
単一のサーバーは複数のネットワークに同時に参加できます。参加する各topicについて、別個のピア集合を発見し、そのtopicを Device.networks に列挙するデバイスのログを複製します。
デバイスは networks フィールドに複数のtopicを列挙することで、複数のネットワークに公開できます。
協同組合のためのネットワーク作成
- 一意のtopicを選ぶ:
raiznet:public:my-coop:v1。 - 人間が読める名前と説明を持つ
NetworkManifestを公開する。 - 任意で、協同組合の検証済みデバイスMACを列挙するフィルターを作る。
- マニフェストの
default_filter_pubkeyをそのフィルターに設定する。 - topic文字列をメンバーと共有する — メンバーは自分のサーバーをそれに接続するよう設定する。
メンバーは既定で、自分のアクティブなフィルターを通過するものだけを見ます。技術的には誰でもtopicに接続できますが、フィルターされていないデバイスは、既定フィルターを使うメンバーの集計や地図には現れません。