- AT Protocol là giao thức làm nền tảng cho mạng xã hội phi tập trung, trong đó mọi dữ liệu đều được định danh bằng URI
at://
- URI
at:// chỉ định người tạo dữ liệu (người dùng) làm authority, còn vị trí thực tế nơi dữ liệu được lưu trữ phải được tra cứu riêng
- Quy trình phân giải URI diễn ra theo thứ tự: chuyển handle thành danh tính (DID), tra cứu máy chủ lưu trữ thông qua tài liệu DID, rồi yêu cầu dữ liệu JSON từ máy chủ đó
- Hỗ trợ hai kiểu DID (
did:web, did:plc), mỗi kiểu có ưu nhược điểm và cách bảo toàn dữ liệu khác nhau
- Cách tiếp cận này nhấn mạnh rằng quyền sở hữu dữ liệu thuộc về người dùng, đồng thời bảo đảm tính bền vững của liên kết ngay cả khi handle và nơi lưu trữ thay đổi
AT Protocol, URI at://, và quá trình phân giải danh tính của dữ liệu xã hội
# Cấu trúc cơ bản của AT Protocol và URI at://
- AT Protocol cho phép nhiều máy chủ phân tán giao tiếp với nhau theo một tiêu chuẩn nhất định, và toàn bộ hệ này được gọi là “atmosphere”
- Mỗi dữ liệu trong atmosphere được gán một URI duy nhất bắt đầu bằng
at://, URI này đóng vai trò như một liên kết tới dữ liệu JSON
- Khác với cấu trúc URI truyền thống, trong AT Protocol, người tạo dữ liệu (người dùng) được đặt làm authority của URI
- Ví dụ, trong dạng
at://ruuuuu.de/app.bsky.feed.post/3lzy2ji4nms2z, ruuuuu.de cho biết chủ sở hữu của dữ liệu đó
- Máy chủ vật lý thực sự lưu trữ dữ liệu không được đưa trực tiếp vào URI, nên cần một quy trình phân giải bổ sung để tìm ra
# Ba bước trong quy trình phân giải URI at://
- Để ánh xạ URI
at:// tới dữ liệu thực tế (JSON), cần ba bước
- Chuyển handle (
ruuuuu.de v.v.) thành danh tính (DID: Decentralized Identifier)
- Handle là bí danh để nhận diện người dùng và có thể thay đổi
- Cần chuyển sang DID là ID toàn cục bất biến
- Cách chuyển đổi:
- Xác định thông tin lưu trữ dữ liệu bằng cách tra cứu tài liệu DID (DID Document)
- Tài liệu DID chứa các thông tin như khóa công khai của danh tính đó, service endpoint (máy chủ), v.v.
- Với
did:web:~, dùng cách tiếp cận dựa trên tên miền (https://tên-miền/.well-known/did.json)
- Với
did:plc:~, tra cứu trong PLC directory (https://plc.directory/DID)
- Service endpoint (
serviceEndpoint) chính là máy chủ lưu trữ dữ liệu thực tế
- Yêu cầu dữ liệu JSON qua API của máy chủ lưu trữ
- Gửi các phần của
at:// làm tham số tới endpoint com.atproto.repo.getRecord để yêu cầu dữ liệu
- JSON trả về chính là dữ liệu thực được ánh xạ với URI
at://
# Giải thích quy trình phân giải qua ví dụ
- Ví dụ:
at://ruuuuu.de/app.bsky.feed.post/3lzy2ji4nms2z
- Ngay cả khi handle thay đổi, nếu dùng URI
at:// dựa trên DID (permalink), liên kết giữa tài khoản và dữ liệu vẫn được duy trì
# Sự khác nhau giữa hai kiểu DID: did:web và did:plc
did:web:
- Có thể tự quản lý và xác thực tên miền của mình
- Nếu mất quyền kiểm soát tên miền, có thể mất toàn bộ ID
did:plc:
- PLC (Public Ledger of Credentials) là chủ thể vận hành ID
- Không gắn với tên miền, nhưng có khả năng tồn tại mức kiểm soát hạn chế như việc phía vận hành PLC từ chối cập nhật
- Mọi lịch sử thay đổi đều có thể được xác minh và theo dõi bằng hash
# Tách biệt danh tính, lưu trữ và dữ liệu, cùng tính bền vững
at:// tách biệt danh tính và nơi lưu trữ dữ liệu, nhờ đó cho phép dữ liệu người dùng có tính di động và tạo liên kết bền vững
- Handle (bí danh) có thể thay đổi bất cứ lúc nào, và máy chủ lưu trữ cũng có thể chuyển đi tương tự
- DID (danh tính) là bất biến, vì vậy URI
at:// dựa trên DID có thể được dùng như permalink lâu dài
- Tài liệu DID chứa đầy đủ bằng chứng sở hữu handle, khóa xác minh chữ ký và thông tin lưu trữ, từ đó bảo đảm độ tin cậy và tính linh hoạt
# Ứng dụng thực tế và ghi chú cho lập trình viên
- Trong thực tế, phần lớn ứng dụng dựa trên AT sẽ nhận dữ liệu dạng push qua Websocket rồi tổng hợp vào DB nội bộ
- Dù vậy, việc nắm vững cách phân giải URI
at:// vẫn là điều thiết yếu để hiểu đặc tính mạng và bảo đảm khả năng di chuyển dữ liệu
- Hệ thống
at:// cung cấp một lớp trừu tượng mạng xã hội trên nền HTTP, DNS và JSON, qua đó hiện thực hóa về mặt kỹ thuật việc người dùng sở hữu dữ liệu của mình
# Kết luận
- AT Protocol và URI
at:// đưa danh tính, khả năng liên kết và tính bền vững của dữ liệu xã hội lên một bước tiến kỹ thuật mới
- Lập trình viên cần nắm rõ workflow cốt lõi như phân giải handle, sử dụng DID, cấu trúc tài liệu DID và cách yêu cầu dữ liệu thực tế
- Nhờ cấu trúc này, người dùng có thể đạt được tính linh hoạt và quyền sở hữu đối với nội dung, danh tính và vị trí lưu trữ của mình
1 bình luận
Ý kiến trên Hacker News
Gần đây đọc vài bài về ATProto nên thử đăng ký bsky, nhưng thứ hiện ra chỉ là vô tận các câu chuyện chính trị Mỹ, bấm "ít thấy nội dung này hơn" liên tục mà cũng chẳng ăn thua, tự hỏi không biết đó có phải bản chất của nền tảng này không, cứ phải xem mãi những ý kiến quen thuộc về các cuộc tranh cãi kỳ quặc ở nước ngoài thì khá mệt mỏi về mặt tinh thần
Tôi vẫn chưa rõ dự án này có thật sự giải quyết vấn đề danh tính và quyền sở hữu dữ liệu theo cách có ý nghĩa hay không, về mặt danh tính thì hoặc là dùng domain của mình hoặc dùng domain của người khác (như Bluesky), mà đa số mọi người không có domain nên rốt cuộc danh tính của họ vẫn nằm trong tay bên thứ ba, dữ liệu cũng vậy, nếu tài khoản bị chặn trên Bluesky hay máy chủ khác thì kho lưu trữ cũng đóng lại và bạn còn mất cả cơ hội chuyển dữ liệu đi nơi khác, cái này chẳng khác email là mấy, nếu không có domain và server riêng thì thực tế bạn chẳng kiểm soát được gì
Giải thích của Dan lúc nào cũng rất hay, và lần này cũng đúng lúc khi gần đây có tin Bluesky sẽ chuyển quyền vận hành PLC, nhóm của chúng tôi cũng đã chọn cùng hệ thống DID tại fair.pm để phân phối phi tập trung plugin WordPress, có thể xem như một kiểu quản lý gói giống App Store, phía Bluesky, đặc biệt là Bryan, đã hỗ trợ rất nhiều, và chúng tôi còn xin được cả hỗ trợ khóa Ed25519 để dùng được libsodium, giao thức của chúng tôi đang được thiết kế trên DID và cơ chế moderation có thể xếp chồng của Bluesky, nhưng không dùng trực tiếp atproto, điểm quan trọng là DID là tiêu chuẩn W3C nên PLC không bị ràng buộc vào atproto
Để tìm at:// thì phải gửi yêu cầu GET đến plc.directory, ở chỗ này hệ thống có vẻ biến thành mô hình tập trung 100%, ít nhất tôi đã mong có thể tách nhiều trusted directory khỏi giao thức như DNS root hay CA
Có vẻ mọi server lưu liên kết at:// cuối cùng cũng phải đi qua DNS/HTTPS để tìm biểu diễn chính thức của permalink, nếu DNSSEC không được triển khai đúng thì cấu trúc này có vẻ khá mong manh, tôi chưa nghĩ quá sâu nhưng nỗi lo xuất hiện ngay là các vấn đề như DNS poisoning có thể cho phép kẻ tấn công đăng bài dưới tên tôi, vì public key được chứa trong DID lấy từ DNS
Trong bài thiếu thông tin về khóa dùng cho lịch sử thay đổi DID, ví dụ nếu tôi là foobar.bsky.social thì tôi không nhớ đã từng tự tải khóa lên hay được hướng dẫn tải khóa xuống, tôi muốn biết chính xác khóa đó nằm ở đâu, ai sở hữu nó, và nó được dùng như thế nào, khi nào, thêm nữa, nếu DID nằm trên plc.directory thì cơ chế nào ngăn người vận hành site đó tự ý ghi đè DID của tôi để chiếm danh tính của tôi?
Khái niệm at:// khá thú vị, nhưng tôi cũng lo về các vấn đề có thể phát sinh trong một hệ thống dựa trên quyền sở hữu dữ liệu thực sự, ví dụ người dùng giữ dữ liệu của mình nên có thể tùy ý sửa hoặc xóa nội dung bất cứ lúc nào, lúc đầu họ viết bài đàng hoàng rồi sau đó ác ý sửa lại thì sao, ngay cả nếu lưu hash bài cũ để chống thay đổi thì dịch vụ mới cũng có thể không biết lịch sử đó, rồi việc theo dõi like hay upvote cũng khó, nếu ai cũng lưu mọi thứ thành object riêng thì rất khó biết ai đã upvote cái gì, và nếu cứ tạo tài khoản giả để tự đăng bài cho mình thì có vẻ cũng chẳng bị hạn chế, cuối cùng, nếu có số lượng khổng lồ tài khoản từ nhiều nền tảng khác nhau đổ vào thì liệu có thể moderation spam hay hành vi xấu được không, với giả định mỗi tài khoản tự quản dữ liệu của mình, tôi không chắc thiết kế hệ thống cho minh bạch, trách nhiệm, moderation, chống spam v.v. có thực sự đứng vững hay không
Tôi có cảm giác khá giống với rất nhiều giao thức crypto khác, đều nói về phi tập trung nhưng cuối cùng vẫn bị buộc vào một nền tảng
Có một câu hỏi mang tính cấu trúc là "làm sao tìm JSON bằng at:// URI", đọc tài liệu xong tôi vẫn không thấy tại sao lại cần đến "JSON đó", cá nhân tôi không hợp với cách làm này
Tôi tự hỏi liệu giao thức này có đóng vai trò như một public Kafka topic khổng lồ hay không, ví dụ khi làm webapp mới thì không cần tự lưu dữ liệu mà mọi người tự lưu dữ liệu trong không gian của họ, còn app chỉ cần có listener để nghe, giao thức bảo đảm việc lan truyền dữ liệu, rồi app nghe và cache lại, về mặt khái niệm thì rất lạ nhưng thú vị, tôi cũng tò mò liệu các khái niệm của Kafka như offset để không bỏ lỡ cập nhật, hay partition để scale, có áp dụng ở đây không