分層確定性錢包BIP的原理解析
BIP 全名是 Bitcoin Improvement Proposals,是提出Bitcoin 的新功能或改進(jìn)措施的文件??捎扇魏稳颂岢觯?jīng)過審核后公布在bitcoin/bips 上。
BIP32:定義 Hierarchical Deterministic wallet(簡稱“HD Wallet”,”分層確定性錢包”),是一個(gè)系統(tǒng)可以從單一個(gè) seed 產(chǎn)生一樹狀結(jié)構(gòu)儲存多組keypairs(私鑰和公鑰)。好處是可以方便的備份、轉(zhuǎn)移到其他相容裝置,以及分層的權(quán)限控制等。這種母鑰匙可以生成子鑰匙的序列。這些子鑰匙又可以衍生出孫鑰匙,以此無窮類推。
BIP32提出,可以以特定規(guī)則生成私鑰,這樣只需要存儲少量“種子”,就能推算出無數(shù)個(gè)可用私鑰,它的實(shí)現(xiàn)稱為“分層確定性錢包”。是HD的核心HD Wallets因其只需要一個(gè)主(根)私鑰,就能生成海量子私鑰,這個(gè)特性廣受歡迎,越來越多的解決方案和企業(yè)開始支持或采用HD模型來進(jìn)行私鑰管理。HD模型的最大優(yōu)點(diǎn)是不使用私鑰就能生成大量的由您掌握的地址,其原理就在于直接通過主公鑰就可以生成任意數(shù)量的子公鑰,整個(gè)過程無需訪問主私鑰。這個(gè)特性有如下好處:
· 備份容易,只需備份主私鑰,新增地址無需再次備份私鑰;
· 保證主私鑰的冷存儲,無論新增多少個(gè)地址,僅需主公鑰就能完成,無需主私鑰介入;
· 方便的第三方審計(jì),只需給第三方機(jī)構(gòu)或會計(jì)提供主公鑰,他就可以看到所有下級地址的交易,但又不能花費(fèi)任何幣(因?yàn)闆]有子私鑰);
BIP39標(biāo)準(zhǔn)就是為了解決助記詞的需求,通過隨機(jī)生成12~24個(gè)容易記住的單詞,單詞序列通過PBKDF2與HMAC-SHA512函數(shù)創(chuàng)建出隨機(jī)種子作為BIP32的種子。
BIP39生成助記詞過程:
· 生成一個(gè)長度為128~256 位(bits) 的隨機(jī)序列(熵);
· 取熵哈希后的前n 位作為校驗(yàn)和(n= 熵長度/32),就可以創(chuàng)造一個(gè)隨機(jī)序列的校驗(yàn)和;
· 將校驗(yàn)和添加在隨機(jī)序列(熵)的末尾;
· 將序列化分為包含11位的不同部分;
· 將每個(gè)包含11位不分的值與一個(gè)已經(jīng)預(yù)先定義2048個(gè)單詞的字典作對應(yīng);
· 生成的有順序的單詞組就是助記詞。
在上面的例子中,我們選取了長度為128位的熵,來生成了有12個(gè)單詞的助記碼。在實(shí)際的應(yīng)用中,熵的長度越長,校驗(yàn)碼的長度和助記詞的長度也會相應(yīng)的增長。下圖展示了熵?cái)?shù)據(jù)的大小和助記詞的長度之間的關(guān)系:
步驟一:隨機(jī)序列的長度為【128,160,192,224,256】。(熵一定是32的倍數(shù),so熵是16進(jìn)制數(shù)的序列)
步驟二:校驗(yàn)和的長度為【4,5,6,7,8】。(熵/32=校驗(yàn)和)
步驟三+步驟四:隨機(jī)序列一定是11的倍數(shù),平均劃分為不同的11位倍數(shù)。
步驟五:與2048個(gè)單詞的預(yù)定義字典作對應(yīng)。
步驟六:生成助記詞的數(shù)量:(熵+校驗(yàn)和)/11=助記詞的數(shù)量。
BIP43提出了BIP32的一個(gè)規(guī)范(或者說是限制),因?yàn)锽IP32過于自由,使基于BIP32的各種應(yīng)用總是互相不能兼容。是32增加了域的擴(kuò)展。
BIP44是BIP43的一個(gè)特殊應(yīng)用,一個(gè)特點(diǎn)是能夠包容更多賬戶(幣種),是在43和32的基礎(chǔ)上增加多幣種,例如你一個(gè)HD的錢包可以同時(shí)管理主網(wǎng)和測試網(wǎng)的比特幣。
BIP0043提出使用第一個(gè)強(qiáng)化子索引作為特殊的標(biāo)識符表示樹狀結(jié)構(gòu)的“purpose”。基于BIP0043,HD錢包應(yīng)該使用且只用第一層級的樹的分支,而且有索引號碼去識別結(jié)構(gòu)并且有命名空間來定義剩余的樹的目的地。舉個(gè)例子,HD錢包只使用分支m/i‘/是為了表明那個(gè)被索引號“i”定義的特殊為目地。
在BIP0043標(biāo)準(zhǔn)下,為了延長的那個(gè)特殊規(guī)范,BIP0044提議了多賬戶結(jié)構(gòu)作為“purpose”。所有遵循BIP0044的HD錢包依據(jù)只使用樹的第一個(gè)分支的要求而被定義:m/44’/。
BIP0044指定了包含5個(gè)預(yù)定義樹狀層級的結(jié)構(gòu):
m / purpose‘ / coin_type’ / account‘ / change / address_index
第一層的目的地總是被設(shè)定為44’。第二層的“coin_type”特指密碼貨幣硬幣的種類并且允許多元貨幣HD錢包中的貨幣在第二個(gè)層級下有自己的亞樹狀結(jié)構(gòu)。目前有三種貨幣被定義:Bitcoin is m/44‘/0’、Bitcoin Testnet is m/44‘/1’,以及Litecoin is m/44‘/2’。
樹的第三層級是“account”,這可以允許使用者為了會計(jì)或者組織目的,而去再細(xì)分他們的錢包到獨(dú)立的邏輯性亞賬戶。舉個(gè)例子,一個(gè)HD錢包可能包含兩個(gè)比特幣“賬戶”:m/44‘/0’/0‘ 和m/44’/0‘/1’。每個(gè)賬戶都是它自己亞樹的根。
第四層級就是“change”。每一個(gè)HD錢包有兩個(gè)亞樹,一個(gè)是用來接收地址一個(gè)是用來創(chuàng)造找零地址。注意無論先前的層級是否使用是否使用強(qiáng)化衍生,這一層級使用的都是常規(guī)衍生。這是為了允許這一層級的樹可以在可供不安全環(huán)境下,輸出擴(kuò)展的公共鑰匙。被HD錢包衍生的可用的地址是第四層級的子級,就是第五層級的樹的“address_index”。比如,第三個(gè)層級的主賬戶收到比特幣支付的地址就是M/44‘/0’/0‘/0/2。表4-9展示了更多的例子。