Identity
TL; DR:
すべてのユーザーは、alice.host.com または単に alice.com のようなドメイン名を持っています。
また、各ユーザーはホスト間の移行を可能にする永続的な「DID」を持っている
DIDは、ユーザーのキーとホストアドレスにマッピングされます。
atprotoのIDシステムには、いくつかの要件があります:
IDの提供 ユーザーは、サービス間で安定したグローバルIDを作成できるようにする必要があります。コンテンツへのリンクが安定していることを確認するために、これらの ID はめったに変更されません。
公開鍵の配布 分散システムは、データの信頼性を証明し、エンドツーエンドのプライバシーを提供するために暗号に依存しています。ID システムは、強力なセキュリティを備えた公開鍵を公開する必要があります。
鍵のローテーション ユーザーは、IDを崩すことなく、鍵の素材をローテーションできる必要があります。
サービス検出 ユーザーとやり取りするために、アプリケーションは、特定のユーザーが使用しているサービスを発見できる必要があります。
使いやすさ ユーザは、人間が読みやすく、覚えやすい名前を持つ必要がある。
移植性 IDはサービス間で移植可能であるべきである。プロバイダーを変更しても、ユーザーのアイデンティティ、ソーシャルグラフ、コンテンツが失われるようなことがあってはならない。
このシステムを採用することで、アプリケーションはエンドツーエンドの暗号化、署名付きユーザーデータ、サービスサインイン、一般的な相互運用のためのツールを得ることができます。
Identifiers 識別子
ハンドルとDIDという、相互に関連する2つの形式の識別子を使用しています。ハンドルはDNS名であり、DIDは安全で安定したIDとして機能するW3Cの新標準です。 以下は、すべて有効なユーザー識別子です:
alice.host.com
at://alice.host.com
at://did:plc:bv6ggog3tya2z3vxsub7hnal
それらの間の関係は、次のように視覚化できます。
code:txt
┌──────────────────┐ ┌───────────────┐
│ DNS name ├──resolves to──→ │ DID │
│ (alice.host.com) │ │ (did:plc:...) │
└──────────────────┘ └─────┬─────────┘
↑ │
│ resolves to
│ │
│ ↓
│ ┌───────────────┐
└───────────references───────┤ DID Document │
│ {"id":"..."} │
└───────────────┘
DNS ハンドルはユーザー向けの識別子です。ユーザーを見つける方法として UI に表示し、宣伝する必要があります。 アプリケーションはハンドルを DID に解決し、DID を安定した正規識別子として使用します。 DID は、公開鍵とユーザー サービスを含む DID documentに安全に解決できます。
DIDs DID は、安定した安全な ID を提供するための新しい W3C 標準です。 ユーザーの安定した正規 ID として使用されます。詳細はdidを参照。 DID Documents DID ドキュメントは、DID レジストリによってホストされる標準化されたオブジェクトです。 次の情報が含まれます。
DID に関連付けられたハンドル。
署名鍵
ユーザのPDSのURL
DID メソッド
強い一貫性 特定の DID に対して、解決クエリは常に 1 つの有効なドキュメントのみを生成する必要があります。 (一部のネットワークでは、これは確率的なトランザクションのファイナリティの対象となる場合があります。)
高可用性 解決クエリは確実に成功する必要があります。
オンラインAPI クライアントは、標準APIを通じて新しいDIDドキュメントを発行できる必要がある。
安全 ネットワークは、そのオペレータ、MITM、および他のユーザーからの攻撃から保護されなければならない。
低コスト DID documentの作成と更新は、サービスやユーザーにとって手頃な価格でなければなりません。
キーローテーション ユーザーは、ID を失うことなく鍵ペアをローテーションできる必要があります。
分散型管理 ネットワークは単一の事業者によって管理されるべきではなく、オープンネットワークまたはプロバイダーのコンソーシアムでなければならない。
Handle の解決
ATP のhandleは、DID に解決(resolve)されるドメイン名であり、DID は、ユーザーの署名公開鍵とホスティング サービスを含む DID Documentに解決されます。
疑似TypeScriptのアルゴリズムは次のとおりです。
code:ts
async function resolveHandle(handle: string) {
const origin = https://${handle}
const res = await xrpc(origin, 'com.atproto.identity.resolveHandle', {handle})
assert(typeof res?.did === 'string' && res.did.startsWith('did:'))
return res.did
}
例:ホスティングサービス
ホスティング サービスが PLC を使用していて、ユーザーのハンドルをサブドメインとして提供しているシナリオを考えてみましょう。
handle alice.pds.com
DID did:plc:12345
ホスティングサービス https://pds.com
最初にわかっているのは alice.pds.com だけなので、alice.pds.com で com.atproto.identity.resolveHandle() を呼び出します。 これにより、DID がわかります。
code:ts
次に、返されたDIDに対してPLC解決メソッドを呼び出し、ホスティングサービスのエンドポイントとユーザーのキーマテリアルを知ることができるようにします。
code:ts
await didPlc.resolve('did:plc:12345') /* => {
id: 'did:plc:12345',
alsoKnownAs: https://alice.pds.com,
}*/
https://pds.com と通信して Alice のデータにアクセスできるようになりました。
例:ホスティングサービス(ドメイン分離型)
ユーザーが独自のドメイン名を提供したことを除いて、前と同じシナリオがあるとします。
handle alice.com (前と違うところ)
DID did:plc:12345
ホスティングサービス https://pds.com
alice.com で com.atproto.identity.resolveHandle()を呼び出してDIDを取得します。
code:ts
そして、先ほどと同じようにDIDを解決します:
code:ts
await didPlc.resolve('did:plc:12345') /* => {
id: 'did:plc:12345',
alsoKnownAs: https://alice.com,
}*/
https://pds.com と通信して Alice のデータにアクセスできるようになりました。https://alice.com エンドポイントは、com.atproto.identity.resolveHandle() 呼び出しを処理するためだけに機能します。 実際のユーザーデータは pds.com にあります。
例:セルフホスト
セルフホスティングのシナリオを考えてみましょう。 did:plc を使用すると、次のようになります。
handle alice.com
DID did:plc:12345
ホスティングサービス https://alice.com
ただし、セルフホスティング事業者がドメイン名の所有権を保持すると確信している場合は、did:plc の代わりに did:web を使用できます。
handle alice.com
DID did:web:alice.com
ホスティングサービス https://alice.com
alice.com で com.atproto.identity.resolveHandle() を呼び出して DID を取得します。
code:ts
次に、did:web を使用して解決します。
code:ts
await didWeb.resolve('did:web:alice.com') /* => {
id: 'did:web:alice.com',
alsoKnownAs: https://alice.com,
}*/