xpub 是甚麼:比特幣錢包的公鑰會洩露哪些資料

有了 xpub,便能找到一個比特幣帳戶的所有地址,從而看到它的完整紀錄,但無法動用資金。本文說明 xpub 會洩露甚麼、有何風險,以及可以交給誰。

xpub(擴展公鑰)是比特幣錢包中一個帳戶的公鑰,該帳戶的所有地址都由它推導出來:持有它的人能看到這個帳戶收到及發出的每一筆付款,但無法動用任何資金。

xpub 包含甚麼

BIP32 標準描述了分層確定性錢包:一個種子便能產生一整棵密鑰樹。擴展密鑰在密鑰之外加上一個鏈碼(chain code),用來計算其子密鑰。根據 BIP32,知道一個擴展公鑰,便能重建它所有非強化(non-hardened)的子公鑰。

錢包按照 BIP44 的路徑來編排這些密鑰:m / purpose' / coin_type' / account' / change / address_index。錢包顯示的 xpub 是 account' 層級的公鑰。它涵蓋兩條地址鏈:0 為收款地址,1 為找零地址,找零地址接收你自己付款時找回的零錢。

xpub、ypub 還是 zpub

前綴表示帳戶使用哪種地址類型:

前綴標準第一個帳戶的路徑地址
xpubBIP44m/44'/0'/0'舊式地址,以 1 開頭
ypubBIP49m/49'/0'/0'嵌套 SegWit,以 3 開頭
zpubBIP84m/84'/0'/0'原生 SegWit,以 bc1q 開頭

三者是同一種密鑰:只有版本位元組不同,因此開頭的字母亦不同。

xpub 會洩露甚麼

  • 帳戶的所有地址,過去及將來的:可以逐一推導,沒有上限。
  • 完整紀錄:每一筆收款、每一筆付款、每一筆金額,因為區塊鏈是公開的。
  • 帳戶結餘,隨時可見。
  • 無法動用資金:沒有私鑰,便無法簽署任何交易。

BIP32 本身已舉出這種用法:把一個帳戶的擴展公鑰交給核數師,便能讓對方看到所有轉入及轉出的付款,而無法接觸任何私鑰。持有你 xpub 的人便擁有這位核數師的視角,而且是永久的:xpub 無法撤銷。

需要知道的風險

單憑 xpub 無法動用資金。但 BIP32 提出警告:知道一個擴展公鑰,再加上由它衍生的任何一個非強化私鑰,便等於知道了上一層的擴展私鑰。換句話說,你的 xpub 加上你任何一個地址的私鑰,就足以動用整個帳戶的資金。

account' 層級是強化的:這樣的洩露只限於有關帳戶,不會波及同一個種子下的其他帳戶。因此,請匯出 xpub,切勿匯出任何地址的私鑰,亦切勿交出你的助記詞。

軟件如何找出地址

讀取 xpub 的軟件會按次序推導地址,遇到一連串從未使用的地址後便停止:BIP44 將這個上限(gap limit)定為 20。如果你連續建立了超過 20 個沒有使用的地址,遵從這條規則的軟件便看不到之後的地址。

接着,為了讀取結餘,軟件會逐個地址向伺服器或節點查詢。這部伺服器因此得知你的所有地址,並能把它們連繫起來:這是另一種洩露,它並非來自 xpub 本身,而是來自讀取它的方式。

交出 xpub 之前

  • 想想誰會保存它:把你的 xpub 存放在自家伺服器上的應用程式,在保存期間都知道你的帳戶,一旦其資料外洩,你的帳戶亦會曝光。
  • 優先在本機讀取:連接你自己節點的錢包,或在你裝置上推導地址的工具,不會把 xpub 交給任何人。
  • 一種用途一個帳戶:另一個帳戶(下一個 account')有另一個 xpub,它不會透露其他帳戶的任何資料。

CentraFIN 如何讀取你的 xpub

CentraFIN 在你的裝置上讀取 xpub:你的瀏覽器推導地址,透過端對端加密的連線讀取結餘,並把這一切存放在由瀏覽器自行加密的保險庫中。CentraFIN 的伺服器永遠看不到你的 xpub、任何地址或結餘。每個地址固定由同一個隨機選定的節點讀取,因此沒有任何節點看得到整個帳戶。詳情請見比特幣頁面。

來源

常見問題

有人能用 xpub 偷走比特幣嗎?

單憑 xpub 不能:它無法簽署。如果再加上該帳戶某個地址的私鑰,便可以:整個帳戶都會被偷走。

只有 xpub 便能看到我的結餘嗎?

可以。它提供帳戶的所有地址,而區塊鏈提供這些地址的結餘及交易。

如果我的 xpub 外洩了,應該怎樣做?

xpub 無法撤銷:持有它的人會一直看得到這個帳戶。今後,請使用一個 xpub 從未分享過的新帳戶。不過,從舊帳戶轉出的那筆轉賬仍然看得到。

xpub、ypub 及 zpub 有甚麼分別?

分別在於帳戶的地址類型:xpub 對應以 1 開頭的地址,ypub 對應以 3 開頭的地址(嵌套 SegWit),zpub 對應以 bc1q 開頭的地址(原生 SegWit)。

掌握你的資產

一分鐘即可建立帳戶,毋須密碼。