Ethereum HD Wallet 學習筆記
此文章非教學非分享!
純粹筆記,所有內容皆會備註來源。
重要觀念
在加密貨幣的世界中,錢包並非儲存加密貨幣的地方,資產是在鏈上私鑰通過橢圓曲線生成公鑰, 公鑰通過雜湊函式生成地址,這兩個過程都是單向的。數字錢包實際上是一個管理私鑰(生成、儲存、簽名)的工具
BIP 是什麼?
Bitcoin Improvement Proposals (BIPs)
What is a BIP? Explain the basic process of submitting, evaluating, and implementing a BIP. Review Github Bitcoin Improvement Proposals
比特幣改進提案(BIPs)
比特幣改進提案是開發者向比特幣社區提供建議的技術設計文檔,或用於描述比特幣的新功能,流程或環境。整個提案與確認流程如下圖:
根據 BIP-01 也就是 BIP 目的和指南(BIP Purpose and Guidelines)的規定,有三種 BIP :
- 標準類 BIP
描述影響大多數或所有比特幣系統的任何更改,例如網絡協議的更改,區塊或交易有效性規則的更改,或影響使用比特幣的應用程式的任何更改或優化。 - 資訊類 BIP
描述比特幣設計問題,或向比特幣社群提供一般準則或信息,但不提出新功能。資訊類 BIP 不一定代表比特幣社區的共識或建議,因此用戶和實施者可以忽略資訊類 BIP 或遵循他們的建議。 - 程序類 BIP
描述一個比特幣程序,或者提出一個程序的更改(或一個事件)。程序類 BIP 類似於標準類 BIP,但適用於比特幣協議本身以外的其他領域。他們可能會提出一個實現,但不是比特幣的代碼庫,且需要社區的共識。與資訊類 BIP不同,它們不僅僅是建議,用戶通常也不能隨意忽略它們。例如包括程序,指南,決策過程的變化以及對比特幣開發中使用的工具或環境的更改。
完整的 BIP 記錄在 GitHub 上:https://github.com/bitcoin/bips
HD Wallet 是什麼
- HD Wallet 被 BIP-0032、BIP-0039、BIP-0043、BIP-0044 改進提案所共同定義,包含了錢包的設計動機、理念、實作方式等。
- 比特幣有兩種主要類型的錢包,區別在於它們包含的多個密鑰是否相互關聯,如下:
- 第一種類型是非確定性錢包(nondeterministic wallet),其中每個密鑰都是從隨機數獨立生成的。密鑰彼此無關。這種錢包也被稱為『Just a Bunch Of Keys(一堆密鑰)』,簡稱JBOK錢包。
2. 第二種類型是確定性錢包(deterministic wallet),其中所有的密鑰都是從一個主密鑰派生出來,這個主密鑰即為種子(seed)。該類型錢包中所有密鑰都相互關聯,如果有原始種子,則可以再次生成全部密鑰。確定性錢包中使用了許多不同的密鑰推導方法。最常用的推導方法是使用樹狀結構,稱為分層確定性錢包或 HD 錢包。
- 『確定性』或稱『種子』錢包,包含可從公共的種子生成的私鑰,種子是隨機生成的數字。在確定性錢包中,種子足以恢復所有已經產生過的私鑰,所以只用在初始創建時的一個簡單備份就足以搞定。並且種子也足夠讓錢包導入或者導出。這就很容易允許使用者的私鑰在錢包之間輕鬆轉移。
- 在 BIP32 中定義了 Hierarchical Deterministic Wallet (HD Wallet),是一個系統可以從單一個 seed 產生一樹狀結構儲存多組 keypairs(私鑰和公鑰)。好處是可以方便的備份、轉移到其他相容裝置(因為都只需要 seed),以及分層的權限控制等。
來源:https://ithelp.ithome.com.tw/articles/10204963
- 錢包地址的演算推導及改進過程請參考下方來源
安全性問題
根據上圖 BIP-0032 提案可見
我們 HD Wallet 由於是一個主私鑰去生成主公鑰及無數的子公鑰及子私鑰
雖然好處只要保存主私鑰即可
但只要遺漏一個子私鑰搭配上主公鑰就有風險存在
來源:https://www.8btc.com/article/36233
簡易結論
為了解決初期的 JBOK 錢包大量私鑰問題,所以利用 BIP-0032 提案來解決根據一個隨機數種子通過分層確定性推導的方式得到 N 個私鑰,這樣儲存的時候,只需要儲存一個種子就可以,私鑰可以推導出來
BIP-0032 提案的名字是:Hierarchical Deterministic Wallets, 就是我們所說的 HD Wallet。後續像是 BIP-0039 則是再改進 BIP-0032 的內容,是助記詞,而 BIP-0043, BIP-0044 則是針對 BIP-0032 提案進行改進
Golang 實作創建 HD Wallet
這次用到的 Package 是
https://github.com/miguelmota/go-ethereum-hdwallet
以下為我根據上方套件消化之後得到的可執行程式碼
步驟跟中文解釋都寫在程式碼裡面了
運行結果如下
我有上傳到 Github ,需要研究或執行可以下載
https://github.com/xup6m6fu04/hd-wallet
驗證結果
Mnemonic Code Converter
可以看到第 0 組地址一樣都是
0x842b6114695F9Ef31c0c5914851495947f375241
就沒錯了
此文為筆記,有錯希望各路大大可以糾正