データリポジトリ
データリポジトリは、単一のユーザーによって公開されたデータのコレクションです。リポジトリは自己認証データ構造であり、各更新は署名され、誰でも検証できます。
リポジトリ仕様で詳細に説明されています。
データレイアウト
リポジトリの内容はMerkle探索木(MST)にレイアウトされ、状態が単一のルートハッシュに縮小されます。これは次のレイアウトとして視覚化できます。
┌────────────────┐
│ Commit │ (Signed Root)
└───────┬────────┘
↓
┌────────────────┐
│ Tree Nodes │
└───────┬────────┘
↓
┌────────────────┐
│ Record │
└────────────────┘
すべてのノードはIPLDオブジェクト(dag-cbor)であり、CIDハッシュによって参照されます。上の図の矢印はCID参照を表します。
このレイアウトは、AT URIに反映されています。
Root | at://alice.com
Collection | at://alice.com/app.bsky.feed.post
Record | at://alice.com/app.bsky.feed.post/1234
データリポジトリへの「コミット」は、ルートノードのCIDに対する鍵ペア署名にすぎません。リポジトリが変更されるたびに、新しいコミットノードが生成されます。
識別子の種類
個人データリポジトリ内では、複数の種類の識別子が使用されます。
- DID
- 分散型識別子(DID)はデータリポジトリを識別します。これは広くユーザーIDとして使用されますが、すべてのユーザーが1つのデータリポジトリを持っているため、DIDはデータリポジトリへの参照と見なすことができます。DIDの形式は使用される「DIDメソッド」によって異なりますが、すべてのDIDは最終的に鍵ペアとサービスプロバイダーのリストに解決されます。この鍵ペアは、データリポジトリへのコミットに署名できます。
- CID
- コンテンツID(CID)は、フィンガープリントハッシュを使用してコンテンツを識別します。これはリポジトリ全体で使用され、リポジトリ内のオブジェクト(ノード)を参照します。リポジトリ内のノードが変更されると、そのCIDも変更されます。ノードを参照する親は参照を更新する必要があり、その結果、親のCIDも変更されます。これはコミットノードまで連鎖し、その後コミットノードが署名されます。
- NSID
- 名前空間識別子(NSID)は、リポジトリ内のレコードグループのLexiconタイプを識別します。
- rkey
- レコードキー(rkey)は、特定のリポジトリ内のコレクションに含まれる個々のレコードを識別します。形式はコレクションのLexiconによって指定されます。レコードを一つだけ持つコレクションは"self"などのキーでレコードを持ったり、多数のレコードを持つコレクションではキーにタイムスタンプ識別子(TID)と呼ばれるbase32エンコードされたタイムスタンプが使用されたりします。