paint-brush
BlueSky の AT プロトコルを覗いてみたら、なぜそれが必要なのかがわかりました@thebojda
1,716 測定値
1,716 測定値

BlueSky の AT プロトコルを覗いてみたら、なぜそれが必要なのかがわかりました

Laszlo Fazekas15m2025/01/11
Read on Terminal Reader
Read this story w/o Javascript

長すぎる; 読むには

革新的な AT プロトコルを搭載した、Twitter に代わる連合型プラットフォーム BlueSky をご紹介します。分散型構造、リポジトリ システム、DID 統合、ユーザーの自由と信頼性を優先する独自の機能について学びましょう。BlueSky がソーシャル メディアの未来をどのように形作るかを探ります。

People Mentioned

Mention Thumbnail

Companies Mentioned

Mention Thumbnail
Mention Thumbnail

Coin Mentioned

Mention Thumbnail
featured image - BlueSky の AT プロトコルを覗いてみたら、なぜそれが必要なのかがわかりました
Laszlo Fazekas HackerNoon profile picture
0-item
1-item


2022年、イーロン・マスクがTwitterを買収し、Twitterはその後Xとしてブランド名を変更しました。この部分は広く知られています。しかし、Twitter内でプラットフォームを分散化するプロジェクトが形になりつつあったことを知る人は少ないです。BlueSkyと名付けられたこのプロジェクトは2019年に開始されました。2021年までに、 Bluesky Social Benefit Corporationにスピンオフし、Twitterから独立して継続できるようになりました。ある意味で、BlueSkyはXと同じくらいTwitterの後継者と見なすことができます。


X は営利目的のサービスであり、有料の検証とプレミアム機能を提供しています。対照的に、BlueSky は、多数の独立したノードで構成される、 Fediverseに似たオープン プロトコル上に構築された完全にオープンなシステムです。


BlueSky チームはActivityPub標準に満足しなかったため、 AT プロトコルと呼ばれる独自のプロトコルを開発しました。


プロトコルの中核となる要素はリポジトリで、データベースに似ています。ここには投稿、いいね、その他すべてのデータが保存されます。すべてのユーザー (または任意のエンティティ) にリポジトリがあります。リポジトリにはコレクション (データベース テーブルに類似) が含まれ、コレクションにはキーと値の形式でレコードが含まれます。リポジトリにはIPFSのようなデータが格納されます。各レコードにはコンテンツ ベースのハッシュであるCIDがあります。ユーザーがデータベース内の何かを変更すると、データからコミット ハッシュが生成されます (Git コミットに類似)。データベースで 1 ビットの変更があっただけでも、新しいコミット ハッシュが生成されます。リポジトリの所有者は、変更のたびにこのコミット ハッシュにデジタル署名し、データベースを認証します。


このソリューションの利点は、どのシステムでもデータの信頼性を簡単に検証できる機能を維持しながら、リポジトリ全体またはその一部をシステム間で自由に転送できることです。


ユーザーは、選択したパーソナル データ サーバー (PDS) にリポジトリをホストできます。この意味で、PDS はデータベース サーバーのように機能します。ユーザーは PDS を通じてリポジトリを変更し、他のユーザーがアクセスできるようにすることができます。さらに、PDS はさまざまな追加サービスを提供します。他のユーザーのデータにアクセスしたり、フィードを取得したりすることができます。基本的に、PDS は完全に機能するソーシャル メディア ノードとして機能し、ユーザーがネットワークに接続できるようにします。


PDS はリポジトリを実行するシステムに過ぎないため、ユーザーはリポジトリを異なる PDS 間で自由に移動したり、独自の PDS を操作したりできます。この柔軟性がシステムに自由をもたらします。


PDS に保存されているリポジトリのコンテンツは、特定の基準に基づいてフィードを作成するフィード ジェネレータによって監視されます。他のソーシャル メディア プラットフォーム (Facebook など) では、通常、フィードは 1 つしかありませんが、BlueSky の場合、ユーザーは投稿を表示するフィードを自由に選択できます。フィード ジェネレータが自分の興味に関係する投稿を表示していない、見たい投稿を検閲している、または投稿を操作しようとしていると感じた場合は、別のフィード プロバイダーに切り替えるだけで済みます。


この緩やかなシステム ネットワークとリポジトリの転送の容易さにより、効率を犠牲にすることなく完全な自由が得られます。たとえば、フィード ジェネレータと PDS によって処理されるため、クライアントは複数のソースから投稿を収集する必要はありません。


システムの構造と主要コンポーネントを理解したので、もう少し詳しく調べてプロトコルがどのように機能するかを見てみましょう。


すべてのユーザー (および他のエンティティ) には、一意の分散識別子 (DID)が割り当てられます。この DID は、リポジトリと、ユーザーがリポジトリ コミットに署名するために使用するキー ペアに関連付けられます。DID は覚えにくいため、ユーザーはドメイン名で識別され、システムがそれを DID に変換します。


たとえば、私のユーザー名はthebojda.bsky.socialです。DID は、適切なキーを使用してドメインの TXT レコードに指定するか、既知の URI を使用するかの 2 つの方法でこれにリンクできます。DID には、次の URL からアクセスできます。


 https://thebojda.bsky.social/.well-known/atproto-did


たとえば、私の DID は次のようになります: did:plc:4x7rynvskplz54p5pofj3jxa


AT プロトコルは、 plcweb の両方のタイプの DID をサポートします。web DID は単純な URL ですが、plc DID は AT プロトコルのカスタム標準であり、公開キーといくつかの追加データから生成されます (詳細に興味のある方は、こちら で詳細をお読みください)。


各 DID は DID ドキュメントに関連付けられており、DID ドキュメントには DID にリンクされた公開キーと、リポジトリがホストされている PDS の URL が含まれています。


DID は次のように解決できます。


 https://plc.directory/did:plc:4x7rynvskplz54p5pofj3jxa


DID ドキュメントは次のようになります。


 { "@context": [ "https://www.w3.org/ns/did/v1", "https://w3id.org/security/multikey/v1", "https://w3id.org/security/suites/secp256k1-2019/v1" ], "id": "did:plc:4x7rynvskplz54p5pofj3jxa", "alsoKnownAs": [ "at://thebojda.bsky.social" ], "verificationMethod": [ { "id": "did:plc:4x7rynvskplz54p5pofj3jxa#atproto", "type": "Multikey", "controller": "did:plc:4x7rynvskplz54p5pofj3jxa", "publicKeyMultibase": "zQ3shaNKzE66K1Kr3dmbnDwXWHh6v4nUcBmpEaK7bVktKTwfh" } ], "service": [ { "id": "#atproto_pds", "type": "AtprotoPersonalDataServer", "serviceEndpoint": "https://fibercap.us-west.host.bsky.network" } ] }


このドキュメントでは、誰かが新しい PDS に移動する場合、PDS URL を更新する必要があります。たとえば、現在の PDS にはhttps://fibercap.us-west.host.bsky.networkからアクセスできます。


PDS との通信は、シンプルな HTTP/JSON ベースのプロトコルであるXRPCを介して行われます。各呼び出しには逆 DNS スタイルの名前があります。たとえば、リポジトリ全体を取得する場合は、次のようにします。


 https://fibercap.us-west.host.bsky.network/xrpc/com.atproto.sync.getRepo?did=did:plc:4x7rynvskplz54p5pofj3jxa


com.atproto.sync.getRepoメソッドはリポジトリを照会するために使用され、 didパラメーターを持ちます。


BlueSky チームは、API とデータ構造を定義するために、 Lexiconと呼ばれる JSON ベースの記述言語を開発しました。これは JSON スキーマに似ており、たとえば TypeScript 用の型安全なインターフェースを生成するために使用でき、プロトコルの実装を簡素化します。


次の呼び出しを使用すると、最新の 10 件の投稿を取得できます。


 https://public.api.bsky.app/xrpc/app.bsky.feed.getAuthorFeed?actor=thebojda.bsky.social&limit=10


結果は次のようになります。


 { "feed": [ { "post": { "uri": "at://did:plc:4x7rynvskplz54p5pofj3jxa/app.bsky.feed.post/3le3esbhaek2l", "cid": "bafyreihagjnwrkakkajkaighz6kyqww3wznvbdcqpnl4wbfnpwrr2xwmmi", "author": { "did": "did:plc:4x7rynvskplz54p5pofj3jxa", "handle": "thebojda.bsky.social", "displayName": "Laszlo Fazekas", "avatar": "https://cdn.bsky.app/img/avatar/plain/did:plc:4x7rynvskplz54p5pofj3jxa/bafkreibxd4mx7rehgkc77diautavpcota6jotzkaagp4zv2t6w3a52n7sq@jpeg", "labels": [], "createdAt": "2024-11-24T01:36:39.146Z" }, "record": { "$type": "app.bsky.feed.post", "createdAt": "2024-12-24T21:20:56.891Z", "embed": { "$type": "app.bsky.embed.external", "external": { "description": "MyETHMeta is a decentralized metadata service for Ethereum accounts. It is something like Gravatar. There are no backend servers, you fully own your data.", "thumb": { "$type": "blob", "ref": { "$link": "bafkreifoezhkdtesuhkaoqt3yml44geozu6ckg2cfffg5t5omob2bdjmo4" }, "mimeType": "image/jpeg", "size": 669185 }, "title": "MyETHMeta v2 – Some Improvements on the Gravatar for Your Ethereum Account | HackerNoon", "uri": "https://hackernoon.com/myethmeta-v2-some-improvements-on-the-gravatar-for-your-ethereum-account" } }, "facets": [ { "features": [ { "$type": "app.bsky.richtext.facet#link", "uri": "https://hackernoon.com/myethmeta-v2-some-improvements-on-the-gravatar-for-your-ethereum-account" } ], "index": { "byteEnd": 270, "byteStart": 240 } } ], "langs": [ "en" ], "reply": { "parent": { "cid": "bafyreieipk3kgwonq3h62wyadauplzgcpdgcg6pxp2776oeldcstgybwha", "uri": "at://did:plc:4x7rynvskplz54p5pofj3jxa/app.bsky.feed.post/3le3es7kzmc2l" }, "root": { "cid": "bafyreieipk3kgwonq3h62wyadauplzgcpdgcg6pxp2776oeldcstgybwha", "uri": "at://did:plc:4x7rynvskplz54p5pofj3jxa/app.bsky.feed.post/3le3es7kzmc2l" } }, "text": "MyETHMeta is a decentralized metadata service for Ethereum accounts. It is something like Gravatar, but here the metadata and your profile picture is assigned to your Ethereum address. There are no backend servers, you fully own your data. hackernoon.com/myethmeta-v2..." }, "embed": { "$type": "app.bsky.embed.external#view", "external": { "uri": "https://hackernoon.com/myethmeta-v2-some-improvements-on-the-gravatar-for-your-ethereum-account", "title": "MyETHMeta v2 – Some Improvements on the Gravatar for Your Ethereum Account | HackerNoon", "description": "MyETHMeta is a decentralized metadata service for Ethereum accounts. It is something like Gravatar. There are no backend servers, you fully own your data.", "thumb": "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:4x7rynvskplz54p5pofj3jxa/bafkreifoezhkdtesuhkaoqt3yml44geozu6ckg2cfffg5t5omob2bdjmo4@jpeg" } }, "replyCount": 0, "repostCount": 0, "likeCount": 0, "quoteCount": 0, "indexedAt": "2024-12-24T21:21:02.466Z", "labels": [] }, "reply": {} }, {}, {}, {}, {}, {}, {}, {}, {} ] }


各要素には、投稿とそれに関連する返信が含まれます。前述のように、すべての投稿はリポジトリ内のレコードであり、独自の一意の識別子を持っています。各投稿には、DID、コレクション名、投稿 ID で構成される一意の URI を割り当てることができます。上記の例では、URI は次のようになります: at://did:plc:4x7rynvskplz54p5pofj3jxa/app.bsky.feed.post/3le3esbhaek2l


これは、投稿がapp.bsky.feed.postコレクション内の私の DID に関連付けられたリポジトリにあり、その ID が3le3esbhaek2lであることを意味します。


URI に加えて、投稿の CID も含まれます。これはコンテンツから生成された一意のハッシュです。これらの要素が組み合わさって、リポジトリの一意のコミット ハッシュが形成されます。


もう一つの注目すべき点は、投稿に関連付けられた画像を参照するthumbセクションです。これは、どのコレクションにも属さない BLOB タイプのオブジェクトです。システムは、大きなファイル (画像、ビデオなど) を BLOB として保存し、ハッシュ (CID) を使用して個々のレコード (投稿など) で参照できます。


リポジトリとレコードの構造を詳しく調べることに興味がある人にとって、 go-repo-exportツールは非常に便利です。この小さなプログラムを使用すると、ユーザー リポジトリ全体をダウンロードし、コレクションとそのレコードを JSON 形式でディレクトリに抽出できます。これにより、BlueSky がデータをどのように保存しているかを正確に確認できます。


もう一つの優れた情報源は Chrome DevTools です。https ://bsky.app のWeb サイトでは、API 呼び出しとクライアント側が PDS と通信する方法を明確に確認できます。


そしてもちろん、公式ドキュメントもあります。ATプロトコルBlueSkyには優れたドキュメントがあり、 GitHubではクライアント側とサーバー側の両方のサンプルとソースコードを見つけることができます。


AT プロトコルについて初めて読んだとき、私の最初の考えは、なぜActivityPubに加えてさらに別の連合プロトコルが必要なのかということでした。しかし、AT プロトコルには確かにその存在を完全に正当化する特定の機能があります。もちろん、このプロトコルは完璧ではなく、大幅な開発が必要になる可能性があります。たとえば、真に検閲耐性のあるネットワークを構築したい場合、中央集権型のドメイン名システムに依存することはできません。真に検閲耐性のあるブロックチェーンベースの命名システムは価値があります (これについては提案書を書くかもしれません)。


BlueSky の現在のユーザー数は推定 2,000 万から 3,000 万で、X (Twitter) のユーザー数と比べると見劣りしますが、それでもかなりの数です。将来については、誰も確かなことは言えません。連合ネットワークは大きな利点であり、Twitter や Facebook のようなグローバル コミュニケーション プラットフォームを 1 つの組織が所有するのは力が大きすぎるのではないかという激しい議論があります。BlueSky がいつか競合他社を追い抜く可能性を完全に否定することはできません。優れたフィード ジェネレーターと効果的なコミュニティ構築があれば、これは実現可能です。いずれにせよ、このプロジェクトに注目し、その仕組みを理解する価値はあります。