Năm 2022, Elon Musk đã mua lại Twitter, sau đó đổi tên thành X. Phần này của câu chuyện được nhiều người biết đến. Tuy nhiên, ít người biết rằng một dự án phi tập trung hóa nền tảng này đang hình thành trong Twitter. Dự án này có tên là BlueSky , được khởi động vào năm 2019. Đến năm 2021, nó được tách ra thành Bluesky Social Benefit Corporation, cho phép nó tiếp tục hoạt động độc lập với Twitter. Theo một số cách, BlueSky có thể được coi là người kế nhiệm Twitter giống như X.
X là một dịch vụ có lợi nhuận cao, cung cấp xác thực trả phí và các tính năng cao cấp. Ngược lại, BlueSky là một hệ thống hoàn toàn mở được xây dựng trên các giao thức mở tương tự như Fediverse , bao gồm nhiều nút độc lập.
Vì nhóm BlueSky không hài lòng với tiêu chuẩn ActivityPub nên họ đã phát triển giao thức của riêng mình, được gọi là Giao thức AT .
Yếu tố cốt lõi của giao thức là kho lưu trữ, tương tự như cơ sở dữ liệu. Đây là nơi lưu trữ các bài đăng, lượt thích và tất cả dữ liệu khác. Mọi người dùng (hoặc bất kỳ thực thể nào) đều có kho lưu trữ. Kho lưu trữ chứa các bộ sưu tập (tương tự như các bảng cơ sở dữ liệu) và các bộ sưu tập chứa các bản ghi theo định dạng khóa-giá trị. Kho lưu trữ lưu trữ dữ liệu giống như IPFS . Mỗi bản ghi có một CID , là một hàm băm dựa trên nội dung. Nếu người dùng sửa đổi bất kỳ thứ gì trong cơ sở dữ liệu, một hàm băm cam kết sẽ được tạo từ dữ liệu (tương tự như một cam kết Git). Ngay cả một thay đổi một bit trong cơ sở dữ liệu cũng dẫn đến một hàm băm cam kết mới. Chủ sở hữu kho lưu trữ sẽ ký kỹ thuật số vào hàm băm cam kết này sau mỗi lần thay đổi, do đó xác thực cơ sở dữ liệu.
Ưu điểm của giải pháp này là toàn bộ kho lưu trữ hoặc một phần của nó có thể được chuyển tự do giữa các hệ thống trong khi vẫn duy trì khả năng xác minh tính xác thực của dữ liệu một cách dễ dàng cho bất kỳ hệ thống nào.
Người dùng có thể lưu trữ kho lưu trữ của họ trên Máy chủ dữ liệu cá nhân (PDS) theo lựa chọn của họ. Theo nghĩa này, PDS hoạt động giống như một máy chủ cơ sở dữ liệu. Thông qua PDS, người dùng có thể sửa đổi kho lưu trữ của họ và cho phép người khác truy cập. Ngoài ra, PDS còn cung cấp nhiều dịch vụ bổ sung. Nó cho phép truy cập vào dữ liệu của người dùng khác, truy xuất nguồn cấp dữ liệu, v.v. Về cơ bản, PDS hoạt động như một nút phương tiện truyền thông xã hội đầy đủ chức năng, cho phép người dùng kết nối với mạng.
Vì PDS chỉ là hệ thống chạy kho lưu trữ, người dùng có thể tự do di chuyển kho lưu trữ của mình giữa các PDS khác nhau hoặc thậm chí vận hành PDS của riêng họ. Tính linh hoạt này là thứ mang lại sự tự do cho hệ thống.
Nội dung của các kho lưu trữ được lưu trữ trên PDS được giám sát bởi các trình tạo nguồn cấp dữ liệu, tạo ra các nguồn cấp dữ liệu dựa trên các tiêu chí cụ thể. Trên các nền tảng truyền thông xã hội khác (ví dụ: Facebook), thường chỉ có một nguồn cấp dữ liệu, nhưng trong trường hợp của BlueSky, người dùng được tự do lựa chọn nguồn cấp dữ liệu mà họ muốn xem bài đăng. Nếu người dùng cảm thấy rằng trình tạo nguồn cấp dữ liệu không hiển thị các bài đăng có liên quan đến sở thích của họ, đang kiểm duyệt các bài đăng mà họ muốn xem hoặc đang cố gắng thao túng chúng, họ có thể chỉ cần chuyển sang một nhà cung cấp nguồn cấp dữ liệu khác.
Mạng lưới hệ thống lỏng lẻo này và sự dễ dàng trong việc chuyển kho lưu trữ cung cấp sự tự do hoàn toàn mà không làm giảm hiệu quả. Ví dụ, khách hàng không cần phải thu thập bài đăng từ nhiều nguồn, vì điều này được xử lý bởi trình tạo nguồn cấp dữ liệu và PDS.
Bây giờ chúng ta đã hiểu cấu trúc hệ thống và các thành phần chính, hãy cùng đi sâu hơn một chút và xem giao thức hoạt động như thế nào.
Mỗi người dùng (và các thực thể khác) được chỉ định một mã định danh phi tập trung (DID) duy nhất. DID này được liên kết với kho lưu trữ và cặp khóa mà người dùng sử dụng để ký cam kết kho lưu trữ. Vì DID khó nhớ nên người dùng được xác định bằng tên miền, hệ thống sẽ dịch thành DID.
Ví dụ, tên người dùng của tôi là thebojda.bsky.social . DID có thể được liên kết theo hai cách: bằng cách chỉ định nó trong bản ghi TXT của miền với khóa thích hợp hoặc chỉ thông qua URI nổi tiếng. Có thể truy cập DID tại URL này:
https://thebojda.bsky.social/.well-known/atproto-did
Ví dụ, DID của tôi là: did:plc:4x7rynvskplz54p5pofj3jxa
Giao thức AT hỗ trợ cả loại DID plc và web . DID web là một URL đơn giản, trong khi DID plc là một tiêu chuẩn tùy chỉnh của Giao thức AT, được tạo từ khóa công khai và một số dữ liệu bổ sung (những ai quan tâm đến việc tìm hiểu sâu hơn có thể đọc thêm về nó tại đây ).
Mỗi DID được liên kết với một tài liệu DID, trong đó có chứa khóa công khai được liên kết với DID và URL của PDS nơi lưu trữ kho lưu trữ.
DID có thể được giải quyết như thế này:
https://plc.directory/did:plc:4x7rynvskplz54p5pofj3jxa
Tài liệu DID trông như thế này:
{ "@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" } ] }
Trong tài liệu này, URL PDS phải được cập nhật nếu ai đó chuyển sang PDS mới. Ví dụ, PDS hiện tại của tôi có thể truy cập tại https://fibercap.us-west.host.bsky.network .
Giao tiếp với PDS được thực hiện thông qua XRPC , một giao thức đơn giản dựa trên HTTP/JSON. Mỗi cuộc gọi có một tên theo kiểu DNS ngược. Ví dụ, nếu tôi muốn lấy toàn bộ kho lưu trữ của mình, tôi có thể thực hiện như sau:
https://fibercap.us-west.host.bsky.network/xrpc/com.atproto.sync.getRepo?did=did:plc:4x7rynvskplz54p5pofj3jxa
Phương thức com.atproto.sync.getRepo
được sử dụng để truy vấn kho lưu trữ và có tham số did
.
Nhóm BlueSky đã phát triển một ngôn ngữ mô tả dựa trên JSON có tên là Lexicon để xác định API và cấu trúc dữ liệu. Nó tương tự như JSON Schema và có thể được sử dụng để tạo giao diện an toàn kiểu, ví dụ, cho TypeScript, giúp đơn giản hóa việc triển khai giao thức.
Có thể sử dụng lệnh gọi sau để lấy 10 bài đăng gần đây nhất của tôi:
https://public.api.bsky.app/xrpc/app.bsky.feed.getAuthorFeed?actor=thebojda.bsky.social&limit=10
Kết quả trông như thế này:
{ "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": {} }, {}, {}, {}, {}, {}, {}, {}, {} ] }
Mỗi phần tử chứa một bài đăng và các phản hồi liên quan. Như đã đề cập trước đó, mỗi bài đăng là một bản ghi trong kho lưu trữ và có mã định danh duy nhất của riêng nó. Mỗi bài đăng có thể được gán một URI duy nhất, bao gồm DID, tên bộ sưu tập và ID bài đăng. Trong ví dụ trên, URI trông như thế này: at://did:plc:4x7rynvskplz54p5pofj3jxa/app.bsky.feed.post/3le3esbhaek2l
Điều này có nghĩa là bài đăng nằm trong kho lưu trữ được liên kết với DID của tôi, trong bộ sưu tập app.bsky.feed.post
và ID của nó là 3le3esbhaek2l
.
Ngoài URI, CID của bài đăng cũng được bao gồm, đây là một hàm băm duy nhất được tạo ra từ nội dung. Các thành phần này cùng nhau tạo thành hàm băm cam kết duy nhất của kho lưu trữ.
Một khía cạnh đáng chú ý khác là phần thumb
, đề cập đến hình ảnh liên quan đến bài đăng. Đây là đối tượng kiểu blob không thuộc về bất kỳ bộ sưu tập nào. Hệ thống lưu trữ các tệp lớn (như hình ảnh, video, v.v.) dưới dạng blob, có thể được tham chiếu trong các bản ghi riêng lẻ (ví dụ: bài đăng) bằng cách sử dụng hàm băm (CID) của chúng.
Đối với những ai quan tâm đến việc tìm hiểu sâu hơn về cấu trúc của kho lưu trữ và các bản ghi, công cụ go-repo-export có thể khá hữu ích. Với chương trình nhỏ này, bạn có thể tải xuống toàn bộ kho lưu trữ người dùng và trích xuất các bộ sưu tập và bản ghi của chúng vào một thư mục ở định dạng JSON. Điều này cho phép bạn xem chính xác cách BlueSky lưu trữ dữ liệu.
Một nguồn thông tin tốt khác là Chrome DevTools. Trên trang web https://bsky.app , bạn có thể thấy rõ các lệnh gọi API và cách phía máy khách giao tiếp với PDS.
Và tất nhiên, còn có tài liệu chính thức. AT Protocol và BlueSky có tài liệu tuyệt vời và trên GitHub , bạn có thể tìm thấy các ví dụ cũng như mã nguồn cho cả phía máy khách và máy chủ.
Khi lần đầu tiên đọc về AT Protocol, suy nghĩ ban đầu của tôi là tại sao chúng ta lại cần một giao thức liên bang khác bên cạnh ActivityPub . Tuy nhiên, AT Protocol thực sự có một số tính năng nhất định hoàn toàn hợp lý cho sự tồn tại của nó. Tất nhiên, giao thức này không hoàn hảo và có thể sẽ trải qua quá trình phát triển đáng kể. Ví dụ, nếu chúng ta muốn xây dựng một mạng lưới thực sự chống kiểm duyệt, thì nó không thể dựa vào hệ thống tên miền tập trung. Một hệ thống đặt tên dựa trên blockchain, thực sự chống kiểm duyệt, sẽ rất có giá trị (tôi thậm chí có thể viết một đề xuất về vấn đề này).
BlueSky hiện có khoảng 20–30 triệu người dùng, con số này không thấm vào đâu so với lượng người dùng của X (Twitter), nhưng vẫn đáng kể. Không ai có thể chắc chắn về tương lai. Mạng lưới liên bang là một lợi thế lớn và có nhiều cuộc tranh luận gay gắt về việc liệu có quá nhiều quyền lực để một thực thể sở hữu một nền tảng truyền thông toàn cầu như Twitter hay Facebook hay không. Tôi sẽ không hoàn toàn loại trừ khả năng BlueSky một ngày nào đó có thể vượt qua các đối thủ cạnh tranh của mình. Với các trình tạo nguồn cấp dữ liệu tốt và xây dựng cộng đồng hiệu quả, điều này là có thể đạt được. Trong mọi trường hợp, bạn nên chú ý đến dự án này và tìm hiểu cách thức hoạt động của nó.