跳轉到

D-20260816-03|PeerId 顯示身分與暱稱快照消歧

背景與驅動力

遠端畫面曾分別使用完整 PeerId、PeerId 字串前綴、訊息自報 nickname 或不存在的 ledger nickname。 PeerId 常有共同 multibase 前綴,直接截前 8、10 或 12 碼不能有效消歧;只顯示自報暱稱又會讓 重名與冒名看起來像同一身分。聊天、房間、觀戰及近期隊友需要同一個可驗證且可讀的顯示契約。

考慮過的選項

  • 所有位置只顯示完整 PeerId:權威明確,但一般 UI 難讀、難辨識,否決。
  • 只顯示 profile 暱稱:可讀性最佳,但暱稱不唯一、未上鏈且可由發送者自報,否決。
  • 以已驗 PeerId 為權威,搭配暱稱快照與由 PeerId 計算的穩定短指紋(採納)。

決定

  • SignedPayload.signer 驗證後的 PeerId 是遠端人物唯一身分權威;nickname 只是在送出或 admission 當下由該 PeerId 自報的非唯一呈現快照,不宣稱鏈上註冊或第三方背書。
  • 所有遠端人物共用 display-identity resolver,顯示為「合法暱稱快照 # 穩定短指紋」;沒有合法 快照時只顯示 #短指紋。renderer 不接受訊息自行提供 fingerprint。
  • 短指紋取完整 PeerId 的 SHA-256 前 4 bytes,以 8 位小寫十六進位表示;不得直接截取 PeerId 字串共同前綴。
  • 暱稱快照先 NFC,移除 Unicode CcCf、trim,清理後不得為空;顯示上限為 24 個半形單位 或 12 個全形單位。profile、room wire 與聊天送收端共用 canonical validator,收端不得靜默改寫 已簽內容;第三方或舊資料只能做防禦性截斷並保留 PeerId 指紋。
  • 房間、等待房聊天、Race HUD、觀戰、近期隊友及封鎖清單都使用同一 resolver;資料面可帶 nickname snapshot,但不能帶具有身分權威語意的 displayName

後果與影響

使用者能閱讀暱稱,又能以穩定 fingerprint 區分重名、改名與冒名;所有畫面都由同一已驗 PeerId 得到相同識別。代價是顯示字串略長,且 nickname 變更只影響後續快照,歷史證據仍保留發送當時 的 canonical 值。

本決策補完並部分修訂 D-20260812-02 的「觀戰端依 PeerId 解析 displayName」:觀戰端仍自行解析, 但解析結果明確由 PeerId 權威、非權威暱稱快照及 SHA-256 短指紋共同構成。