跳至主要內容
進階

Nostr 協議詳解

深入了解 Nostr 協議的技術細節,包括事件結構、簽名機制和中繼器通訊。

20 分鐘

協議基礎

Nostr(Notes and Other Stuff Transmitted by Relays)是一個極簡的、開放的協議, 用於創建抗審查的全球社交網路。它的設計哲學是保持簡單,將複雜性留給客戶端。

核心概念

事件 (Events)

Nostr 中的所有數據都是「事件」。每個事件都包含內容、時間戳和創建者的簽名。 事件一旦創建就不可修改,只能被新事件替代。

中繼器 (Relays)

中繼器是存儲和轉發事件的服務器。用戶可以選擇連接多個中繼器, 實現數據冗餘和抗審查。中繼器之間不直接通訊。

密鑰對 (Keys)

用戶身份由 secp256k1 密鑰對定義。公鑰是用戶的身份標識(npub), 私鑰用於簽署事件(nsec)。沒有用戶名/密碼,只有密鑰。

事件結構

每個 Nostr 事件都是一個 JSON 對象:

{
  "id": "<32字節 SHA256 哈希>",
  "pubkey": "<32字節公鑰>",
  "created_at": <Unix時間戳>,
  "kind": <事件類型整數>,
  "tags": [
    ["e", "<事件ID>", "<中繼器URL>"],
    ["p", "<公鑰>"],
    ...
  ],
  "content": "<任意字串>",
  "sig": "<64字節 Schnorr 簽名>"
}
    

事件 ID 計算

事件 ID 是對序列化事件數據的 SHA256 哈希:

id = sha256(
  JSON.stringify([
    0,                    // 預留欄位
    pubkey,              // 十六進制公鑰
    created_at,          // 時間戳
    kind,                // 事件類型
    tags,                // 標籤數組
    content              // 內容
  ])
)
    

事件類型 (Kinds)

Kind 名稱 描述
0 Metadata 用戶資料(名稱、頭像等)
1 Short Text Note 短文本貼文(類似推文)
2 Recommend Relay 推薦中繼器(已棄用)
3 Contacts 關注列表
4 Encrypted DM 加密私訊
5 Event Deletion 刪除請求
7 Reaction 反應(點讚等)
9735 Zap 閃電網路打賞

客戶端-中繼器通訊

客戶端通過 WebSocket 與中繼器通訊,使用簡單的 JSON 訊息:

客戶端發送

// 發布事件
["EVENT", <event JSON>]

// 訂閱事件
["REQ", <訂閱ID>, <過濾器1>, <過濾器2>, ...]

// 關閉訂閱
["CLOSE", <訂閱ID>]
    

中繼器回應

// 發送事件給訂閱者
["EVENT", <訂閱ID>, <event JSON>]

// 訂閱結束(所有歷史事件已發送)
["EOSE", <訂閱ID>]

// 事件發布結果
["OK", <事件ID>, <成功?>, <訊息>]

// 通知訊息
["NOTICE", <訊息>]
    

過濾器

訂閱使用過濾器來指定想要接收的事件:

{
  "ids": [<事件ID列表>],
  "authors": [<公鑰列表>],
  "kinds": [<事件類型列表>],
  "#e": [<引用的事件ID>],
  "#p": [<提及的公鑰>],
  "since": <Unix時間戳>,
  "until": <Unix時間戳>,
  "limit": <數量限制>
}
    

NIP 標準

NIP(Nostr Implementation Possibilities)定義了協議的各種擴展:

  • NIP-01 基本協議描述
  • NIP-05 將 Nostr 公鑰映射到 DNS 域名
  • NIP-19 bech32 編碼的實體(npub, nsec, note 等)
  • NIP-57 閃電網路 Zaps

與比特幣的關係

Nostr 使用與比特幣相同的 secp256k1 橢圓曲線和 Schnorr 簽名。 這意味著你可以使用比特幣密鑰作為 Nostr 身份, 並且通過 NIP-57 可以無縫整合閃電網路支付。

延伸閱讀

已複製連結
已複製到剪貼簿