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
前綴表明帳戶使用哪種地址類型:
| 前綴 | 標準 | 第一個帳戶的路徑 | 地址 |
|---|---|---|---|
xpub | BIP44 | m/44'/0'/0' | 舊式地址,以 1 開頭 |
ypub | BIP49 | m/49'/0'/0' | 巢狀 SegWit,以 3 開頭 |
zpub | BIP84 | m/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)。
掌握您的資產
一分鐘即可建立帳戶,不需密碼。