去中心化的社交網絡協定-AT Protocol

Eric Tsai

我是什麼樣的人

我是一個喜歡分享的人,但卻沒有在台灣主流的社群媒體上找到適合分享想法的地方。我也參加過了幾個跟程式有關的社群,但總覺得大部分的時候都不是真的在討論技術上的東西。大多數的情況,都是老鳥在回答菜鳥問題。所以內容的深度也很有限。我一直想要找到一個與我有相同 vibe 的社群。國外的社交媒體平台就好非常多,所以我一直是使用 X(以前叫 Twitter) 來攝取軟體開發相關的資訊。

但除了討論風氣外,在社交媒體平台上,也總是會被廣告或推薦資訊給疲勞轟炸。我覺得 YouTube 這點非常嚴重。特別是跟政治有關的事情,由於流量特別高,所以總是被平台大量推薦。因此我一直想要有一個乾淨無廣告和可以自由選擇推薦演算法的平台。

幸運的我在某一天的下午,偶然發現了 Bluesky 這個社交媒體平台。這簡直就是我夢寐以求的平台。甚至我覺得脫離個人層面,他在社會層面上的貢獻更加令我欣賞。仔細研究後,我發現它背後的技術核心是 AT Protocol。這也讓我對這個新的網路協定產生了很大的興趣。也想分享給你們我對它的理解。

Bluesky

在開始講 AT Protocol 之前,我想先講講我們在網路世界遇到的困境,以及 Bluesky 這個新興的社交媒體平台是如何解決這個問題的。並透過他們的系統架構,說明 AT Protocol 從中扮演的角色。

重要聲明

下面的說法,大量參考了Dan AbramovReact Universe Conf 2024 的演講。影片連結我列在文章最下方的參考資料當中。

Bluesky 是一個去中心化的社交媒體平台,由 X 前 CEO Jack Dorsey 在 2019 年發起。雖然介面設計與 X 非常相似,但設計架構與 X 有著很大的不同。

過去我們在網路上社交的方式如下:

  1. 我們先買一台伺服器,它可以是實體伺服器,也可以是雲端虛擬伺服器(VPS)。
  2. 我們把網站程式碼放到伺服器上。
  3. 我們買一個網域名稱,並把網域名稱指向伺服器。
  4. 我們對外宣傳網域名稱,讓大家知道。

這代表三件事:

  1. 只要我有一個網站,別人就可以來造訪我在網路上的家。反之也是,只要別人有網站,我知道他的網域,我也可以造訪他在網路上的家。(如下圖所示)
  2. 我可以決定我自己的網站要放什麼東西,要怎麼呈現。
  3. 網站上資料都屬於我個人的,我對資料擁有完全的控制權。
Visit Site

不過這樣很不方便,我需要記住很多網域名稱,而且需要自己負責網站伺服器的運作。所以 2004 年 Facebook 問世,很快的我們又有了 X。在那之後,陸續有更多的社交媒體平台出現在我們的生活中。

Post View

但各位有發現嗎?如果我們把視角拉遠,從宏觀的角度來看網路的世界(如下圖所示),你可以發現我們都被困在一個個的社交媒體平台中。我們不再擁有對自己資料的的控制權。

Internet World

如果有一天你所使用的社群媒體平台倒閉了,你所有的資料都會消失。就算有一個平台可以長久經營,當有一天你不再喜歡平台的經營方式,你也沒有任何替代方案。因為你所有的資料都掌握在平台的手中。你走了便會失去在平台上所有的一切。你的追隨者、你與朋友的互動、你發文過的內容,都將不復存在。

雖然根據歐盟的《一般資料保護規範》(GDPR - General Data Protection Regulation),社群平台和其他服務提供商有義務提供資料可攜權(Data Portability)。這項規定要求平台允許用戶將其個人資料以結構化、常用且機器可讀的格式導出,並且有權將這些資料直接傳輸給其他服務提供商。但至少現階段沒有聽過從這些主流平台的導出的數據可以有辦法直接輸入到其他平台使用。實際上你能拿到的就是一個跟平台脫鉤死掉的數據。而這正是 Bluesky 想要透過 AT Protocol 解決的問題。

不過我們一步一步來。我們先一起來思考一下,作為一個 React 的網站開發者,你會怎麼保存你的網站數據呢?

假設今天網站有個按鈕。點擊它後,我就能輸入我想講的話,當我輸入了一段話(資料)並按下 Enter 鍵,我會在網頁上出現一個警告視窗。當我關閉這個視窗後,我輸入的話(資料)就永遠消失了。

function handleClick() {
  const post = prompt("What's up?");
  alert(`You wrote: ${post}`);
}

如果我希望他可以保留在頁面上,我可以用 React 的 useState Hook 來做到。

function Composer() {
  const [post, setPost] = useState("");
  return (
    <>
      <input value={post} onChange={(e)=> setPost(e.target.value)} />
      <p>You wrote: {post}</p>
    </>
  );
}

但如果 component unmount 了,那麼我們就又會失去這個資料。但這也不是我們要的,對吧?我們希望貼文資料是可以被長久保存下來的。在這個情況下,作為 React 的開發者,你會怎麼辦? Lifting state up!! 這樣就可以將資料保存在 parent component 中,並且在 child component mount 的時候,透過 props 傳遞資料給他。

React UI Tree

但如果你今天關掉的是整個頁面呢?那麼你就會再一次失去所有的資料。但透過 React Lifting state up 的概念,你可以再將資料往上移一層也就是瀏覽器。我們都知道可以透過瀏覽器的 LocalStorage 來存儲資料。這樣一來即便你關掉瀏覽器頁籤,下次再打開相同 domain 的時候,你還是能夠看到你曾經發表的貼文。

lifting state up to localStorage

但這一切都只能控制在我們自己的電腦上。也就是說我的貼文無法被其他人看到。

computer

所以這時候我們需要在將資料提升一層,放到伺服器上。讓伺服器統一管理資料。並在使用者打開網頁時傳送給每個需要的人。

Image 1

可是我想要對自己的資料有控制權 🤔

但你能保證這個產品它能一直存活下去嗎?現在還有多少人在使用 Facebook 呢?曾經的無名小站大家又還記得多少呢?會不會有一天你突然發現你沒這麼喜歡現在平台的經營模式,想要換一個平台呢?那既然我們也無法保證產品能夠長久經營或是我們能永遠喜歡現在用的平台,那我們該怎麼辦?😣

老方法,再把資料提升一層。而且這一層資料必須是用戶自己可以控制的。用戶可以選擇自己伺服器託管自己的資料,或者選擇資料託管服務提供商來幫助管理。但終端產品(社交媒體平台)不可能去監聽所有用戶資料託管的伺服器(PDS, Personal Data Server)。所以我們需要創建一個中繼節點(Relay Node),來幫助搜集所有參與這個社交網絡的用戶資料,並用廣播的方式,針對終端產品有訂閱的內容,傳遞最新的資料給它們。

Relay Node

當時我自己看到這個架構時,我馬上想到的問題是『誰要維運中繼節點?會不會很貴啊?』。但後來發現並不需要擔心這個問題。目前這個中繼節點是由 Bluesky 公司所維運的,並且是 open source。也就是說,即便 Bluesky 不想維運或是倒閉了,這個中繼節點還是可以被其他人繼續接手,維持整個社交網絡的運作。成本方面,在 2024 年 9 月時,Bluesky 還只有約 50 萬的每日活躍用戶的情況下,每月中繼節點的支出費用約 150 美金(約台幣 4500 元)。不過隨著 Bluesky 的總用戶數量快速成長(2024 年 11 月已超過 2310 萬)¹,這個支出可能也會跟著增加。但至少以目前來說,這個支出對於一個社交媒體平台來說,並不是非常昂貴。

以上就是 Bluesky 的系統設計的架構,如果還不是很清楚下面我用數據傳遞的角度來解釋整個運作

Bluesky 數據傳遞流程
  1. 發布貼文階段

    • 你在 Bluesky APP 發布一條貼文
    • 這個貼文首先被送到你的 Bluesky PDS
    • PDS 會為這條貼文生成唯一標識符和時間戳
  2. 中繼節點同步階段

    • Bluesky PDS 將貼文推送到中繼節點(BGS - Bluesky Global Service)
    • 中繼節點負責快速分發數據
    • 處理貼文的索引和搜索功能
    • 管理訂閱關係
  3. 數據分發階段

    • 其他 PDS 從中繼節點獲取更新
      • 比如有人在用自己架設的 PDS
      • 或者使用其他服務商提供的 PDS
    • 這些 PDS 會根據它們的用戶關注列表來決定是否同步你的貼文
  4. 顯示階段

    • 各種不同的客戶端應用(可能是官方 Bluesky APP 或第三方 APP)
    • 從它們連接的 PDS 獲取數據
    • 根據自己的界面設計來展示貼文
    • 用戶可以看到並與貼文互動(點讚、轉發、回覆等)

從這個架構中我們可以總結下面 4 個特點:

  • 即時性:通過中繼節點快速分發數據
  • 效率:避免每個 PDS 都需要與其他所有 PDS 直接通訊
  • 靈活性:允許不同的應用以自己的方式呈現內容
  • 去中心化:數據分散存儲,不依賴單一服務器

整個流程就像是一個分佈式的廣播系統,你的貼文通過中繼節點「廣播」出去,需要這條貼文的 PDS 就會接收並儲存,最終通過各種不同的「接收器」(APP)展示給用戶。


這樣無論你切換到哪個社交平台,該社交平台都可以透過中繼節點取得到你過去所有的社交紀錄。達到 帳號可攜性(Account portability) 的目的。


AT Protocol 是什麼?

AT Protocol (全名為 Authenticated Transfer Protocol) 是一個用於建立分散式社交網路的協定,由 Bluesky(跟旗下社交媒體同名) 公司開發。 他在整個社交網絡中扮演「規範制定者」的角色。比如說定義貼文的數據結構(Lexicon)、規範身份驗證方式(Identity)、定義數據存儲格式(Data Repositories)、PDS 之間如何處理數據衝突、中繼節點的運作方式等。

AT Protocol 對應 Bluesky 數據傳遞流程的角色
  1. 發布貼文階段

    • 定義貼文的數據結構(Lexicon)

      • 規定貼文必須包含哪些基本字段
      • 如何處理貼文中的媒體內容
      • 如何標記時間戳和生成唯一 ID
    • 規範身份驗證方式

      • 確保發布者的身份是可驗證的
      • 管理用戶的簽名和授權
  2. PDS 處理階段

    • 定義數據存儲格式

      • 如何組織和索引內容
      • 如何處理版本控制
    • 規範數據同步協議

      • PDS 之間如何交換數據
      • 如何處理數據衝突
  3. 中繼節點(BGS)溝通階段

    • 定義數據傳輸協議

      • 如何打包和解包數據
      • 如何處理大量數據的高效傳輸
    • 規範訂閱機制

      • 如何處理實時更新
      • 如何管理訂閱關係
  4. 應用展示階段

    • 定義 API 接口標準

      • 應用如何請求和接收數據
      • 如何處理用戶互動
    • 規範數據呈現規則

      • 確保核心內容的一致性
      • 允許自定義展示方式

總結

AT Protocol 就像是一本「社交網絡建設指南」,它定義了:

  • 所有參與者必須遵守的通信規則
  • 數據格式和處理標準
  • 確保整個系統可以順暢運作的技術規範

這些標準讓不同的開發者可以建立相容的應用,而用戶的數據可以在不同的服務之間自由流動。


使用 AT Protocol 建構整個社交網絡主要特點:

  1. 開放式協議:AT Protocol 是一個開源的協議,允許任何人建立相容的應用程序和服務。
  2. 去中心化:任何人都可以成為 AT Protocol 的服務供應商,讓平台用戶可以選擇不同的供應商來託管他們的帳戶。
  3. 帳戶可攜性:用戶可以將其帳戶、關注者和貼文內容轉移到不同的服務供應商,而不會在換平台後失去與他們的社交連結。
  4. 算法透明度:允許用戶選擇和控制他們看到的內容的排序算法,而不是被限制在單一平台的算法中。
  5. 內容審核:提供了分散式的內容審核機制,讓社群可以更好地控制他們看到的內容。
結論

AT Protocol 打破了傳統社交平台的壟斷模式,創建一個更開放、更透明的社交網絡生態系統,讓社交平台的用戶對自己的資料擁有更多的控制權和對他人的資料(貼文)有更多的選擇權。提供一個去中心化社交平台的新選擇。

參考資料


[1]2024年11月 Bluesky 擁有超過 2,310 萬用戶,並在美國總統大選結果公佈後的兩週內,增加了超過 500 萬用戶。有一種說法是許多民主黨人士擔心 X 平台向右派傾斜,所以紛紛加入到與其介面類似的 Bluesky。