摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接理解開(kāi)發(fā)錢包涉及的原文已更新,請(qǐng)讀者前往原文閱讀如果你還在被錢包搞的一頭霧水,來(lái)看看這邊文章吧。所以我們要開(kāi)發(fā)以太坊錢包同樣需要對(duì)比特幣的錢包提案有所了解。
本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:理解開(kāi)發(fā)HD錢包涉及的BIP32、BIP44、BIP39原文已更新,請(qǐng)讀者前往原文閱讀
如果你還在被HD錢包、BIP32、BIP44、BIP39搞的一頭霧水,來(lái)看看這邊文章吧。
數(shù)字錢包概念錢包用來(lái)存錢的,在區(qū)塊鏈中,我們的數(shù)字資產(chǎn)都會(huì)對(duì)應(yīng)到一個(gè)賬戶地址上, 只有擁有賬戶的鑰匙(私鑰)才可以對(duì)資產(chǎn)進(jìn)行消費(fèi)(用私鑰對(duì)消費(fèi)交易簽名)。
私鑰和地址的關(guān)系如下:
(圖來(lái)自精通比特幣)
一句話概括下就是:私鑰通過(guò)橢圓曲線生成公鑰, 公鑰通過(guò)哈希函數(shù)生成地址,這兩個(gè)過(guò)程都是單向的。
因此實(shí)際上,數(shù)字錢包實(shí)際是一個(gè)管理私鑰(生成、存儲(chǔ)、簽名)的工具,注意錢包并不保存資產(chǎn),資產(chǎn)是在鏈上的。
創(chuàng)建賬號(hào)關(guān)鍵是生成一個(gè)私鑰, 私鑰是一個(gè)32個(gè)字節(jié)的數(shù), 生成一個(gè)私鑰在本質(zhì)上在1到2^256之間選一個(gè)數(shù)字。
因此生成密鑰的第一步也是最重要的一步,是要找到足夠安全的熵源,即隨機(jī)性來(lái)源,只要選取的結(jié)果是不可預(yù)測(cè)或不可重復(fù)的,那么選取數(shù)字的具體方法并不重要。
比如可以擲硬幣256次,用紙和筆記錄正反面并轉(zhuǎn)換為0和1,隨機(jī)得到的256位二進(jìn)制數(shù)字可作為錢包的私鑰。
從編程的角度來(lái)看,一般是通過(guò)在一個(gè)密碼學(xué)安全的隨機(jī)源(不建議大家自己去寫一個(gè)隨機(jī)數(shù))中取出一長(zhǎng)串隨機(jī)字節(jié),對(duì)其使用SHA256哈希算法進(jìn)行運(yùn)算,這樣就可以方便地產(chǎn)生一個(gè)256位的數(shù)字。
實(shí)際過(guò)程需要比較下是否小于n-1(n = 1.158 * 10^77, 略小于2^256),我們就有了一個(gè)合適的私鑰。否則,我們就用另一個(gè)隨機(jī)數(shù)再重復(fù)一次。這樣得到的私鑰就可以根據(jù)上面的方法進(jìn)一步生成公鑰及地址。BIP32
錢包也是一個(gè)私鑰的容器,按照上面的方法,我們可以生成一堆私鑰(一個(gè)人也有很多賬號(hào)的需求,可以更好保護(hù)隱私),而每個(gè)私鑰都需要備份就特別麻煩的。
最早期的比特幣錢包就是就是這樣,還有一個(gè)昵稱:“Just a Bunch Of Keys(一堆私鑰)“
為了解決這種麻煩,就有了BIP32 提議: 根據(jù)一個(gè)隨機(jī)數(shù)種子通過(guò)分層確定性推導(dǎo)的方式得到n個(gè)私鑰,這樣保存的時(shí)候,只需要保存一個(gè)種子就可以,私鑰可以推導(dǎo)出來(lái),如圖:
(圖來(lái)自精通比特幣)上圖中的孫秘鑰就可以用來(lái)簽發(fā)交易。
補(bǔ)充說(shuō)明下 BIP: Bitcoin Improvement Proposals 比特幣改進(jìn)建議, bip32是第32個(gè)改進(jìn)建議。秘鑰路徑及BIP44
BIP32提案的名字是:Hierarchical Deterministic Wallets, 就是我們所說(shuō)的HD錢包。
來(lái)分析下這個(gè)分層推導(dǎo)的過(guò)程,第一步推導(dǎo)主秘鑰的過(guò)程:
根種子輸入到HMAC-SHA512算法中就可以得到一個(gè)可用來(lái)創(chuàng)造主私鑰(m) 和 一個(gè)主鏈編碼( a master chain code)這一步生成的秘鑰(由私鑰或公鑰)及主鏈編碼再加上一個(gè)索引號(hào),將作為HMAC-SHA512算法的輸入繼續(xù)衍生出下一層的私鑰及鏈編碼,如下圖:
衍生推導(dǎo)的方案其實(shí)有兩個(gè):一個(gè)用父私鑰推導(dǎo)(稱為強(qiáng)化衍生方程),一個(gè)用父公鑰推導(dǎo)。同時(shí)為了區(qū)分這兩種不同的衍生,在索引號(hào)也進(jìn)行了區(qū)分,索引號(hào)小于2^31用于常規(guī)衍生,而2^31到2^32-1之間用于強(qiáng)化衍生,為了方便表示索引號(hào)i",表示2^31+i。
因此增加索引(水平擴(kuò)展)及 通過(guò)子秘鑰向下一層(深度擴(kuò)展)可以無(wú)限生成私鑰。
注意, 這個(gè)推導(dǎo)過(guò)程是確定(相同的輸入,總是有相同的輸出)也是單向的,子密鑰不能推導(dǎo)出同層級(jí)的兄弟密鑰,也不能推出父密鑰。如果沒(méi)有子鏈碼也不能推導(dǎo)出孫密鑰。現(xiàn)在我們已經(jīng)對(duì)分層推導(dǎo)有了認(rèn)識(shí)。
一句話概括下BIP32就是:為了避免管理一堆私鑰的麻煩提出的分層推導(dǎo)方案。
通過(guò)這種分層(樹(shù)狀結(jié)構(gòu))推導(dǎo)出來(lái)的秘鑰,通常用路徑來(lái)表示,每個(gè)級(jí)別之間用斜杠 / 來(lái)表示,由主私鑰衍生出的私鑰起始以“m”打頭。因此,第一個(gè)母密鑰生成的子私鑰是m/0。第一個(gè)公共鑰匙是M/0。第一個(gè)子密鑰的子密鑰就是m/0/1,以此類推。
BIP44則是為這個(gè)路徑約定了一個(gè)規(guī)范的含義(也擴(kuò)展了對(duì)多幣種的支持),BIP0044指定了包含5個(gè)預(yù)定義樹(shù)狀層級(jí)的結(jié)構(gòu):
`
m / purpose" / coin" / account" / change / address_index
`
m是固定的, Purpose也是固定的,值為44(或者 0x8000002C)
Coin type
這個(gè)代表的是幣種,0代表比特幣,1代表比特幣測(cè)試鏈,60代表以太坊
完整的幣種列表地址:https://github.com/satoshilab...
Account
代表這個(gè)幣的賬戶索引,從0開(kāi)始
Change
常量0用于外部鏈,常量1用于內(nèi)部鏈(也稱為更改地址)。外部鏈用于在錢包外可見(jiàn)的地址(例如,用于接收付款)。內(nèi)部鏈用于在錢包外部不可見(jiàn)的地址,用于返回交易變更。 (所以一般使用0)
address_index
這就是地址索引,從0開(kāi)始,代表生成第幾個(gè)地址,官方建議,每個(gè)account下的address_index不要超過(guò)20
根據(jù) EIP85提議的討論以太坊錢包也遵循BIP44標(biāo)準(zhǔn),確定路徑是m/44"/60"/a"/0/n
a 表示帳號(hào),n 是第 n 生成的地址,60 是在 SLIP44 提案中確定的以太坊的編碼。所以我們要開(kāi)發(fā)以太坊錢包同樣需要對(duì)比特幣的錢包提案BIP32、BIP39有所了解。
一句話概括下BIP44就是:給BIP32的分層路徑定義規(guī)范
BIP32 提案可以讓我們保存一個(gè)隨機(jī)數(shù)種子(通常16進(jìn)制數(shù)表示),而不是一堆秘鑰,確實(shí)方便一些,不過(guò)用戶使用起來(lái)(比如冷備份)也比較繁瑣,這就出現(xiàn)了BIP39,它是使用助記詞的方式,生成種子的,這樣用戶只需要記住12(或24)個(gè)單詞,單詞序列通過(guò) PBKDF2 與 HMAC-SHA512 函數(shù)創(chuàng)建出隨機(jī)種子作為 BIP32 的種子。
可以簡(jiǎn)單的做一個(gè)對(duì)比,下面那一種備份起來(lái)更友好:
// 隨機(jī)數(shù)種子 090ABCB3A6e1400e9345bC60c78a8BE7 // 助記詞種子 candy maple cake sugar pudding cream honey rich smooth crumble sweet treat
使用助記詞作為種子其實(shí)包含2個(gè)部分:助記詞生成及助記詞推導(dǎo)出隨機(jī)種子,下面分析下這個(gè)過(guò)程。
生成助記詞助記詞生成的過(guò)程是這樣的:先生成一個(gè)128位隨機(jī)數(shù),再加上對(duì)隨機(jī)數(shù)做的校驗(yàn)4位,得到132位的一個(gè)數(shù),然后按每11位做切分,這樣就有了12個(gè)二進(jìn)制數(shù),然后用每個(gè)數(shù)去查BIP39定義的單詞表,這樣就得到12個(gè)助記詞,這個(gè)過(guò)程圖示如下:
(圖來(lái)源于網(wǎng)絡(luò))
這個(gè)過(guò)程使用密鑰拉伸(Key stretching)函數(shù),被用來(lái)增強(qiáng)弱密鑰的安全性,PBKDF2是常用的密鑰拉伸算法中的一種。
PBKDF2基本原理是通過(guò)一個(gè)為隨機(jī)函數(shù)(例如 HMAC 函數(shù)),把助記詞明文和鹽值作為輸入?yún)?shù),然后重復(fù)進(jìn)行運(yùn)算最終產(chǎn)生生成一個(gè)更長(zhǎng)的(512 位)密鑰種子。這個(gè)種子再構(gòu)建一個(gè)確定性錢包并派生出它的密鑰。
密鑰拉伸函數(shù)需要兩個(gè)參數(shù):助記詞和鹽。鹽可以提高暴力破解的難度。 鹽由常量字符串 "mnemonic" 及一個(gè)可選的密碼組成,注意使用不同密碼,則拉伸函數(shù)在使用同一個(gè)助記詞的情況下會(huì)產(chǎn)生一個(gè)不同的種子,這個(gè)過(guò)程圖示圖下:
(圖來(lái)源于網(wǎng)絡(luò))
校驗(yàn)和地址是EIP-55中定義的對(duì)大小寫有要求的一種地址形式。
密碼可以作為一個(gè)額外的安全因子來(lái)保護(hù)種子,即使助記詞的備份被竊取,也可以保證錢包的安全(也要求密碼擁有足夠的復(fù)雜度和長(zhǎng)度),不過(guò)另外一方面,如果我們忘記密碼,那么將無(wú)法恢復(fù)我們的數(shù)字資產(chǎn)。
一句話概括下BIP39就是:通過(guò)定義助記詞讓種子的備份更友好
我為大家錄制了一個(gè)視頻:以太坊去中心化網(wǎng)頁(yè)錢包開(kāi)發(fā),從如何創(chuàng)建賬號(hào)開(kāi)始,深入探索BIP32、BIP44、BIP39等提案,以及如何存儲(chǔ)私鑰、發(fā)送離線簽名交易和Token。
小結(jié)
HD錢包(Hierarchical Deterministic Wallets)是在BIP32中提出的為了避免管理一堆私鑰的麻煩提出的分層推導(dǎo)方案。
而B(niǎo)IP44是給BIP32的分層增強(qiáng)了路徑定義規(guī)范,同時(shí)增加了對(duì)多幣種的支持。
BIP39則通過(guò)定義助記詞讓種子的備份更友好。
目前我們的市面上單到的以太幣、比特幣錢包基本都遵循這些標(biāo)準(zhǔn)。
最后推薦一個(gè)助記詞秘鑰生成器網(wǎng)站
歡迎來(lái)知識(shí)星球提問(wèn),星球內(nèi)已經(jīng)聚集了300多位區(qū)塊鏈技術(shù)愛(ài)好者。
深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/24331.html
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接理解開(kāi)發(fā)錢包涉及的原文已更新,請(qǐng)讀者前往原文閱讀如果你還在被錢包搞的一頭霧水,來(lái)看看這邊文章吧。所以我們要開(kāi)發(fā)以太坊錢包同樣需要對(duì)比特幣的錢包提案有所了解。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:理解開(kāi)發(fā)HD錢包涉及的BIP32、BIP44、BIP39原文已更新,請(qǐng)讀者前往原文閱讀 如果你還在被HD錢包、BIP32、BIP44、BIP39搞的一頭霧水...
摘要:錢包概述中文可以翻譯為分層錢包,錢包可以在不需要私鑰情況下運(yùn)用橢圓曲線算法生成大量公鑰。概念是由提出,解決難以抄寫記憶問(wèn)題,規(guī)范各個(gè)幣種路徑規(guī)范達(dá)成業(yè)界共識(shí)。這個(gè)規(guī)范的目的是設(shè)定一個(gè)分層錢包標(biāo)準(zhǔn),能在不通客戶之間交換。 前序:相信各位區(qū)塊鏈大佬,對(duì)公鑰和私鑰概念已經(jīng)爛熟于心,對(duì)私鑰重要性也諱莫如深。私鑰可以給交易簽名,有了私鑰就有了全部權(quán)限,但原始私鑰沒(méi)什么規(guī)律可循,特別不放記憶轉(zhuǎn)移,...
摘要:錢包功能一個(gè)錢包通常主要包含的功能有賬號(hào)管理主要是私鑰的管理創(chuàng)建賬號(hào)賬號(hào)導(dǎo)入導(dǎo)出賬號(hào)信息展示如以太幣余額代幣余額。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:[使用 ethers.js 開(kāi)發(fā)以太坊 Web 錢包 1 - 創(chuàng)建錢包賬號(hào))](https://learnblockchain.cn/20...,請(qǐng)讀者前往原文閱讀 以太坊去中心化網(wǎng)頁(yè)錢包開(kāi)發(fā)系列,將從零開(kāi)始開(kāi)發(fā)出一個(gè)可以實(shí)際使用的錢...
摘要:來(lái)做一個(gè)詳細(xì)的介紹協(xié)議協(xié)議原英文地址地址定義簡(jiǎn)稱,是一個(gè)系統(tǒng)可以從單一個(gè)產(chǎn)生一樹(shù)狀結(jié)構(gòu)儲(chǔ)存多組私鑰和公鑰。第二層的特指幣種并且允許多元貨幣錢包中的貨幣在第二個(gè)層級(jí)下有自己的亞樹(shù)狀結(jié)構(gòu)。每個(gè)賬戶都是它自己亞樹(shù)的根。 我們知道HD(分層確定性)錢包,基于 BIP-32;多幣種和多帳戶錢包,基于 BIP-44;最近比原社區(qū)的錢包開(kāi)發(fā)者對(duì)比原的BIP-32和BIP-44協(xié)議有疑問(wèn),所以我今天就...
摘要:文件如何生成的以太坊是使用對(duì)稱加密算法來(lái)加密私鑰生成文件,因此對(duì)稱加密秘鑰注意它其實(shí)也是發(fā)起交易時(shí)需要的解密秘鑰的選擇就非常關(guān)鍵,這個(gè)秘鑰是使用算法推導(dǎo)派生而出。加密推倒的相關(guān)配置是用于加密以太坊私鑰的對(duì)稱加密算法。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:[使用 ethers.js 開(kāi)發(fā)以太坊 Web 錢包 2 - 賬號(hào) Keystore 文件導(dǎo)入導(dǎo)出)](https://learnb...
閱讀 2022·2023-04-25 23:30
閱讀 1452·2021-11-24 10:18
閱讀 3069·2021-10-09 09:54
閱讀 2017·2021-10-08 10:05
閱讀 3431·2021-09-23 11:21
閱讀 3161·2019-08-30 15:52
閱讀 1560·2019-08-30 13:05
閱讀 1056·2019-08-30 13:02