作者:Mi Zeng
什麼!找回比特幣錢包竟然也需要一份指南?難道不是將助記詞隨便導入一個錢包軟體,比特幣就回來了嗎?
先別急。看了這篇指南,你將會了解助記詞和錢包背後的基本原理。以及,如何找回你的比特幣錢包。
從助記詞到地址,發生了什麼
私鑰、公鑰和地址
首先,搞清楚私鑰、公鑰和地址之間的關係非常重要。
私鑰是一切的源頭。本質上,它是一長串由0 和1 組成的256 位元隨機數。有各種各樣的方式幫助你產生這樣一串隨機數。當花費資產時,錢包需要用到私鑰來簽名,這是解鎖比特幣最關鍵的要素。 」Not your key, not your coin.」 這句廣為流傳的名言,強調的便是私鑰的重要性。
公鑰是由私鑰透過橢圓曲線演算法計算得到的。由私鑰計算出公鑰的過程不可逆。
公鑰經過一系列單向的哈希運算和編碼,就得到了我們使用的比特幣地址。
注意,這三者之間的推導關係是單向的,你可以由私鑰計算公鑰,得出對應的位址,而無法由地址逆向算出私鑰。哈希演算法和非對稱密碼學為此提供了安全上的保障。
– 圖源:精通比特幣 –
在早期的比特幣錢包軟體中,每當用戶需要一個新地址時,錢包就會創建一個新的私鑰並產生一個新的地址。用到的位址越多,對應的私鑰就越多。而糟糕的是,這些私鑰彼此之間沒有任何联系,這意味著每一個私鑰都需要備份,這給用戶帶來了極大的不便。在早期,使用者需要定期備份一個叫作「wallet.dat」 檔案。一旦該備份文件遺失,資金將無法找回。
那麼,如何讓不同私鑰之間如何產生連結?助記詞又是如何取代這繁瑣而危險的備份方式的?這一切,得從三個最重要的BIP 說起。
BIP39:助記詞
這是最廣為人知的一個BIP 標準,它的出現大大簡化了私鑰備份的難度。私鑰的形式對於普通人而言過於複雜,用戶很難安全且準確地記錄和輸入那麼一長串字元。而有了BIP39,我們就可以將私鑰轉換為12 或24 個簡單的單字,也可以更方便地在錢包之間匯入匯出。如果你對私鑰具體是如何轉換成助記詞的興趣,可以看這篇文章。
如今,幾乎所有的比特幣錢包都支援了助記詞這項備份形式。然而,光靠助記詞是不夠的。如果私鑰之間並沒有關聯,那就意味著每使用一個新地址,就需要備份一份新的助記詞。這樣的方式看起來並不比備份錢包檔案優雅多少。那麼,目前常用的這些錢包,是如何做到透過一個助記詞管理一大堆錢包位址的呢?
實際上,在助記詞出現之前,一個BIP 已經為此打下了基礎。
BIP32:分層確定性錢包
BIP32 提供了一種方案:透過一個初始的主密鑰 ,按照特定的演算法(密鑰派生函數)可以推導出成千上萬的擴展密鑰對(擴展公鑰和擴展私鑰)。 「分層」 兩個字,已經很好地概括了這個結構的特徵。它就像一棵樹一樣,透過最初的主金鑰衍生出一堆子金鑰,任一子金鑰都可以使用這套演算法繼續往下派生自己的子金鑰。
– 分層確定性錢包圖示 –
如果你對這密鑰派生的技術流程感興趣,可以看看這篇文章:BIP32 拓展密鑰圖解
透過這種分層派生金鑰的方式,我們可以擁有近乎無限的位址。儘管這些擴展密鑰對之間並沒有直接的關聯,但它們都來自於同一個初始密鑰。那麼,如何建立這些擴展密鑰和主密鑰之間的聯繫?派生路徑登場!
派生路徑長這樣:m/0’/0’/0/0/
它清楚地表達瞭如何從最開始的主密鑰計算出具體某一對密鑰的整個過程。在這一串字元中,「m」 代表最初的主密鑰,每一層子密鑰由「/」 分隔開。每一個“/” 代表運行了一輪密鑰派生演算法,斜杠之間的數字就是這一輪密鑰派生演算法的參數,也可以表示密鑰的索引號碼。例如,由主金鑰衍生出的第一個子金鑰為m/0 ,由這個子金鑰衍生出的第一個子金鑰為m/0/0 ,以次類推······其中任何一個數字的改變,都會得出不同的金鑰和位址。派生路徑就像是電腦裡的檔案路徑,告訴你如何找到某個特定的位址。
BIP 32 的出現為錢包的管理帶來了極大的便利,透過一個私鑰可以管理千萬個位址。藉此,使用者可以摒棄先前繁瑣的備份方式。無論透過這種方式產生過多少個金鑰,都可以藉助「派生路徑」 找回來。
到這裡,聰明的讀者會發現:如果只依賴助記詞本身,是無法直接得到某一個具體的地址的。必須加上派生路徑,才能推導出具體的比特幣地址。但是,為什麼在大多數情況下,我只是把助記詞導入到錢包,曾經用過的那些地址就出來了?
標準化的派生路徑功不可沒。
BIP44:為派生路徑定義規範
BIP44 為「派生路徑」 中的每一層都賦予了特定意義,它的形式如下:
m / purpose’ / coin_type’ / account’ / change / address_index
-
purpose:代表該分層確定性錢包遵循的規範。對於比特幣錢包而言,透過這一層的數字,就可以知道最終的比特幣位址類型。
-
coin_type:代表幣種的類型。同一個助記詞可以用於派生不同的加密貨幣錢包,0 代表比特幣,1 代表測試網路上的比特幣,每種密碼學貨幣都有其特定的編號。
-
account:帳戶的索引值,代表目前路徑下的第0 個帳戶、第1 個帳戶、第2 個帳戶·······
-
change:定義該位址是收款地址還是找零地址。 0 代表收款地址,1 代表找零地址。
-
address_index:地址的索引值,代表目前路徑下的第0 個地址、第1 個地址、第2 個地址······
– BIP44 定義下的分層確定性錢包,圖片來源:River –
動手一試
在瀏覽器裡開啟這個網站:https://iancoleman.io/bip39/
利用網站提供的功能隨機產生一個助記詞。
嘗試在“Derivation Path” (派生路徑)這一部分手動更改“Account” 和“External / Internal”(也就是上面提到的“Change”)的值。
當你輸入不同的數值時,可以看到隨著衍生路徑(BIP32 Derivation Path)的變化,產生的錢包位址(Derived Addresses)也會截然不同。
你也可以透過在「Derivation Path」 這一部分切換不同的選項卡(例如BIP49 / BIP84)來改變「purpose」 的值,看看在不同的衍生標準下,產生的位址有何差異。
以下是比特幣錢包中最常用的三種地址派生路徑標準:
BIP44:用於推導P2PKH 位址的衍生路徑標準,即最傳統的以「1」 開頭的比特幣位址,派生路徑為 m/44’/0’/····
BIP49:用於推導P2WPKH-nested-in-P2SH 位址的衍生路徑標準,即以「3」 開頭的隔離見證位址,派生路徑為 m/49’/0’/····
BIP84:用於推導P2WPKH 位址的衍生路徑標準,即以」bc1q「 開頭的原生隔離見證位址,派生路徑為 m/84’/0’/···
正是因為有了這些標準化的派生路徑,錢包們才知道應該跟隨哪條派生路徑來產生位址。這就是為什麼在大多數情況下,用戶只需要匯入助記詞,選擇地址類型,就能找回用過的錢包。
助記詞、分層確定性錢包和標準化派生路徑的組合,使得備份和找回比特幣資產變得前所有未有的方便。所以說:只備份好助記詞,就夠了嗎?
助記詞不是萬靈丹
即便已經有了上述一系列關於錢包的BIP,當你真正需要找回錢包時,僅有助記詞或許仍然是不夠的。不同的錢包在開發時並沒有一個絕對的標準,總是存在一些例外的情況,是單靠助記詞無法挽救的:
-
部分錢包並沒有實施BIP 標準
-
錢包實施了BIP 標準,但與其它錢包不一致
-
實施了一些較新的標準,但採用的錢包很少
這樣的困境並不會因為你避免使用小眾的皮夾而完全消失。
舉個很簡單的例子,如果你使用Electrum 錢包創建了助記詞,當你將這份助記詞導入其它錢包中時,會面臨“助記詞無效” 的尷尬局面。這是因為Electrum 並沒有採用業界通用的BIP39 助記詞標準,而是使用了自己獨特的助記詞系統。
如果你是Ledger 錢包和以太坊的用戶,當你想更換硬體錢包時, Ledger 也會給你上一課。同樣的助記詞導入到其它錢包,會得到完全不一樣的以太坊地址。這是因為Ledger 使用了與其它錢包都不同的派生路徑。如果想找回原來用過的位址,必須手動設定成和Ledger 一樣的路徑。
不同錢包採用不同標準的情況相當常見,常常有人在找回資金的路上犯了難。以致於出現了像 Wallets Recovery 這樣的網站,專門指導用戶如何在不同的錢包裡找回自己的資金。如果你剛好遇到了找回錢包上的困難,也可以去那裡碰碰運氣。
錢包找回指南
回到一開始的問題:如何找回比特幣錢包?換言之:當我們需要找回自己的錢包時,需要哪些東西?
在了解完上文提供的基礎知識後,這個問題的答案已經非常明確了:如果你的比特幣錢包使用了標準化的派生路徑(絕大多數錢包都提供了查看派生路徑的功能),那麼,記住你所使用的地址類型,做好助記詞的備份就足夠了。找回錢包時,軟體會根據你指定的位址類型自動符合衍生路徑的標準,推導出正確的位址。
如果你無法確定目前錢包所使用的衍生路徑是否標準,那麼請一定要備份好助記詞和衍生路徑。有了二者的備份,你總是可以找回自己的資產。
不過,對於那些喜歡嚐鮮特色功能,或是對自我託管有更多訴求的用戶來說,助記詞加派生路徑還不是找回錢包所需的全部。
例外情況
Passphrase (密語)錢包
對於一般使用者來說,最容易出問題的一種情況是使用了密語錢包,而忘了備份密碼短語。
Passphrase,被稱為第25 個助記詞。實際上,它可以是單字、字元、數字、空格,以及這些元素的組合。透過在原有助記詞的基礎上增加這樣一段密碼短語,用戶就可以創建出一套新的錢包帳戶,與原來的錢包完全沒有聯繫,實現一個隱秘的保險庫。這樣,即便助記詞洩漏,資產也不會遺失。在許多安全教學裡,密語錢包也是抵禦「五美金扳手攻擊」 的最佳選擇之一。
如今,密語錢包的用戶群相當廣泛,許多軟硬體錢包都支援了這項功能。如果你選擇使用密語錢包來提升安全性,最應當牢記的一點是:一定要做好密碼短語的備份工作!它和助記詞一樣,是無法透過任何方式找回的。不同的密碼短語對應著完全不同的隱藏錢包,即使只改變原密碼短語中的一個字符,得到的錢包也會截然不同。
一旦弄丟了密碼短語,找回資產如同大海撈針。這比忘記了派生路徑要嚴重得多。
– 圖源:Trezor –
多簽錢包
多簽錢包將比特幣自我託管的安全性提升到了前所未有的高度,在社群中應用相當廣泛。但對於新手用戶而言,使用多籤的過程中也極易犯錯。
以最常見的2-3 多簽為例,對於絕大多數新手來說,一個常見的誤解是:我只需要持有兩把私鑰,就可以拿回屬於我的資產。
這其實是遠遠不夠的。當你丟失了自己的錢包時,僅僅依靠兩把私鑰無法幫助你恢復資產。在私鑰之外,你還需要備份所有參與創建多簽錢包的擴充公鑰。只有依靠這些信息,才可以在任意一款多簽工具中恢復出原來的錢包,並利用手上滿足數量要求的私鑰來花費裡面的資金。
一個更優雅的備份方式是記錄你多簽錢包的描述符。描述符是一段字串,裡麵包含了找回錢包所需的全部信息,可以用它來代替擴展公鑰的備份,簡化備份操作。目前主流的比特幣錢包軟體都增加了對描述符的支援。
另外,一些錢包最近也添加了對 BIP129(比特幣安全多重簽名設置,BSMS)的支持,它會在你創建多簽錢包後給你一個BSMS 文件。類似於描述符,這個文件包含了關於恢復多簽錢包所需的全部信息,在任何支援的錢包導入該文件,也可以恢復多簽錢包。 BSMS 的出現,就是為了在不同皮夾之間提供一個標準化的多簽設定流程。
關於如何用好比特幣多簽錢包,這裡有一個非常詳細的指南可供實踐。
BIP85
BIP85 是一種利用助記詞來衍生助記詞的新穎方案,目前已有少數錢包支援。有了BIP85,用戶利用一套助記詞加上索引號(index),即可衍生出確定性的新助記詞。只要索引號碼不變,派生出的助記詞就不會改變。利用此功能創建出來的子助記詞之間互無關聯,也無法逆向推導出主助記詞。 BIP85 常用於簡化助記詞的管理:當遇到各種需要創造新助記詞的場景時,BIP85 可以大幅簡化助記詞的備份工作。
– BIP85 助記詞派生方案 –
如果你使用了由BIP85 衍生的子助記詞,記得備份好對應的索引號碼。和密碼短語類似的是,索引號碼也是獨一無二的。
非標準的助記詞形式
少數錢包為用戶提供了非標準助記詞的選擇,藉以實現獨特的功能。
上文提到的Electrum 是個很典型的案例。 Electrum 有自己獨特的助記詞版本系統,它在助記詞內融合了版本號(Version Number),版本號用於指導錢包如何透過助記詞衍生出私鑰和地址。因此,在Electrum 的助記詞系統裡,使用者需要備份的只有助記詞,助記詞本身已經包含了關於如何派生地址的一切資訊。然而,這特定類型的助記詞只能用於Electrum 錢包,無法與其它錢包相容。因此,當你決定使用Eletctum 創建的錢包助記詞時,請做好一直使用Electrum 錢包或未來遷移資產的打算。 (註:Electrum 支持導入標準的BIP39 助記詞,但不提供長期支持此類助記詞的保證。)
另一種常見的非標準助記詞形式就是SLIP39(Shamir 金鑰分割方案)。利用此方案,用戶可以創建多份助記詞分片,只需要持有指定金額的分片,即可恢復出錢包。以3/5 的Shamir 密鑰分割方案為例:在創建錢包的時候會產生5 份助記詞分片,用戶將這些分片分開保存。當需要恢復錢包時,需要湊齊其中的3 份分片,才可以恢復出錢包。這個備份方案提供了更多的冗餘,避免了助記詞遺失/被盜的單點故障。如果你選擇了這個備份方案,請記住:Shamir 金鑰分割方案產生的助記詞分片和標準的BIP39 助記詞無法互相轉換。因此,當你需要恢復自己的助記詞時,只能挑選支持該方案的錢包工具。而目前僅有少數幾款軟硬體錢包支援了Shamir 備份。
此外,五花八門的非標準方案還有很多,由於受眾過少,本文不再詳述。
總結
對於任何一個持有比特幣的人來說,都應該花點時間了解這些錢包相關的基礎知識。已經有太多因為備份不當而導致資產遺失的慘痛案例了。
如果你還是新手,請使用支援標準助記詞和衍生路徑的錢包,這可以幫你避免絕大部分坑。如果你已經有了一定的經驗積累,想嘗試一些複雜的方案來獲得更高的安全性。那麼,搞清楚它們背後運作的機制非常重要,請熟悉你所使用的工具後再轉入資產。享受這些進階方案所提供的附加優點的同時,做好必要的備份工作,避免悲劇發生。
感謝 @AurtrianAjian 對本文部分細節的修正。