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

太長; 讀書

探索 BlueSky,这是 Twitter 的联合替代方案,由创新的 AT 协议提供支持。了解其去中心化结构、存储库系统、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 社会福利公司,使其能够独立于 Twitter 继续运营。从某些方面来看,BlueSky 可以被视为与 X 一样的 Twitter 继承者。


X 是一项以盈利为主要目的的服务,提供付费验证和高级功能。相比之下,BlueSky 是一个完全开放的系统,建立在类似于Fediverse 的开放协议上,由大量独立节点组成。


由于 BlueSky 团队对ActivityPub标准不满意,他们开发了自己的协议,称为AT 协议


该协议的核心元素是存储库,它类似于数据库。帖子、喜欢和所有其他数据的存储位置。每个用户(或任何实体)都有一个存储库。存储库包含集合(类似于数据库表),集合包含键值格式的记录。存储库像IPFS一样存储数据。每条记录都有一个CID ,这是一个基于内容的哈希。如果用户修改了数据库中的任何内容,则会从数据生成提交哈希(类似于 Git 提交)。即使数据库中只有一位更改也会产生新的提交哈希。存储库的所有者在每次更改后都会对此提交哈希进行数字签名,从而对数据库进行身份验证。


该解决方案的优点是整个存储库或其部分可以在系统之间自由转移,同时保持任何系统都能轻松验证数据真实性的能力。


用户可以将他们的存储库托管在他们选择的个人数据服务器 (PDS) 上。从这个意义上说,PDS 的功能类似于数据库服务器。通过 PDS,用户可以修改他们的存储库并使其可供其他人访问。除此之外,PDS 还提供广泛的附加服务。它允许访问其他用户的数据、检索提要等。本质上,PDS 充当功能齐全的社交媒体节点,使用户能够连接到网络。


由于 PDS 仅仅是运行存储库的系统,因此用户可以自由地在不同的 PDS 之间移动存储库,甚至可以操作自己的 PDS。这种灵活性为系统提供了自由。


PDS 上存储的存储库内容由 feed 生成器监控,feed 生成器根据特定标准创建 feed。在其他社交媒体平台(例如 Facebook)上,通常只有一个 feed,但在 BlueSky 上,用户可以自由选择他们想要查看哪个 feed 中的帖子。如果用户认为 feed 生成器没有显示与他们的兴趣相关的帖子、审查他们想要查看的帖子或试图操纵他们,他们只需切换到其他 feed 提供商即可。


这种松散的系统网络和易于传输的存储库提供了完全的自由,同时又不牺牲效率。例如,客户端不需要从多个来源收集帖子,因为这是由 feed 生成器和 PDS 处理的。


现在我们了解了系统的结构和主要组件,让我们深入了解一下该协议的工作原理。


每个用户(和其他实体)都被分配一个唯一的去中心化标识符 (DID) 。此 DID 与存储库以及用户用于签署存储库提交的密钥对相关联。由于 DID 难以记住,因此用户通过域名来识别,系统将其转换为 DID。


例如,我的用户名是thebojda.bsky.social 。DID 可以通过两种方式链接到此:要么通过在域的 TXT 记录中使用适当的密钥指定它,要么简单地通过众所周知的 URI。可以通过以下 URL 访问 DID:


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


例如我的 DID 是: did:plc:4x7rynvskplz54p5pofj3jxa


AT 协议支持plcweb两种类型的 DID。web DID 是一个简单的 URL,而 plc DID 是 AT 协议的自定义标准,由公钥和一些附加数据生成(有兴趣深入了解的人可以在此处阅读更多信息)。


每个 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 的通信是通过XRPC (一种简单的基于 HTTP/JSON 的协议)进行的。每个调用都有一个反向 DNS 样式的名称。例如,如果我想获取我的整个存储库,我可以这样做:


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


com.atproto.sync.getRepo方法用于查询存储库,它有一个did参数。


BlueSky 团队开发了一种基于 JSON 的描述性语言Lexicon来定义 API 和数据结构。它类似于 JSON Schema,可用于生成类型安全的接口(例如,用于 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": {} }, {}, {}, {}, {}, {}, {}, {}, {} ] }


每个元素包含一个帖子及其相关回复。如前所述,每个帖子都是存储库中的一条记录,并具有自己的唯一标识符。每个帖子都可以分配一个唯一的 URI,该 URI 由 DID、集合名称和帖子 ID 组成。在上面的示例中,URI 如下所示: at://did:plc:4x7rynvskplz54p5pofj3jxa/app.bsky.feed.post/3le3esbhaek2l


这意味着该帖子位于与我的 DID 关联的存储库中,在app.bsky.feed.post集合内,其 ID 为3le3esbhaek2l


除了 URI 之外,还包括帖子的 CID,这是从内容生成的唯一哈希值。这些元素共同构成了存储库的唯一提交哈希值。


另一个值得注意的方面是thumb部分,它指的是与帖子相关联的图像。这是一个不属于任何集合的 blob 类型对象。系统将大文件(如图像、视频等)存储为 blob,可以使用其哈希值(CID)在单个记录(例如帖子)中引用它们。


对于那些有兴趣深入了解存储库和记录结构的人来说, go-repo-export工具非常有用。使用这个小程序,您可以下载整个用户存储库,并将集合及其记录提取到 JSON 格式的目录中。这让您可以准确地看到 BlueSky 如何存储数据。


另一个很好的信息来源是 Chrome DevTools。在https://bsky.app网站上,您可以清楚地看到 API 调用以及客户端如何与 PDS 通信。


当然,还有官方文档。AT协议BlueSky有出色的文档,在GitHub上,您可以找到示例以及客户端和服务器端的源代码。


当我第一次阅读有关 AT 协议的文章时,我最初的想法是,为什么我们需要与ActivityPub一起建立另一个联合协议。然而,AT 协议确实具有某些功能,完全证明了其存在的合理性。当然,该协议并不完美,并且可能会经历重大开发。例如,如果我们想要构建一个真正抗审查的网络,它就不能依赖于集中式域名系统。一个真正抗审查的基于区块链的命名系统将是有价值的(我甚至可能会就此写一份提案)。


BlueSky 目前估计有 2000 万到 3000 万用户,与 X(Twitter)的用户群相比相形见绌,但仍然很可观。至于未来会怎样,没有人能肯定地说。联合网络是一个主要优势,而且关于一个实体拥有像 Twitter 或 Facebook 这样的全球通信平台是否权力过大存在激烈的争论。我不会完全排除 BlueSky 有朝一日超越竞争对手的可能性。有了良好的 feed 生成器和有效的社区建设,这是可以实现的。无论如何,值得关注这个项目并了解它的工作原理。