BTC比特幣HD錢包開發教程1|簡單知識
我們今天 來看看開發BTC 的HD錢包。
我們先來看看什么是HD錢包。
HD 錢包,即分層確定性錢包,我們知道數字錢包是用來保存我們的密鑰和地址的,而數字貨幣是被記錄在區塊鏈網絡中的每個區塊上的。因此,如何安全方便的生成、保存和備份恢復密鑰才是錢包的關鍵。為此,錢包已經進化了三次,從最初的非確定(隨機)錢包到第二代的確定性(種子)錢包,直到現在的分層確定性錢包,錢包的更新迭代經過了三個階段。
比特幣最早的客戶端(Satoshi client)就是非確定性錢包,錢包是一堆隨機生成的私鑰的集合。 客戶端會預先生成 100 個隨機私鑰,並且每個私鑰只使用一次。每個交易使用一個地址的概念是中本聰提出的。如果交易比較頻繁,私鑰可能會用光,然后再產生一批私鑰,所以每次完成 100 個交易后,你必須備份新的 wallet.dat 文件,否則可能會丟失資產。這種錢包難以管理和備份。如果你生成很多私鑰,你必須保存它們所有的副本。這就意味着這個錢包必須被經常性地備份。每個私鑰都必須備份,否則一旦錢包不可訪問時,無法找回錢包。
確定性錢包則不需要每次轉賬都要備份,確定性錢包的私鑰是對種子進行單向哈希運算生成的,種子是一串由隨機數生成器生成的隨機數。在確定性錢包中,只要有這個種子,就可以找回所有私鑰,只需備份種子就相當於備份您的所有錢包,所以這個種子也相當重要,一定要備份到安全的地方。
分層確定性的概念早在 BIP32 提案提出。根據比特幣核心開發者 Gregory Maxwell 的原始描述和討論,Pieter Wuille 在2012 年 02月 11日整理完善提交 BIP32 。直到 2016年 6月 15 日 才被合並到 Bitcoin Core,目前幾乎所有的錢包服務商都整合了該協議。BIP32 是 HD 錢包的核心提案,通過種子來生成主私鑰,然后派生海量的子私鑰和地址,但是種子是一串很長的隨機數,不利於記錄,所以我們用算法將種子轉化為一串助記詞 (Mnemonic),方便保存記錄,這就是 BIP39,它擴展了 HD 錢包種子的生成算法。BIP43 對 BIP32 樹結構增加了子索引標識 purpose 的擴展 m/purpose'/ * 。 BIP44 是在 BIP43 和 BIP32 的基礎上增加多幣種,通過 HD 錢包派生多個地址,可以同時管理主網和測試網的比特幣,BIP44 提出了5層的路徑建議,如下:
*m/purpse'/coin_type'/account'/change/address_index*,
BIP44的規則使得 HD 錢包非常強大,用戶只需要保存一個種子,就能控制所有幣種,所有賬戶的錢包。
如下圖:
所以簡單來說,HD錢包產生的步驟如下 :
\1. 生成一個助記詞(參見 BIP39)
\2. 該助記詞使用 PBKDF2 轉化為種子(參見 BIP39)
\3. 種子用於使用 HMAC-SHA512 生成根私鑰(參見 BIP32)
\4. 從該根私鑰,導出子私鑰(參見 BIP32),其中節點布局由BIP44設置