HD加密貨幣錢包助記詞所涉及的 BIP32、BIP44、BIP39介紹
引言
錢包是很多人第一次接觸以太坊或其他虛擬貨幣的地方。無論是用手機(jī)還是瀏覽器的錢包,相信很多人都對一串陌生的單字感到好奇而且很重要還要備份。這是源于比特幣中錢包的設(shè)計(jì),采用第三機(jī)制的錢包通常稱為HD錢包。
隨著比特幣區(qū)塊鏈的發(fā)展,人們已經(jīng)不滿足于,只有一個(gè)賬號的情況,有些人會有好幾個(gè)賬戶,但是這就出現(xiàn)一個(gè)問題,我有幾個(gè)賬號,就要保存幾個(gè)私鑰,這就特別麻煩和不友好,所以,就出現(xiàn)了bip32確定性算法,該算法可以讓你只有同一個(gè)種子,就可以生成無數(shù)個(gè)私鑰和地址,這就大大方便了用戶的使用。但是這個(gè)種子,也比較長,用戶使用起來也比較繁瑣,這就出現(xiàn)了bip39,它是使用助記詞的方式,生成種子的,這樣用戶只需要記住,12個(gè)單詞(3,6,9,12,15,18,21,24支持這些單詞數(shù),目前使用較廣泛的是12和24),這就有大大提高了用戶使用的便利性。又隨著區(qū)塊鏈發(fā)展,市面上出現(xiàn)了很多幣種,之前的確定性算法只是針對比特幣的,也就是說只支持一種幣種,用戶想用同一個(gè)種子,管理不同幣種,這就促使了bip44協(xié)議的出現(xiàn),它是基于bip32協(xié)議的,它給bip32的路徑,賦予了不同的意義,很好的解決了多幣種,多地址的問題。
協(xié)議官方鏈接如果想詳細(xì)的了解這些協(xié)議,請查看官方文檔(解析的最清楚)
big32:https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
bip39:https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
bip44:https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki
驗(yàn)證網(wǎng)站:https://iancoleman.io/bip39/
數(shù)字錢包概念
錢包用來存錢的,在區(qū)塊鏈中,我們的數(shù)字資產(chǎn)都會對應(yīng)到一個(gè)賬戶地址上, 只有擁有賬戶的鑰匙(私鑰)才可以對資產(chǎn)進(jìn)行消費(fèi)(用私鑰對消費(fèi)交易簽名)。
私鑰和地址的關(guān)系如下:
一句話概括下就是:私鑰通過橢圓曲線生成公鑰, 公鑰通過哈希函數(shù)生成地址,這兩個(gè)過程都是單向的。
因此實(shí)際上,數(shù)字錢包實(shí)際是一個(gè)管理私鑰(生成、存儲、簽名)的工具,注意錢包并不保存資產(chǎn),資產(chǎn)是在鏈上的。
如何創(chuàng)建賬號
創(chuàng)建賬號關(guān)鍵是生成一個(gè)私鑰, 私鑰是一個(gè)32個(gè)字節(jié)的數(shù), 生成一個(gè)私鑰在本質(zhì)上在1到2^256之間選一個(gè)數(shù)字。
因此生成密鑰的第一步也是最重要的一步,是要找到足夠安全的熵源,即隨機(jī)性來源,只要選取的結(jié)果是不可預(yù)測或不可重復(fù)的,那么選取數(shù)字的具體方法并不重要。
比如可以擲硬幣256次,用紙和筆記錄正反面并轉(zhuǎn)換為0和1,隨機(jī)得到的256位二進(jìn)制數(shù)字可作為錢包的私鑰。
從編程的角度來看,一般是通過在一個(gè)密碼學(xué)安全的隨機(jī)源(不建議大家自己去寫一個(gè)隨機(jī)數(shù))中取出一長串隨機(jī)字節(jié),對其使用SHA256哈希算法進(jìn)行運(yùn)算,這樣就可以方便地產(chǎn)生一個(gè)256位的數(shù)字。
實(shí)際過程需要比較下是否小于n-1(n = 1.158 * 10^77, 略小于2^256),我們就有了一個(gè)合適的私鑰。否則,我們就用另一個(gè)隨機(jī)數(shù)再重復(fù)一次。這樣得到的私鑰就可以根據(jù)上面的方法進(jìn)一步生成公鑰及地址。
BIP32、BIP39、BIP44
BIP全稱是Bitcoin Improvement Proposals,是提出比特幣的新功能或改進(jìn)措施的文件。盡管任何人提出,經(jīng)過審核后公布在bitcoin/bips上。BIP和比特幣的關(guān)系,就像是RFC之于互聯(lián)網(wǎng)。
而其中的BIP32、BIP39、BIP44共同定義了目前被廣泛使用的HD錢包,包含其設(shè)計(jì)動機(jī)和理念、實(shí)作方式、實(shí)例等。
BIP32:定義分層確定性錢包(簡稱“HD Wallet”),是一個(gè)系統(tǒng)可以從單個(gè)種子 生成一樹狀結(jié)構(gòu)存儲多組密鑰對(私鑰和公鑰)。好處是可以方便的備份、轉(zhuǎn)移到其他相容裝置因?yàn)椋ǘ贾恍枰N子),以及分層的權(quán)限等。
BIP39:將種子用方便記憶和書寫的單字表示。一般由12個(gè)單字組成,稱為助記碼(詞組),中文稱為助記詞或助記碼。例如:
rose rocket invest real refuse margin festival danger anger border idle brow
BIP44:基于 BIP32 的系統(tǒng),賦予樹狀結(jié)構(gòu)中的各層特殊的意義。讓同一個(gè)種子可以支持多幣種、多賬戶等。各層定義如下:
m / purpose' / coin_type' / account' / change / address_index
其中的purporse'固定是44',代表使用BIP44。而coin_type'用來表示不同的幣種,例如Bitcoin就是0',Ethereum是60'。
BIP32
錢包也是一個(gè)私鑰的容器,按照上面的方法,我們可以生成一堆私鑰(一個(gè)人也有很多賬號的需求,可以更好保護(hù)隱私),而每個(gè)私鑰都需要備份就特別麻煩的。
最早期的比特幣錢包就是就是這樣,還有一個(gè)昵稱:“Just a Bunch Of Keys(一堆私鑰)“
為了解決這種麻煩,就有了BIP32 提議: 根據(jù)一個(gè)隨機(jī)數(shù)種子通過分層確定性推導(dǎo)的方式得到n個(gè)私鑰,這樣保存的時(shí)候,只需要保存一個(gè)種子就可以,私鑰可以推導(dǎo)出來,如圖:
(圖來自精通比特幣)
上圖中的孫秘鑰就可以用來簽發(fā)交易。
補(bǔ)充說明下 BIP: Bitcoin Improvement Proposals 比特幣改進(jìn)建議, bip32是第32個(gè)改進(jìn)建議。
BIP32提案的名字是:Hierarchical Deterministic Wallets, 就是我們所說的HD錢包。
來分析下這個(gè)分層推導(dǎo)的過程,第一步推導(dǎo)主秘鑰的過程:
根種子輸入到HMAC-SHA512算法中就可以得到一個(gè)可用來創(chuàng)造主私鑰(m) 和 一個(gè)主鏈編碼( a master chain code)這一步生成的秘鑰(由私鑰或公鑰)及主鏈編碼再加上一個(gè)索引號,將作為HMAC-SHA512算法的輸入繼續(xù)衍生出下一層的私鑰及鏈編碼,如下圖:
衍生推導(dǎo)的方案其實(shí)有兩個(gè):一個(gè)用父私鑰推導(dǎo)(稱為強(qiáng)化衍生方程),一個(gè)用父公鑰推導(dǎo)。同時(shí)為了區(qū)分這兩種不同的衍生,在索引號也進(jìn)行了區(qū)分,索引號小于2^31用于常規(guī)衍生,而2^31到2^32-1之間用于強(qiáng)化衍生,為了方便表示索引號i’,表示2^31+i。
因此增加索引(水平擴(kuò)展)及 通過子秘鑰向下一層(深度擴(kuò)展)可以無限生成私鑰。
注意, 這個(gè)推導(dǎo)過程是確定(相同的輸入,總是有相同的輸出)也是單向的,子密鑰不能推導(dǎo)出同層級的兄弟密鑰,也不能推出父密鑰。如果沒有子鏈碼也不能推導(dǎo)出孫密鑰?,F(xiàn)在我們已經(jīng)對分層推導(dǎo)有了認(rèn)識。
一句話概括下BIP32就是:為了避免管理一堆私鑰的麻煩提出的分層推導(dǎo)方案。
秘鑰路徑及BIP44
通過這種分層(樹狀結(jié)構(gòu))推導(dǎo)出來的秘鑰,通常用路徑來表示,每個(gè)級別之間用斜杠 / 來表示,由主私鑰衍生出的私鑰起始以“m”打頭。因此,第一個(gè)母密鑰生成的子私鑰是m/0。第一個(gè)公共鑰匙是M/0。第一個(gè)子密鑰的子密鑰就是m/0/1,以此類推。
BIP44則是為這個(gè)路徑約定了一個(gè)規(guī)范的含義(也擴(kuò)展了對多幣種的支持),BIP0044指定了包含5個(gè)預(yù)定義樹狀層級的結(jié)構(gòu):m / purpose' / coin' / account' / change / address_index
m是固定的, Purpose也是固定的,值為44(或者 0x8000002C)
Coin type這個(gè)代表的是幣種,0代表比特幣,1代表比特幣測試鏈,60代表以太坊完整的幣種列表地址:https://github.com/satoshilabs/slips/blob/master/slip-0044.mdAccount代表這個(gè)幣的賬戶索引,從0開始
Change常量0用于外部(收款地址),常量1用于內(nèi)部(也稱為找零地址)。外部用于在錢包外可見的地址(例如,用于接收付款)。內(nèi)部鏈用于在錢包外部不可見的地址,用于返回交易變更。 (所以一般使用0)
address_index這就是地址索引,從0開始,代表生成第幾個(gè)地址,官方建議,每個(gè)account下的address_index不要超過20
根據(jù) EIP85提議的討論以太坊錢包也遵循BIP44標(biāo)準(zhǔn),確定路徑是m/44'/60'/a'/0/n
a 表示帳號,n 是第 n 生成的地址,60 是在 SLIP44 提案中確定的以太坊的編碼。所以我們要開發(fā)以太坊錢包同樣需要對比特幣的錢包提案BIP32、BIP39有所了解。
一句話概括下BIP44就是:給BIP32的分層路徑定義規(guī)范
示例
coin | account | change | address | path |
---|---|---|---|---|
Bitcoin | first | external | first | m / 44’ / 0’ / 0’ / 0 / 0 |
Bitcoin | first | external | second | m / 44’ / 0’ / 0’ / 0 / 1 |
Bitcoin | first | internal | second | m / 44’ / 0’ / 0’ / 1 / 1 |
Bitcoin Testnet | first | external | first | m / 44’ / 1’ / 0’ / 0 / 0 |
Bitcoin Testnet | second | external | first | m / 44’ / 1’ / 1’ / 0 / 0 |
BIP39
BIP32 提案可以讓我們保存一個(gè)隨機(jī)數(shù)種子(通常16進(jìn)制數(shù)表示),而不是一堆秘鑰,確實(shí)方便一些,不過用戶使用起來(比如冷備份)也比較繁瑣,這就出現(xiàn)了BIP39,它是使用助記詞的方式,生成種子的,這樣用戶只需要記住12(或24)個(gè)單詞,單詞序列通過 PBKDF2 與 HMAC-SHA512 函數(shù)創(chuàng)建出隨機(jī)種子作為 BIP32 的種子。
可以簡單的做一個(gè)對比,下面那一種備份起來更友好:
// 隨機(jī)數(shù)種子 090ABCB3A6e1400e9345bC60c78a8BE7 // 助記詞種子 candy maple cake sugar pudding cream honey rich smooth crumble sweet treat
使用助記詞作為種子其實(shí)包含2個(gè)部分:助記詞生成及助記詞推導(dǎo)出隨機(jī)種子,下面分析下這個(gè)過程。
生成助記詞
助記詞生成的過程是這樣的:先生成一個(gè)128位隨機(jī)數(shù),再加上對隨機(jī)數(shù)做的校驗(yàn)4位,得到132位的一個(gè)數(shù),然后按每11位做切分,這樣就有了12個(gè)二進(jìn)制數(shù),然后用每個(gè)數(shù)去查BIP39定義的單詞表,這樣就得到12個(gè)助記詞,這個(gè)過程圖示如下:
(圖來源于網(wǎng)絡(luò))
下面是使用bip39生成生成助記詞的一段代碼:
<strong>var</strong> bip39 = require('bip39') // 生成助記詞 <strong>var</strong> mnemonic = bip39.<strong>generateMnemonic</strong>() console.<strong>log</strong>(mnemonic)
助記詞推導(dǎo)出種子
這個(gè)過程使用密鑰拉伸(Key stretching)函數(shù),被用來增強(qiáng)弱密鑰的安全性,PBKDF2是常用的密鑰拉伸算法中的一種。
PBKDF2基本原理是通過一個(gè)為隨機(jī)函數(shù)(例如 HMAC 函數(shù)),把助記詞明文和鹽值作為輸入?yún)?shù),然后重復(fù)進(jìn)行運(yùn)算最終產(chǎn)生生成一個(gè)更長的(512 位)密鑰種子。這個(gè)種子再構(gòu)建一個(gè)確定性錢包并派生出它的密鑰。
密鑰拉伸函數(shù)需要兩個(gè)參數(shù):助記詞和鹽。鹽可以提高暴力破解的難度。 鹽由常量字符串 “mnemonic” 及一個(gè)可選的密碼組成,注意使用不同密碼,則拉伸函數(shù)在使用同一個(gè)助記詞的情況下會產(chǎn)生一個(gè)不同的種子,這個(gè)過程圖示圖下:
(圖來源于網(wǎng)絡(luò))
同樣代碼來表示一下:
<strong>var</strong> hdkey = require('ethereumjs-wallet/hdkey') <strong>var</strong> util = require('ethereumjs-util') <strong>var</strong> seed = bip39.<strong>mnemonicToSeed</strong>(mnemonic, "pwd"); <strong>var</strong> hdWallet = hdkey.<strong>fromMasterSeed</strong>(seed); <strong>var</strong> key1 = hdWallet.<strong>derivePath</strong>("m/44'/60'/0'/0/0"); console.<strong>log</strong>("私鑰:"+util.<strong>bufferToHex</strong>(key1._hdkey._privateKey)); <strong>var</strong> address1 = util.<strong>pubToAddress</strong>(key1._hdkey._publicKey, true); console.<strong>log</strong>("地址:"+util.<strong>bufferToHex</strong>(address1)); console.<strong>log</strong>("校驗(yàn)和地址:"+ util.<strong>toChecksumAddress</strong>(address1.<strong>toString</strong>('hex')));
校驗(yàn)和地址是EIP-55中定義的對大小寫有要求的一種地址形式。
密碼可以作為一個(gè)額外的安全因子來保護(hù)種子,即使助記詞的備份被竊取,也可以保證錢包的安全(也要求密碼擁有足夠的復(fù)雜度和長度),不過另外一方面,如果我們忘記密碼,那么將無法恢復(fù)我們的數(shù)字資產(chǎn)。
一句話概括下BIP39就是:通過定義助記詞讓種子的備份更友好
小結(jié)
HD錢包(Hierarchical Deterministic Wallets)是在BIP32中提出的為了避免管理一堆私鑰的麻煩提出的分層推導(dǎo)方案。
而BIP44是給BIP32的分層增強(qiáng)了路徑定義規(guī)范,同時(shí)增加了對多幣種的支持。
BIP39則通過定義助記詞0讓種子的備份更友好。
目前我們的市面上單到的以太幣、比特幣錢包基本都遵循這些標(biāo)準(zhǔn)。
你可能感興趣的文章
-
HD加密貨幣錢包助記詞所涉及的 BIP32、BIP44、BIP39介紹
本文介紹了BIP32、BIP39和BIP44在加密貨幣錢包中的作用,BIP32提供了一種通過種子生成無限私鑰的分層確定性方法,BIP39通過助記詞簡化種子備份,BIP44則定義了多幣種錢包的…
2025-08-21 -
比特幣常用的錢包類型有哪些?為什么選擇OKX Web3錢包?
OKX Web3錢包是由OKX交易所推出的一款去中心化錢包,集成在OKX交易所App中不必另外下載,第一次買比特幣不知道該放在哪個(gè)錢包才安全,今天我就來告訴你比特幣常用的錢包類型…
2025-08-21 -
什么是硬件錢包?2025 年最佳比特幣硬件錢包推薦與使用指南
比特幣(BTC)仍然是世界上最有價(jià)值的加密貨幣, 2025年8月,它突破歷史新高124,000美元,使其市值接近2.3兆美元,一些分析師甚至預(yù)測比特幣長期內(nèi)可能達(dá)到100萬美元,這一增長…
2025-08-21 -
什么是Ledger Flex 錢包?如何使用?功能、使用指南介紹
Ledger Flex 是Ledger 較新的硬體錢包之一,于2024 年7 月推出以紀(jì)念公司成立10 周年,盡管它并非產(chǎn)品線中最新的, Ledger Stax,一款具有彎曲E Ink 顯示器和無線Qi 充電的…
2025-08-21 -
如何為TON生態(tài)系建立并設(shè)定Tonkeeper錢包?錢包設(shè)置指南
The Open Network (TON)是一個(gè)Layer 1 區(qū)塊鏈,最初由Telegram 開發(fā),現(xiàn)在由TON 基金會管理, TON 設(shè)計(jì)旨在實(shí)現(xiàn)跨鏈互操作性和高擴(kuò)展性,使用分片技術(shù)將交易負(fù)載分配到多個(gè)…
2025-08-20 -
什么是加密錢包?如何工作?加密錢包獲取、使用指南
了解加密錢包的功能和用途對于管理您的數(shù)字資產(chǎn)至關(guān)重要,事不宜遲,讓我們深入了解什么是加密錢包,以及使用加密錢包所需的一切知識…
2025-08-20 -
Metamask 錢包評測:安全合法嗎?優(yōu)點(diǎn)、風(fēng)險(xiǎn)介紹(2025年)
MetaMask 是加密貨幣領(lǐng)域最知名的品牌之一,經(jīng)常被拿來與 MetaMask 的替代錢包進(jìn)行比較,你可以把它想象成一個(gè)數(shù)字加密貨幣錢包,就像你口袋里的錢包一樣——但它不是用來存…
2025-08-20 -
HOT Wallet是什么錢包?如何挖掘HOT代幣?HOT團(tuán)隊(duì)背景、功能介紹
HOT錢包是一個(gè)非托管的迷你應(yīng)用錢包,基于NEAR區(qū)塊鏈,采用多方計(jì)算(MPC)技術(shù)進(jìn)行安全保護(hù),私鑰在去中心化的驗(yàn)證節(jié)點(diǎn)之間共享,雖然它是NEAR鏈的原生錢包,但也支持Tron…
2025-08-20 -
比特幣錢包地址是什么?如何申請、查詢?如何使用比特幣地址?
比特幣錢包地址是一個(gè)字母數(shù)字字串,用于將比特幣接收至你的錢包,不論是新手還是老手,只要進(jìn)行比特幣轉(zhuǎn)帳、交易或存放,都必須使用比特幣錢包地址,很多新手看到一長串英文…
2025-08-20 -
2025全球十大虛擬貨幣錢包最新排名榜單
虛擬貨幣錢包類型有很多種,根據(jù)工作機(jī)制,可分為「冷錢包」和「熱錢包」兩大類,大部分都支援比特幣(BTC)、以太幣(ETH)等主流幣種的存儲,小編統(tǒng)合全球知名虛擬貨幣錢包…
2025-08-19