區(qū)塊鏈錢包-hd錢包的奧秘與實(shí)現(xiàn)原理
錢包發(fā)展
在比特幣早期,中本聰就提出了每次交易使用一個地址這個概念,即假設(shè)你A地址上有100塊,那么你向B地址轉(zhuǎn)賬20塊之后,你剩下的80塊會轉(zhuǎn)入C地址,A地址徹底棄用,這樣意味著A私鑰也徹底棄用了。在早期的非確定性錢包,會一次性為用戶生成100個私鑰/地址對,使用完再繼續(xù)生成,可想而知,這樣管理資產(chǎn)非常麻煩。在這種背景下,有人提出了確定性錢包的概念,只要有一個種子,就能派生出海量的私鑰/地址對,妥當(dāng)保管好種子,就能完全掌控整個派生樹,而HD錢包就是目前最常用的確定性錢包模型。
HD是Hierarchical-Deterministic(分層確定性)的縮寫,這個概念是在BIP32中被首次提出。這里的分層可以理解成,一個大公司擁有一個種子,它可以為各個子部門派生子私鑰,各個子部門又可以給子子部門派生子子私鑰…
這樣做有很多好處:
○ 樹狀特征非常適用于有組織結(jié)構(gòu)的公司使用
○ 每個父能看到自己派生的子的財(cái)務(wù)流向,而子不能看到父
○ 能夠在不需知道私鑰的前提下生成大量的公鑰,非常適用于只負(fù)責(zé)收款的服務(wù)
Tips!
principle of avoiding address reuse: 提倡避免地址重復(fù)使用,當(dāng)數(shù)字貨幣地址已經(jīng)發(fā)生過一次轉(zhuǎn)賬就存在私鑰泄漏的可能性。
BIP: Bitcoin Improvement Proposals(比特幣改進(jìn)提案),比特幣是開源項(xiàng)目,所有人都可以給核心開發(fā)者提出建議。詳見BIP項(xiàng)目地址:bips
種子與助記詞
本質(zhì)上,種子是一個數(shù)字,不方便記憶。
在BIP39中,提出了助記詞方案來試圖解決種子的存放問題。它的核心是通過隨機(jī)生成 12 ~ 24 個容易記住便于抄錄的單詞,再由該單詞序列通過 PBKDF2 與 HMAC-SHA512 函數(shù)創(chuàng)建出隨機(jī)種子作為 BIP32 的種子。它有幾個特性:
○ 規(guī)定熵的位數(shù)必須是 32 的整數(shù)倍,所以熵的長度取值位 128 到 256 之間取 32 的整數(shù)倍的值,分別為 128, 160, 192, 224, 256;
○ 校驗(yàn)和的長度為熵的長度/32 位, 所以校驗(yàn)和長度可為 4,5,6,7,8 位;
○ 助記詞庫有 2048 個詞,用 11 位可全部定位詞庫中所有的詞,作為詞的索引,故一個詞用 11 位表示,助記詞的個數(shù)可為 (熵+校驗(yàn)和)/11,值為 12,15,18,21,24。
作為創(chuàng)建錢包的第一步,下面將以目前常用的128強(qiáng)度為例,簡單闡述下生成助記詞的過程:
1. 隨機(jī)生成一個16字節(jié)的熵;
2. 對熵進(jìn)行哈希計(jì)算,得到一個長度為32的數(shù)組;
3. 取熵的比特位,得到一個長度為128的數(shù)組;
4. 將熵hash前4比特作為校驗(yàn)位放于熵比特?cái)?shù)組之后,得到一個長度為132的數(shù)組;
5. 以長度11切割第4步得到的數(shù)組,并轉(zhuǎn)為10進(jìn)制,得到12個數(shù);
6. 以數(shù)字為序號,從助記詞庫取出對應(yīng)的單詞,得到助記詞。
以下為一個示例實(shí)現(xiàn):
在得到助記詞之后,根據(jù)BIP39,我們將使用PBKDF2函數(shù)推算出根種子,其約定的參數(shù)如下:
1. 將助記詞序列作為密碼
2. “mnemonic” + passphrase 作為鹽
3. 以 2048 為重復(fù)計(jì)算的次數(shù)
4. 以 HMAC-SHA512 為隨機(jī)算法
5. 期望得到長度為512位(64字節(jié))的密鑰作為種子
主密鑰與主鏈碼
得到種子之后,我們需要通過種子推導(dǎo)出主密鑰 (master key) 和主鏈碼 (master chain code)。
根種子通過不可逆 HMAC-SHA512 算法推算出 512 位的哈希串,左 256 位是 Master Private key(m), 右 256 位是 master chain code, 通過 m 結(jié)合推導(dǎo)公鑰的橢圓曲線算法能推導(dǎo)出與之對應(yīng)的 264 位 master public Key (M)。chain code 作為推導(dǎo)下級密鑰的熵。
Tips!
什么是擴(kuò)展密鑰?
密鑰和鏈碼的結(jié)合統(tǒng)稱為擴(kuò)展密鑰 (Extended keys)。即256位的密鑰和256位的鏈碼串聯(lián)起來的512位就是擴(kuò)展密鑰。
包含私鑰的擴(kuò)展密鑰用以推導(dǎo)子私鑰,從子私鑰又可推導(dǎo)對應(yīng)的公鑰和比特幣地址。
包含公鑰的擴(kuò)展密鑰用以推導(dǎo)子公鑰。
擴(kuò)展密鑰使用Base58Check算法加上特定的前綴編碼,編碼得到的包含私鑰的前綴為xprv,包含公鑰的擴(kuò)展密鑰前綴為xpub,相比比特幣的公私鑰,擴(kuò)展密鑰編碼之后得到的長度為512或513位。
路徑
當(dāng)獲得了主密鑰和主鏈碼之后,我們需要設(shè)計(jì)一套規(guī)則來推導(dǎo)子密鑰和子鏈碼以供交易使用。其中有個重要的概念就是路徑。
路徑是一套索引規(guī)范?,F(xiàn)在我們假設(shè)整個HD錢包是一顆樹,將主密鑰視為樹干,子私鑰視為葉子,那么路徑就可以視為葉子的坐標(biāo),可以準(zhǔn)確的描述出葉子相對于樹干的位置。
在比特幣社區(qū)的BIP44協(xié)議中,提出了目前常用的5層路徑建議,如下:m/purpse’/coin_type’/account’/change/address_index
每一層都有特別的含義,分別是:
1. purpse:目前固定為44’(或者0x8000002C),表示遵守BIP44協(xié)議。該層使用硬化衍生。
2. coin_type:幣種類型,使得一個主私鑰可以管理多幣種。其中比特幣是0。該層使用硬化衍生。
3. account:賬戶,從0開始按順序嚴(yán)格遞增。它將密鑰空間拆分為獨(dú)立的賬戶身份,從而使得各個賬戶的資產(chǎn)永遠(yuǎn)不會攪在一起。該層使用硬化衍生。
4. change:是否為找零地址。常數(shù)0代表對外地址,常數(shù)1代表內(nèi)部可見地址。在實(shí)際使用過程中,應(yīng)當(dāng)將對外地址用于收款,內(nèi)部地址用于接收交易找零。該層使用正常衍生。
5. address_index:地址索引編號,從0開始按順序嚴(yán)格遞增。該層使用正常衍生。
例如:
○ 比特幣6號賬戶22號找零地址:m/44’/0’/6’/1/22
○ 以太坊0號賬戶0號非找零地址:m/44’/60’/0’/0/0
最初,設(shè)計(jì)者出于安全考慮引入了硬化衍生。正常衍生的索引號范圍為 [0x0, 0x7FFFFFFF],而硬化衍生的索引號范圍為 [0x80000000, 0xFFFFFFFF];硬化衍生的索引號太長,一般為了便于閱讀,都是會將索引號右上角加上撇號,譬如:0x80000000 記為 0’,0x80000001 記為 1’,以此類推。
Tips!
路徑是允許不完整的。比如:如果公司總部僅僅推導(dǎo)到m/44’/0’/0,并將該層的密鑰和鏈碼給了財(cái)務(wù)部,那么就相當(dāng)于財(cái)務(wù)部擁有了0號賬戶的衍生權(quán)。財(cái)務(wù)部就可以獨(dú)立的用0/0、0/1、0/2…作為路徑去接著推導(dǎo)總部HD錢包這個分支的子密鑰。甚至可以將0號賬戶作為自己的主密鑰,重新構(gòu)建一個HD錢包。
增強(qiáng)擴(kuò)展子密鑰推導(dǎo)
至此,我們已經(jīng)定義好了樹干和坐標(biāo),可以準(zhǔn)確定位到每個枝頭,每片樹葉了。根據(jù)BIP32的HKD(hardened key derivation formula)函數(shù),結(jié)合父私鑰、父鏈碼和路徑,推導(dǎo)出增強(qiáng)子私鑰和增強(qiáng)子鏈碼。
總結(jié)
區(qū)塊鏈錢包-私鑰與地址
私鑰
私鑰(yuè)本質(zhì)上是一個256位隨機(jī)數(shù)。
那么什么是256位隨機(jī)數(shù)呢?首先256位是指由256個0或1組成,如:1001001010001...
,其次隨機(jī)是指某一位上是0或1是隨機(jī)沒有規(guī)律的。舉個例子,A想獲得一個獨(dú)屬于自己的比特幣私鑰,那么他可以通過擲硬幣來生成,正面朝上是1,反面朝上是0,擲了256次之后,他得到了一個數(shù)字序列,即為A的私鑰。
看到這里,你可能會想,私鑰的規(guī)則也太隨意了吧,我隨便寫個數(shù),只要不超過最大值,就是一個私鑰?或者萬一別人隨機(jī)出了我的私鑰,不是可以把我的資產(chǎn)拿走嗎?
你想的沒錯,以上兩個問題的答案都是肯定的…
但是,即使私鑰只是一個數(shù)字,它仍然非常非常非常難以被破解!它的安全性來自于它包含的數(shù)字集合非常大,大到難以去窮盡所有數(shù)字,并進(jìn)行一一驗(yàn)證。即使存在客觀的重復(fù)的概率,但我們?nèi)匀豢梢苑Q私鑰在密碼學(xué)上是安全的。如果你仍然心存疑慮,那么我們可以感性的感受下:
○ 私鑰共有2^256個可能,近似于10??。
○ 到目前為止,人類可觀測的宇宙中的原子數(shù)約為10??;
○ “雙色球”一等獎的中獎概率是8×10ˉ?;
ok,我們現(xiàn)在知道了比特幣的安全來自于非常嚴(yán)格的隨機(jī)性,可以說我們選取的隨機(jī)算法的強(qiáng)度影響了我們資產(chǎn)的安全性。使用一個可能會被預(yù)測的隨機(jī)算法,不如擲硬幣…
Tips!
如前文所述,私鑰的本體就是一個數(shù)字,本身是不容易記憶和抄錄的。為了便于使用,大部分錢包會對私鑰進(jìn)行編碼,方便用戶進(jìn)行導(dǎo)入導(dǎo)出操作。目前主流的格式有HEX、WIF、WIF-compressed等。
地址
在傳統(tǒng)銀行用戶模型中,用戶需要賬號+密碼來操控自己的資產(chǎn)。而在比特幣體系中,資產(chǎn)其實(shí)是存在每個私鑰下的,用戶只需要私鑰即可以完全操控自己的資產(chǎn)。私鑰的隱私性太強(qiáng),是不可能讓別人得知的,那么如何實(shí)現(xiàn)在不暴露自己私鑰的前提下,讓別人給自己轉(zhuǎn)賬呢?地址應(yīng)運(yùn)而生。
通過橢圓曲線算法(ECDSA),私鑰可以計(jì)算出一個唯一且不可逆的公鑰, 公鑰通過特定的哈希計(jì)算得到公鑰哈希,在對公鑰哈希進(jìn)行編碼,即可得到地址。簡單來說,因?yàn)楣€本身太長了,不利于交易的進(jìn)行,所以通過一些變換得到地址。地址就是公鑰的一種表現(xiàn)形式。
在比特幣體系中,生成一個地址的流程大致為:
可以看出,比特幣用于公開交易的地址是由公鑰進(jìn)行一系列數(shù)學(xué)計(jì)算得來的。順理成章的,如果改變其中的哈希算法或者編碼方式,就可以得到一個不同的結(jié)果,也就是一個新地址!這個特性使得一個私鑰管理多種加密貨幣變?yōu)榭赡埽?br />○ A私鑰->A公鑰-比特幣地址算法
->比特幣地址
○ A私鑰->A公鑰-以太坊地址算法
->以太坊地址
○ …
Tips!
為什么比特幣地址要采用Base58編碼呢?與Base64的是,Base58去掉了幾個看起來可能會產(chǎn)生歧義的字母,如0(零)、O(大寫字母O)、I(大寫的字母i) 和 l(小寫的字母L),以及兩個影響雙擊選擇的字符,如/和+。在設(shè)計(jì)層面盡可能降低地址輸錯帶來的資金損失。
到此這篇關(guān)于區(qū)塊鏈錢包-hd錢包實(shí)現(xiàn)原理的文章就介紹到這了,更多相關(guān)hd錢包實(shí)現(xiàn)原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
你可能感興趣的文章
-
HD錢包是什么?什么是分層確定性 (HD) 錢包?
如果您對加密貨幣世界有一定了解,也有了您的第一個比特幣,您就會發(fā)現(xiàn)您的 BTC 比特幣接收地址時常會發(fā)生變化, 這是因?yàn)楸忍貛攀褂昧艘环N名為“分層確定性錢包”(簡稱 HD…
2025-03-05 -
HD錢包是冷錢包還是熱錢包? HD錢包全面介紹
HD錢包是一種基于層級確定性錢包(Hierarchical Deterministic Wallet)的加密貨幣錢包,HD錢包具有許多優(yōu)勢,使其成為加密貨幣用戶的首選,那么HD錢包是冷錢包還是熱錢包?…
2023-10-30 -
身份錢包是什么意思? 一文讀懂身份錢包HD
身份錢包是指一種數(shù)字錢包或應(yīng)用程序,用于管理和控制投資者的身份信息,在加密貨幣和區(qū)塊鏈領(lǐng)域,身份錢包通常與去中心化身份和自主身份概念相關(guān)聯(lián),簡單的介紹還不能讓大…
2023-09-05 -
火火錢包創(chuàng)建HD錢包并使用教程
這篇文章主要介紹了火火錢包創(chuàng)建HD錢包并使用教程的相關(guān)資料,希望這篇關(guān)于火火錢包創(chuàng)建HD錢包并使用教程的文章,能夠幫助各位投資者對火火錢包有一個更加深入透徹的了解。…
2021-12-14