比特幣的HD錢包演化-3
通過前面兩篇文章,我們認識到比特幣的所有權是通過私鑰來確定的。
那麼我們就在此基礎上研究比特幣錢包的構成。廣義上,錢包是一個應用程式,為使用者提供互動介面。錢包控制使用者訪問許可權,管理金鑰和地址,跟蹤餘額以及建立和簽名交易。 狹義上,比特幣錢包的核心就是對私鑰的管理。
在比特幣的歷史發展中,錢包大致經過了三次進化:
-
非確定性(隨機)錢包
-
確定性(種子)錢包
-
分層確定性錢包(HD Wallets (BIP-32/BIP-44))
下面我們就好好說說錢包的歷史發展軌跡:
非確定性(隨機)錢包
在比特幣剛誕生時,Bitcoin Core客戶端實現了第一個錢包功能,當時因為早期的使用者並不多且都是專業人士,錢包只是隨機生成的私鑰集合。這種型別的錢包被稱作零型非確定錢包。具體的實現細節就是: 比特幣核心客戶端預先生成100個隨機私鑰,從最開始就生成足夠多的私鑰並且每個金鑰只使用一次;
這樣做的缺點十分明顯:
如果你生成很多私鑰,你必須儲存它們所有的副本。這就意味著這個錢包必須被經常性 地備份。每一個金鑰都必須備份,否則一旦錢包不可訪問時,錢包所控制的資金就付之東流。這種情況直接與避免地址重複使用的原則相沖突——每個比特幣地址只能用一次交易。地址重複使用將多個交易和地址關聯在一起,這會減少隱私。
當比特幣使用者群逐漸擴大時,不少人因為隨機生成的100個私鑰用完後,沒有備份老錢包,生成新的私鑰後原先的錢包棄用,造成了未花費幣的丟失。現在看看是個不可思議的幼稚的BUG,但是在比特幣蠻荒時代,這種漫不經心的錯誤導致的丟幣比比皆是。
確定性(種子)錢包
比特幣私鑰可以用任意方法生成,自然也可以通過一個隨機短語進行多次hash得到不同的私鑰。這種思路下,社群提出了確定性(種子)錢包的方案。
確定性,或者“種子”錢包包含通過使用單項離散函式而可從公共的種子生成的私鑰。種子是隨機生成的數字。在確定性錢包中,種子足夠恢復所有的已經產生的私鑰,所以只用在初始建立時的一個簡單備份就足以搞定。並且種子也足夠讓錢包匯入或者匯出。這就很容易允許使用者的私鑰在錢包之間輕鬆轉移。
比如,我們上一篇文章中用 satoshi
作為種子,得到SHA256(‘satoshi’)作為私鑰,完全可以繼續用SHA256(SHA256(‘satoshi’))…這樣推導下去得出更多的私鑰,同時,只需要記住 satoshi
這個種子,就可以方便的匯入匯出私鑰。更進一步,可以加入password和更多的混淆短語,提高私鑰生成的健壯性。
這種方案提出後,因為簡單易行,多個輕錢包都做了自己的實現;雖然原理相似,但是他們之間並不通用,所以不同的錢包私鑰匯入匯出還有一些不方便。社群就在此基礎上繼續探索,最終整理形成了BIP32、BIP39、BIP43,BIP44等規範,創造了我們今天通用的HD錢包。
分層確定性錢包(Hierarchical Deterministic wallet—HD Wallet)
首先用一張經典的圖來描述HD錢包的私鑰生成:
~~待續