天天看點

教你如何正确使用HD Wallets

參考位址:https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki

教你如何正确使用HD Wallets

原理簡介:

1.生成HD Wallets錢包的時候除了會生成

主私鑰

(master private key)和

主公鑰

(master public key),還會生成一個

chain code

2.利用master private key + chain code可以得到指定的

子私鑰

(sub private key);

3.利用 master public key + chain code可以得到指定的

子公鑰

(sub-public key);

4.為了友善起見,HD Wallets引入了

extended

的概念,以友善使用。即:

擴充型私鑰extended private key包含了private key和chain code

擴充型公鑰extended public key包含了public key 和 chain code

5.每個private/public key可以派生出2^32個sub-private/public key,編号用

index

表示。而所有派生出來的sub-private/public keyy可以繼續派生2^32個sub-sub private/public key,一直持續下去…… 這就有了層級(

dept

)的概念。

6.編号(index)和層級(dept)就構成了路徑(

PATH

),就像我們的檔案夾路徑,不過這裡的節點名都是數字。m(根節點)的派生出來的子節點的路徑是m/0到m/2^32-1,而m/0派生出來的子節點是m/0/0到m/0/2^32-1 。

7.從上面幾點很容易了解,假設要得到m/0/0的公鑰,隻需要m/0的公鑰即可,而非一定需要m的公鑰(即主公鑰),私鑰同理。

HD Wallets的進階使用方法BIP44

BIP44參考位址:

https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki

BIP44隻是一個規則,它提出了5層的路徑建議,如下:

m/purpse’/coin_type’/account’/change/address_index

各層的意義如下:

1.

Purpose

:确定路徑規則,BIP44一般預設為44’index為0x8000002C(即2^31-1+44)

2.

Coin_type

:币種,一般推薦0’表示Bitcoin。【其他币種也可以使用的,隻不過在從公鑰(public key)生成位址(Address)的時候算法不同而已。】

3.

Account

:顧名思義,是賬戶的意思。從0’開始。可以了解為Bitcoin-QT中的錢封包件。

4.

Change

:找零。一般使用0對外收款,1接受每次交易的找零

5.

Address_index

:位址索引

BIP44的規則使得HD Wallets非常強大。使用者隻需要儲存一個主私鑰,就能控制所有币種,所有賬戶的錢包。

Account(賬戶)可以有熱賬戶也可以有冷賬戶。Account各自有自己的“Account主私鑰”和“Account主公鑰”(例:m/44’/0’/0’)

如果給某個網站收錢或第三方監管,僅需提供Account主公鑰和chain code即可,而不需要提供HD Wallets主公鑰(master public key),其他的Account的位址如果沒有發生過簽名,那麼依然是冷錢包(冷的Account)。

BIP44的第4層也為找零機制提供了很好的支援。在支援找零機制的情況下,隻要使用者不使用同一位址多次收款,那就完全可以避免同一個私鑰多次簽名的情況發生。也就沒有了私鑰暴露的風險。

安全性問題

1. 網上有人談論到HD Wallets如果洩露一個子私鑰和主公鑰就能推算出主私鑰,導緻整個HD Wallets會被暴露。關于這個問題,早就已經有解決方案了:

a) 早在2014年01月15日BIP32就已經引入了

hardened keys

的概念,并增加了明确的轉換算法。Hardened keys即index>=0×80000000 (index>=2^31)。引入的目的就是為了防止由子私鑰倒推出父私鑰。

b) 上面講述BIP44的時候,推薦的5層總有3層采用了hardened keys

c) BIP44提供了Account的概念,使用過程中不用提供master public key,隻需要提供Account的public key就能管理整個Account下面的位址。而且這樣更能結算計算其子位址和公鑰的時間。如果***掌握了這個Account中的一個子私鑰和Account主公鑰,那麼也隻能獲得本Account的控制權,而無法獲得其他Account的控制權。

2. 有朋友也提到一個私鑰如果多次簽名使用重複的“

随機數

”會有私鑰洩露的風險,以此來證明HD Wallets的風險比其他wallet大。這個問題,很早以前就有人提出過。這裡想說一下幾點:

a) 随機數的問題已經越來越收到人們的重視,軟體級别的解決方案一般是采用

RFC6979

算法,或者外部裝置采集(觸摸屏或滑鼠采集運動軌迹,攝像頭采集畫面,麥克風采集聲音,陀螺儀采集姿态和運動軌迹等等);硬體級别一般采用RNG和晶振來共同完成,這種方案采集噪音、溫度、電壓等外界因素得出。這些都可以有效的避免“随機數”的重複;

b) 利用找零機制可以有效防止位址/私鑰的重複使用。這一點上HD Wallets的表現是卓越的。類似Bitcoin-QT的錢包,在生成錢包的時候會生成若幹數量位址(ECKey即公私鑰對),當長期使用後,位址使用完了會再建立一些新的位址(ECKey即公私鑰對),如果此時沒有及時更新備份,那麼很有可能就丢失了這些先位址的比特币。而HD Wallets不存在這種問題。

以上是本人對HD Wallets的膚淺了解。工科生天生文筆不好,各位看客多多海涵。不對之處歡迎拍磚!

币定行葉桂平

2014年11月14日

轉載于:https://blog.51cto.com/norman20000/1767105

繼續閱讀