詳解HD Wallet、BIP-0032、BIP-0039、BIP-0043及BIP-0044

買賣虛擬貨幣

當你在myetherwallet網站中輸入助記詞時…疑,這啥?

加密貨幣錢包(Cryptocurrency Wallet)

1. 在加密貨幣的世界中,錢包並非儲存加密貨幣的地方。

2. 反倒是錢包的主要功能是一個儲存私鑰(Private Key)的工具,私鑰是一串很長的英文字母、數字組成的字串(通常是64個16進位制位= 256 Bits = 32 Bytes所組成),而這條很長的字串讓您有權力把自己的加密貨幣傳送給別人。

3. 錢包可在使用者產生交易(Transaction)時使用私鑰將交易簽章(Digital Signature),而簽章的目的除了確認使用者為貨幣擁有者外,還可確保在交易完成後不可否認(Non-Repudiation)此交易;而儲存加密貨幣的地方則是負責維護區塊鏈(Blockchain)的礦工節點內。

4. 加密貨幣錢包形式多樣,分為離線的冷錢包(Cold Wallet)、線上的熱錢包(Hot Wallet)、印在紙上的紙錢包(Paper Wallet)…等。無論何種形式的錢包,錢包的開發商均需要有一個共同遵循的規範(例如:私鑰為多少位、如何依據一個隨機數產生私鑰等)。

比特幣改進提案(Bitcoin Improvement Proposals,BIP)

1. BIP全名是Bitcoin Improvement Proposals,是開發者向比特幣社群提出比特幣Bitcoin新功能或改進建議的技術設計檔案。

2. 根據BIP-0001改進提案,BIP總共分為:

· 描述系統面更動的標準類BIP(Standards Track BIP)

· 描述系統指導資訊的資訊類BIP(Informational BIP)

· 描述建議更動流程的程式類BIP(Process BIP)

分層確定性錢包(Hierarchical Determinstic Wallet,HD Wallet)

HD Wallet被BIP-0032、BIP-0039、BIP-0043、BIP-0044改進提案所共同定義,包含了錢包的設計動機、理念、實作方式等。

BIP-0032改進提案:

· BIP-0032是HD Wallet的核心提案,在系統使用SECP256K1橢圓曲線加密演算法前提下,我們可用熵(Entropy)函式產生隨機的32個16進位制字元(128 Bits)S,

S = Entropy_128_Bits

· 將S字串透過雜湊演算法HMAC-SHA512產生一組64個16進位制字元(256 Bits),我們將(左半邊的)256 Bits字串作為父擴充套件私鑰(Parent Extended Private Key)m;另一組(右半邊的)256 Bits字串作為下一級的鏈碼(Chain Code)c。而m可推導成父擴充套件公鑰(Parent Extended Public Key)M。

m = Left(HMAC_SHA512(S), 256)
c = Right(HMAC_SHA512(S), 256)
M = SECP256K1(m)

· 使用子私鑰求導(Child Private Key Derivation,CKDpri)函式,我們可以透過父擴充套件私鑰來產生出index = i子私鑰(Private Child Key)。

Child Private Key(Index = i)
= m / i
= CKDpri(m, i)
= Left(HMAC_SHA512(c, M, i), 256)⊕ m

m / 0 = CKDpri(m, 0)
m / 1 = CKDpri(m, 1)
m / 2 = CKDpri(m, 2)

m / i = CKDpri(m, i)


· 使用增強子私鑰求導(Child Hardened Key Derivation,HKD)函式,我們可以透過父擴充套件私鑰來產生出index = i’子私鑰(Private Child Key)。

Child Private Key(Index = i')
= m / i'
= HKD(m, i)
= Left(HMAC_SHA512(c, m, i), 256)⊕ m

m / 0' = HKD(m, 0)
m / 1' = HKD(m, 1)
m / 2' = HKD(m, 2)

m / i' = HKD(m, i)


· 使用子公鑰求導(Child Public Key Derivation,CKDpub)函式,我們可以透過父擴充套件公鑰來產生出子公鑰(Public Child Key)。

Child Public Key
= M / i
= CKDpub(M, i)
= Left(HMAC_SHA512(c, M, i), 256)⊕ M

M / 0 = CKDpub(M, 0)
M / 1 = CKDpub(M, 1)
M / 2 = CKDpub(M, 2)

M / i = CKDpub(M, i)


· BIP-0032改進提案的好處是,我們只要備份、轉移S,即可透過鑰匙樹(Key Tree)在其他相容BIP-0032的裝置上還原私鑰、公鑰及地址。

BIP-0039改進提案:

· 有鑑於BIP-0032的S不好記憶,BIP-0039提出S可以透過12組英文單字助記詞(Mnemonic Code)來產生。

· 熵(Entropy)函式產生隨機的32個16進位制字元(128 Bits ~ 256 Bits)ENT(初始熵長度,Initial Entropy Length),再取ENT的位數除以32得到CS(校驗和長度,Checksum Length)。

· 注:ENT = Entropy()= 128 + 32 * N Bits,N = 0 ~ 4,這邊採Entropy 128 Bits/12 Words來作計算。

ENT = Entropy_128_Bits
CS = Length(ENT)/ 32

· 在ENT右側串接SHA256(ENT)左邊的CS個字元。

X = ENT *(2 ^ CS)+ Left(SHA256(ENT), CS)

· 將X每11 Bits進行切割生成的助記詞(Generated Mnemonic Sentence,MS)

MS[ ] = Split(X, 11)

· 因為ENT位數範圍為(128 + 32 * N)Bits,N = 0 ~ 4,下表為不同ENT位數時會產生助記詞MS數量。


· 以太坊MetaMask錢包是使用當ENT為128位時產生的12組MS,透過查表法,我們可得對映的12組英文單字(或是中文、日文、韓文等)

· 注:對映表可參

· 可以將12 ~ 24組的MS + Salt(密碼學中加強雜湊亂度用)經過2048次的HMAC-SHA512計算後取得BIP-0032所使用的S。

S =(HMAC_SHA512 ^ 2048)(MS + Salt)


BIP-0043改進提案:

· 根據BIP-0032改進提案,將Key Tree的第一級定義為宗旨(Purpose),Purpose值與BIP-00XX改進提按的編號相等,例如BIP-0044中的Purpose = 44。

BIP-0044改進提案中的中的Key Tree
= m / 44'
= HKD(m, 44)
= Left(HMAC_SHA512(c, m, 44))⊕ m

BIP-0044改進提案:

· 根據BIP-0032、BIP-0043的改進提案,將Key Tree的
· 第一級定義為宗旨(Purpose)

· 第二級定義為代幣型別(Coin Type)

· 第三級定義為帳戶(Account)

· 第四級定義為鏈的變化(Change)

· 第五級定義為地址索引(Index)

BIP-0044的Key Tree
= CKDpub(CKDpub(HKD(HKD(HKD(m,i),j),n),o),p)
= m / i' / j' / n' / o / p
i = Purpose,i = 44表示BIP-0044。
j = Coin Type,j = 0表示比特幣;j = 1表示比特幣測試鏈;j = 60表示以太坊。
n = Account,n = 0表示第一個帳戶;n = 1表示第二個帳戶。
o = Change,o = 0表示用於收款的外部鏈(External Chain);o = 1表示用於更改地址的內部鏈(Internal Chain)。
p = Index,p = 0表示第一組地址;p = 1表示第二組地址。


結論

本篇介紹了什麼是HD Wallet,以及BIP-0032、BIP-0039、BIP-0043、BIP-0044改進提案,而我們可以根據BIP-0044簡易的得知:若我們想取得以太坊的第一組帳號中用於收款之第一組地址Key Tree即為m / 44' / 60' / 0' / 0 / 0。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;