世界を動かす技術を、日本語で。

どこにあるのか://

概要

  • AT Protocol は分散型SNSの基盤となる新しい通信プロトコル
  • at:// URI はデータの所在や所有者を示す独自のリンク形式
  • URI解決は「ハンドル→DID→ホスティング」の3ステップ
  • DID Document で実際のデータ保管サーバや検証情報を取得
  • ハンドル変更やホスティング移転でもリンクが壊れない恒久的な参照を実現

AT ProtocolのURI解決手順

  • AT Protocol は分散型SNSの基盤技術
  • すべてのサーバが JSONデータ を「at://」形式のURIで公開
  • 各JSONデータは固有の at:// URI を持つ
  • URIの構造は「スキーム」「権限(ユーザーや組織名)」「パス」で構成
  • at://の 権限部 は「データ作成者自身」を指す
  • データの物理的なホスティング先はURIに直接含まれない

URI解決の3ステップ

  • ハンドル(例:ruuuuu.de)からDID(分散ID)への変換
    • DNSのTXTレコードまたはHTTPSでDIDを取得
      • DNS例: _atproto.ruuuuu.de TXT "did=did:web:iam.ruuuuu.de"
      • HTTPS例: https://barackobama.bsky.social/.well-known/atproto-did
  • DIDからホスティングサーバの特定
    • DID Document(JSON)を取得し、serviceEndpointでサーバURLを確認
      • did:webの場合: https://iam.ruuuuu.de/.well-known/did.json
      • did:plcの場合: https://plc.directory/did:plc:xxxxxx
  • ホスティングサーバからJSONデータを取得
    • serviceEndpointで示されたサーバからデータ取得

DID Documentの役割

  • DID Document は「インターネット上のパスポート」的役割
    • alsoKnownAs: ハンドルとの紐付け
    • publicKeyMultibase: 署名検証用公開鍵
    • serviceEndpoint: データのホスティング先

ハンドルとDIDの違い

  • ハンドル は人間に読みやすく、変更可能
  • DID は不変でグローバルに一意なID
  • at:// URIはDIDベースで保存することでリンク切れを防止

DIDの種類

  • did:web
    • ドメイン名所有によるID管理
    • ドメイン失効時にIDも失効するリスク
  • did:plc
    • Bluesky独自の分散ID
    • ドメインに依存せず、より永続的

まとめ:AT Protocol URI解決のポイント

  • at:// URI は「誰が作ったか(権限)」を中心に設計
  • DID で永続的な参照を実現し、ハンドルやホスティングの変更に強い
  • DID Document でハンドルの正当性確認とホスティング先特定が可能
  • 開発者は DIDベースのURI を保存・利用することで、リンク切れを防止
  • ユーザーはハンドルで識別、アプリやサービスはDIDで識別・管理

参考コマンド・実装例

  • DNSによるDID解決:
    nslookup -type=TXT _atproto.<handle>
    
  • HTTPSによるDID解決:
    curl https://<handle>/.well-known/atproto-did
    
  • did:webのDID Document取得:
    curl https://<domain>/.well-known/did.json
    
  • did:plcのDID Document取得:
    curl https://plc.directory/did:plc:<id>
    

AT Protocolを活用するための実践ポイント

  • SDKや既存クライアント (pdsls, Taproot, atproto-browser等)を活用
  • DID解決キャッシュ の導入で高速化・安定化
  • DID Documentの検証 と最新ホスティング情報の取得を自動化
  • at:// URIはDID形式で保存 し、将来の変更にも耐える設計

このように、AT Protocolは リンクの永続性分散性 を両立し、ユーザーや開発者にとって柔軟かつ堅牢なSNS基盤を提供。DIDとDID Documentの理解が、AT Protocolを活用する上での鍵となる。

Hackerたちの意見

著者です!質問があれば喜んで答えます!この件については、こちらのコメントを見てください: https://news.ycombinator.com/item?id=45469167。記事のイントロが詳しくなくてごめんなさい。技術的な質問(at://の解決方法)を探している狭い範囲の人たち向けに書いたつもりでした。あらかじめ言っておくと、実際にat:// URIを解決することは、アプリの作者としてはあまりやらないことです。アプリの一般的なモデルは、ウェブソケットを通じてネットワーク上のすべてのデータコミットをリッスンし(例えば、https://pdsls.dev/jetstream?instance=wss%3A%2F%2Fjetstream1....)、興味のあるものをローカルデータベースに書き込むことです。だから、at:// URIはデータのユニークなグローバル識別子として使うことが多いけど、実際には解決することはあまりないと思います。データはプッシュされてくるからね。でも、いつでもオンデマンドで取得できるのはいいことだと思います。この文章では、解決手順を「追いかける」ことが、ハンドル、アイデンティティ、ホスティングの関係を理解するのにとても良い方法だと思ったので、解決に焦点を当てました。

あなたの今後の記事を先取りしているかもしれないけど、私はそれを待つのも、ATProtoをもっと深く掘り下げるのも嬉しいです。ただ、質問があります: どのアプリでもPDSにデータを書き込むことができるの?もしそうなら、もっと興味深い質問は、Blueskyフォーマットでデータを書こうとして、Bluesky Appviewが期待するフィールドを省略したり、期待とは異なるフォーマットでデータを書いたらどうなるの?

「at:// URIが与えられたとき、対応するJSONをどうやって見つけるの?」これは鶏と卵の話ですね。よくわからないし、説明のイントロも気になりました。「JSON」が欲しい理由は何ですか?うん、「これを読んで」リンクはざっと見ましたけど、私には合わないです。

すみません、急なイントロで。要するに、at://プロトコルは、アプリ同士が深く相互運用できたり、情報をクエリしたり埋め込んだりできるアプリを作ることを可能にします。また、ユーザーがアプリ間で共有のユーザーアイデンティティを持てるようにし、コンテンツを自己ホストしたりホスティングを移動したりしてもアプリに影響を与えないようにします。これは、JSONのビットに特定のユーザーハンドルやホスティングサーバーに結びついていない永続的なURIを与えることで実現されます。記事ではその仕組み(「アイデンティティ」とは何か)を技術的に詳しく説明しています。具体的な例を挙げると、ブログアプリ(https://leaflet.pub)は、別のマイクロブログアプリ(https://bsky.app)でのLeaflet投稿の言及を自動的に「見る」ことができて、それを表示できます: https://bsky.app/profile/o.simardcasanova.net/post/3luujudlr.... これはAPIを叩くことで実現されているわけではなく、両方のアプリがオープンネットワークから同じ情報をそれぞれのデータベースに集約しているだけです。

これを「https:// URIがあったら、対応するHTMLをどうやって見つけるか?」って考えると分かりやすいかも。ちょっと単純化しすぎだけど、DNSやHTTP、TLSに不慣れな人に説明するにはいい質問だと思う。

Blueskyが倒産してplc.directoryが閉鎖されたらどうなるの?これって無駄に脆弱に見えるんだけど。

これはウェブの仕組みと何も変わらないよね。だから、このプロトコルに対する反論としてはあまり良くないと思う。

記事を強引に解釈すると、こういう理由があるんだろうなと思います: > Blueskyは現在、これらの懸念に対処するためにPLCをスイスの独立した法人に移行しています。ATコミュニティも考えたり実験したりしています。(記事にはそこにリンクがあります。)

ダンの説明はいつも素晴らしいし、BlueskyのPLC管理移行に関する最新ニュースともタイムリーです。私たちは、https://fair.pm/のためにWordPressプラグインの配布を分散化するために同じDIDシステムを選びました(ユーザー向けパッケージの一般管理も含む;CargoではなくApp Storeを考えてください)。Blueskyの人たち(特にブライアン)は、私たちを助けてくれて本当に助かりました - Ed25519キーサポートを提供してくれたので、libsodiumを使うことができました。(私たちはDIDsの上にプロトコルを設計していて、Blueskyのスタッカブルモデレーションを使っていますが、atprotoを直接使うことは選びませんでした。でも、素晴らしいのは、DIDsがW3Cの標準であり、PLCがatprotoに縛られていないことです。)

正直に言うと、「私たち」って誰なのか、もうちょっと情報が欲しいな(あと「何」についてのリンクも)。技術的な解決策が出てくるみたいだけど、WordPressのドタバタとは違う感じがするね。

だから、こういう at:// リンクを保存しているサーバーは、著者が言うようにカノニカルな表現、つまりパーマリンクを取得するためにDNS/HTTPSの手間が必要になるんだよね。DNSSECが機能してないと、かなり脆弱になるんじゃない?あんまり考えてないけど、即座に思ったのは、DNSポイズニングがここで結構なダメージを与えそうだってこと。公的鍵がDNSエントリから見つけたDIDの一部だから、悪意のあるやつが俺の名前で投稿できちゃうかも。どう思う?

これはちょっと理解を超えてるな(答えられる人に聞いてみるけど)、でも https://atproto.com/specs/handle#dns-txt-method には「DNSSECは必須ではない」って書いてあるよ(でも、これが君の聞いてることかどうかは分からない)。>公的鍵がDNSエントリから見つけたDIDの一部だから、悪意のあるやつが俺の名前で投稿できちゃうかも。どう思う?DNSはHandle->DIDを解決するだけだけど、DID->Handleのマッピングを確認するにはDIDドキュメントを取得する必要があるんだ。双方向なんだよね。

君の名前で投稿するにはプライベートキーが必要だよ。DNSレコードはDIDドキュメントがどこにあるかを指し示すだけだけど、DIDドキュメントが元に戻ることを確認するチェックがあって、これが解決プロセスの一部として自動的に行われるんだ。DNSSECはDNSレコードの変更に対する追加のセキュリティを提供するけど、これがないからといって誰かが君になりすますことはできない。なぜなら、君のサーバーがそれに同意する必要があるから。

DNSポイズニングは状況によっては心配だけど、いつもそうとは限らない。at://文字列の一般的なケースは、ハンドルではなく「権限」スロットにDIDを入れることだよ。その場合、did:plcやdid:webを解決する際には、通常のHTTPSホスト名が関与していて、ウェブPKIもある。だから、DNSポイズニング攻撃はほとんどのウェブブラウジングと同じだよ。ハンドルから始めると、DNSを使うことになる。解決がHTTPSでよく知られているなら、ウェブPKIがあるけど、TXTレコードもサポートされていて比較的一般的なんだ。今のところ、我々が推奨しているのは、ハンドルをサーバーサイドで解決すること、エンドデバイスではなくてね。もしローカルで解決する必要があるなら、信頼できるプロバイダーへのDoHを使うこと。これが完璧ではない(サーバーホスティング環境はポイズニングに対して脆弱なままだし)、でも攻撃面をかなり減らすことができる。DNSSECはこの問題に対する現在の解決策だ。でも、これを義務付けるのは大きな摩擦になると思う。第三者によるDNSSECの問題で、我々のプロダクションネットワークでもかなり目立つ事件があったんだ。例えば、多くのアクティブなアメリカの上院議員がNAME.senate.govをアイデンティティ確認の一形態として使ってる。senate.govのDNSサーバーはDNSSECを使っていて、ほとんど問題なく動いてたんだけど、DNSSECの設定が壊れたせいで、数十人の上院議員がBlueskyアプリで「無効なハンドル」として表示されることになった。これはDNSSECエコシステムに対する信頼の大きな損失で、それ以来我々はこれを推進していない。もし他のアプリケーションレイヤープロトコルがこれを必要として、成功裏に採用されれば、再考するかもしれないね。

「パーマリンク」のためにハンドルからDIDを解決するっていうのはちょっと心配だな。- 自分のハンドルは自分がコントロールしてるものだから、いつでも別のPDSに向けることができる。- 自分のDIDはPDSがコントロールしてるもの。自分の管理下にあるウェブDIDを通じて間接的に解決することもできるけど、Blueskyのドキュメントにはその推奨がどこにもない。これって、みんなが本当のアイデンティティのポータビリティを確保するためにやらなきゃいけないことなの?編集: 自分の鍵が使えないから、PDSを運営しないと解決できない気がする。何か見落としてる?

これ、俺には合ってない気がする。君がコントロールしてるのはアイデンティティ(つまりDIDドキュメント)だよ。アイデンティティをコントロールしてる限り、ハンドルかホスティング、つまりPDSのどちらかを変更できる。ホスティング/PDSは君のDIDをコントロールしてないから。

このプロジェクトがアイデンティティとデータの所有権の問題をどうやって意味のある形で解決しているのか、まだ理解できてない。アイデンティティに関して言えば、自分のドメインを持つか、他人のドメイン(例えばBluesky)を使うかのどちらかなんだ。ほとんどの人はドメインを持ってないから、彼らのアイデンティティは第三者に所有されることになる。データ自体についても同じ問題がある。Blueskyや他のサーバーにバンされた瞬間、リポジトリはシャットダウンされて、データを他の場所に移す能力を失う。要するに、これはまさにメールと同じだ。自分のドメインとサーバーを持ってない限り、何もコントロールできないんだ。

メールだとPGP/SMIMEキーを持って他のところに移せるから、そこはいいよね?ATprotoも似たような感じじゃない?

ユーザーではないけど、こういう仕組みは必要だと思う。メールユーザーの約0%がメールホストを変えて、古いメッセージと新しいメッセージの間で自分の身分を証明できるかっていうと、難しいよね。これの価値は、Blueskyの「悪用のウィンドウ」を制限することにある。FacebookやTwitterは、私が許容できる範囲を超えてエンシティフィケーションを進めてるけど、それでも多くの人がそこにいる。Blueskyの競合は、どうアプローチするかを決められる。部分的に互換性を保ちながら、UIやリポジトリのストレージ、ユーザー管理で競争することもできるし。

「ほとんどの人はドメインを持っていないから、そのアイデンティティは第三者に所有されることになる。」確かに、その結果、そういうユーザーは突然の禁止など特定のリスクに常にさらされることになる。ホスティングサービスが敵対的になるときにね。完全な保護は、中立的なTLDの下で自分のドメインを持ち、DNSを使ってトラフィックのルーティング方法を説明するプロトコルを持つことだけど、ほとんどのユーザーがドメインを持っていないから(あなたが指摘したように)、ホスティングサービスが協力的なときに部分的な柔軟性と保護で改善できる余地がまだある。このプロジェクトは、ユーザーがドメインを持っていないからこそ、Blueskyのハンドルを保持しつつ(仮に)データホスティングを別のプロバイダーに移すことを可能にしている。今のビッグソーシャルでは、データがFacebook/X/Instagram/TikTok/YouTubeに永遠に閉じ込められるのとは違ってね。Blueskyはこれに興味を持っているのは、ユーザーが自分のハンドルを設定し、ホスティングをBlueskyに移すこともできるから。時には、既存の最先端を改善するのは、完璧な解決策を提供することではなく、私たちが当然と受け入れている制約に対する改善を提供することで実現することもあるよね(ほとんどのユーザーが自分のドメインを設定しないという事実みたいに)。

これ、DNSと同じ機能を果たしてるように見えるけど、その上に抽象化のレイヤーを追加してるね。しかもBlueskyが提供するサービスに依存してるし。全体的に見て、これがどう改善されるのかがよくわからないな。

いいまとめだね。最近、自分の進行中のソーシャルメディアスケジューラーのプロジェクトにBlueskyへの投稿サポートを追加したんだけど、思ったよりも簡単じゃなかった。DIDとハンドルの解決はATProtoの中で一番簡単な部分だったよ。著者が言うように、ライブラリが簡単にやってくれるからね。RubyだとDIDKitがあるよ。ATProtoで本当に混乱したのは、レコードタイプの所有権がないように見えたこと。記事にあるように、Blueskyは「app.bsky.feed.post」をレコードに使ってるけど、こういうレコードタイプがたくさんあって、DIDのような中央インデックスもなさそうだし、標準的なドキュメント化の方法もないみたい。あと、at:// URIをhttp:// URLに変換する標準的な方法も見つからなかった。アプリがユーザーの代わりに投稿すると、Blueskyから返ってくるのはat:// URIだけで、それを自分でhttp:// URLに変換しなきゃいけない。文字列操作でしかできないし、URLのフォーマットがどうあるべきかを外部で知ってるからこそできることなんだ。正規の解決策がないよね。

理論的な分散化を語るいろんな暗号プロトコルを思い出すけど、結局は1つのプラットフォームに縛られて、他に役立つアプリが見当たらないのが残念。

GitとGitHubみたいな感じだね(少なくとも長い間は、今はちょっと改善されたけど)。