201711152011HD Wallet 分層確定性(Hierarchical Deterministic)錢包

錢包的類型:不同的私鑰生成方法,也對應著不同的錢包結構,通常可以分為:非確定(隨機性)性錢包和確定性(種子性)錢包。

隨機(非確定 nondeterministic)性錢包

【非確定性錢包】比特幣最早的用戶端(Satoshi client)就是非確定性錢包。這種所謂 [Type0_wallet] (原型錢包),錢包就是一堆隨機生成的私密金鑰的集合。用戶端會預先生成 100 個隨機私密金鑰,並且每個私密金鑰只使用一次。每個交易使用一個位址的概念是中本聰提出的。如果交易比較頻繁,私密金鑰可能會用光,然後再產生一批私密金鑰,這種錢包難以管理和備份。這類型錢包被戲稱為 "Just a Bunch Of Keys," or JBOK,且因為繁瑣的備份、難以匯入、交易隱私密性(Address re-use reduces privacy by associating multiple transactions and addresses with each other.)等問題、逐漸被使用者揚棄,轉而被 deterministic wallets 所取代。

 

確定性(Seeded)錢包

【確定性錢包】確定性錢包的私密金鑰是對種子進行單向雜湊運算生成的,種子是一串由亂數產生器生成的亂數。在確定性錢包中,只要擁有種子,就能找回所有金鑰。因此只需備份種子,就完成所有錢包的備份。所以這個種子相當重要,一定要做好安全的備份。
Deterministic, or "seeded" wallets are wallets that contain private keys that are all derived from a common seed, through the use of a one-way hash function. The seed is a randomly generated number that is combined with other data, such as an index number or "chain code" (see [hd_wallets]) to derive the private keys. In a deterministic wallet, the seed is sufficient to recover all the derived keys, and therefore a single backup at creation time is sufficient. The seed is also sufficient for a wallet export or import, allowing for easy migration of all the user’s keys between different wallet implementations.

什麼是 HD 錢包
 HD 是 Hierarchical Deterministic(分層確定性)的縮寫。所謂分層,就是一個大公司可以為每個子部門分別生成不同的私密金鑰,子部門還可以再管理子子部門的私密金鑰,每個部門可以看到所有子部門裡的幣,也可以花這裡面的幣。也可以只給會計人員某個層級的公開金鑰,讓他可以看見這個部門及子部門的收支記錄,但不能花裡面的錢,使得財務管理更方便了。

分層確定性的概念早在 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 錢包相比傳統的比特幣錢包,HD錢包提供了一些好處:

1. 備份更容易

傳統錢包的問題是一個錢包可能存有一堆金鑰位址,每個位址都有一些比特幣。這樣備份錢包的時候,需要備份所有的金鑰。但如果之後生成了一個新位址,你就需要重新備份一次。事實上,每次生成新位址的時候,你都需要做一次備份。 HD錢包允許你從一個主(根)金鑰創建海量的子金鑰。這意味著,一旦你控制了主金鑰,你就可以生成所有的子金鑰,主金鑰和子金鑰形成樹狀結構。所以你就不需要頻繁的備份錢包,你只需要在創建錢包的時候備份一次就可以了,因為你可以從主金鑰重新創建所有的子金鑰。

2. 私密金鑰離線存放更安全

HD錢包還帶來了一些新特性,比如不需要任何私密金鑰,就可以從一個父公開金鑰生成所有的子公開金鑰。具體來說,你的主私密金鑰是以紙錢包的方式備份的,並且離線存放在一個安全的地方。你手頭有主公開金鑰,用這個公開金鑰,你就可以生成所有的子公開金鑰。 舉個實際的例子,我們要開一個網店,接受比特幣付款。你可以離線存放你的私密金鑰,只把公開金鑰放在公網的伺服器上。你的網站可以使用這個公開金鑰為網站上的每一個商品生成一個收款位址,或者給你的每個顧客生成一個唯一的位址,甚至為每次交易生成一個位址(如何使用,取決於你的想像)。 並且因為私密金鑰是離線存放的,沒人可以黑進你的伺服器偷走比特幣。

3. 許可權控制

HD錢包有個額外好處,它讓你可以控制你的組織裡誰可以控制哪些金鑰。 和一個商業組織的組織結構類似,HD錢包也是以樹形結構組織金鑰的。你可以給你的組織裡的每個分支部門創建金鑰,把私密金鑰交給這個分支部門,這個部門就可以花它的分支上的幣,而你,因為有主私密金鑰,所以你可以看到並花費整個樹上的幣。

4. 使用單個位址錢包,你的所有交易都將與單個位址相關聯,由於區塊鏈所有的交易記錄都是公開的,所以任何人都可以看到看到每個位址的所有交易記錄以及帳戶餘額。HD 錢包通過在發送和接收資金時能夠生成新地址,大大提高隱私性,使你的交易難以追蹤。

5.HD 錢包是生成不重複使用位址的方法 ,記住一個種子就可以訪問所有位址的錢而不需要每個位址都備份私密金鑰。HD 錢包可以讓一個錢包同時管理多資產成為可能性。

比特幣 HD 錢包是如何生成的?
1. 生成一個助記詞(參見 BIP39)
2. 該助記詞使用 PBKDF2 轉化為種子(參見 BIP39)
3. 種子用於使用 HMAC-SHA512 生成根私密金鑰(參見 BIP32)
4. 從該根私密金鑰,匯出子私密金鑰(參見 BIP32),其中節點佈局由BIP44設置
可以看出 BIP39 生成助記詞的過程非常重要, 大家肯定關心 BIP39 的安全性,如果一個 HD 錢包助記詞是 12 個單詞,一共有 2048 個單詞可能性,如何算出隨機的生成的助記詞所有可能性是一個排列問題,根據公式: n!/( n - r )! ,既 2048!/(2048-12)! =5.2715379713014884760003093175282 e+39 。
我們可以舉個類比,地球上的沙子數量在大約是1 後面 18 個零。如果你可以每秒生成 一百萬個助記詞,那麼一年可以生成 1000000*60*60*24*365=3.1536e+13,大約需要1.6715937e+26 年遍歷所有助記詞,這是多少年呢?

原理簡介:
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的公開金鑰(即主公鑰)。私鑰同理。

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不存在這種問題。

BIP44參考地址:https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki

----------------

乙太坊目前解決方案
乙太坊在 EIP84 討論,是否遵循 BIP32 和 BIP44,社區裡提出來很多有意思的觀點,比特幣是基於 UTXO 的,所以可以使用 HD 錢包(BIP32)為每個交易分配一個新位址,以保護您的隱私。然而,乙太坊是基於帳戶,每個帳戶都有一個位址,BIP 是比特幣的提案,而且比特幣的資料結構的設計是圍繞改變位址的想法構建的,BIP 的一些提案可能並不適合乙太坊。

乙太坊的模式和比特幣UTXO 不同,乙太坊轉帳不能改變位址,如果在乙太坊上實現 UTXO ,用戶還必須簽名兩個交易以將餘額的一部分發送到一個位址,將餘額的一部分發送到第二個地址 - 這將使成本增加一倍,而且第二個交易可能不會在同一個區塊中,當然乙太坊也可以通過智慧合約的方式實現。另外,乙太坊目前官方錢包採用 KDF 的形式,也就是我們常說的 Keystore 的形式。
在 EIP85 的討論,乙太坊社區似乎預設也採用了 BIP32 的做法,先來說一說 BIP32 的好處
1. 使用時間長,已經接受社區審查
2. 已經有多個程式設計語言的實現
3. 多個硬體錢包正在使用
4. 可以一個錢包,同時支援比特幣和乙太坊
EIP85 提議 HD 路徑為 : m/44'/60'/a'/0/n
這裡 的 a 表示帳號,n 是第 n 生成的位址,60 是在 SLIP44 提案中暫定的,因為 BIP44 只定義到 0 - 31。
目前已知乙太坊用戶端的具體實現:
• m/44'/60'/0'/0/x: BIP44,imToken(可以自訂路徑),MetaMask,Jaxx,MyEtherWallet,TREZOR,Exodus
• m/44'/60'/x'/0/0:BIP44,KeepKey,MetaMask
• m/44'/60'/0'/x:Electrum,Ledger Chrome App,
• m/44'/coin_type'/account'/0:Coinomi

【註】Mnemonic 助記詞

Mnemonic codes are English word sequences that represent (encode) a random number used as a seed to derive a deterministic wallet. The sequence of words is sufficient to re-create the seed and from there re-create the wallet and all the derived keys. A wallet application that implements deterministic wallets with mnemonic code will show the user a sequence of 12 to 24 words when first creating a wallet. That sequence of words is the wallet backup and can be used to recover and re-create all the keys in the same or any compatible wallet application. Mnemonic code words make it easier for users to back up wallets because they are easy to read and correctly transcribe, as compared to a random sequence of numbers.

Mnemonic codes are defined in Bitcoin Improvement Proposal 39 (see [bip0039]). Note that BIP0039 is a draft proposal and not a standard. Specifically, there is a different standard, with a different set of words, used by the Electrum wallet and predating BIP0039. BIP0039 is used by the Trezor wallet and a few other wallets but is incompatible with Electrum’s implementation.

【出處】

http://www.8btc.com/hd-wallets

https://zhuanlan.zhihu.com/p/30297080

http://www.8btc.com/how-to-use-hd-wallets

http://bitcoinbook-builds.mkvd.net/translations/zh_TW/chapter-4.html

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

回應
Reading
累積 | 今日
loading......
關鍵字
即時新台幣匯率