此文章非教學非分享!

純粹筆記,所有內容皆會備註來源。

重要觀念

在加密貨幣的世界中,錢包並非儲存加密貨幣的地方,資產是在鏈上私鑰通過橢圓曲線生成公鑰, 公鑰通過雜湊函式生成地址,這兩個過程都是單向的。數字錢包實際上是一個管理私鑰(生成、儲存、簽名)的工具

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

來源:https://ithelp.ithome.com.tw/articles/10201358

HD Wallet 是什麼

  • HD Wallet 被 BIP-0032、BIP-0039、BIP-0043、BIP-0044 改進提案所共同定義,包含了錢包的設計動機、理念、實作方式等。
  • 比特幣有兩種主要類型的錢包,區別在於它們包含的多個密鑰是否相互關聯,如下:
  1. 第一種類型是非確定性錢包(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

  • 錢包地址的演算推導及改進過程請參考下方來源

來源:https://medium.com/cryptocow/%E8%A9%B3%E8%A7%A3-hd-wallet-bip-0032-bip-0039-bip-0043-%E5%8F%8A-bip-0044-67e53534bbb0

安全性問題

根據上圖 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 提案進行改進

來源:https://www.itread01.com/content/1542614830.html

Golang 實作創建 HD Wallet

這次用到的 Package 是
https://github.com/miguelmota/go-ethereum-hdwallet

以下為我根據上方套件消化之後得到的可執行程式碼
步驟跟中文解釋都寫在程式碼裡面了

為了在我的小螢幕能截滿整張圖,請原諒我程式碼擠在一起 XD

運行結果如下

我有上傳到 Github ,需要研究或執行可以下載
https://github.com/xup6m6fu04/hd-wallet

驗證結果

Mnemonic Code Converter

只要填入 Mnemonic code 然後下方 Coin 的部分選擇 ETH
看看第0組跟第1組地址是不是跟我上面程式執行結果一樣

可以看到第 0 組地址一樣都是
0x842b6114695F9Ef31c0c5914851495947f375241
就沒錯了

此文為筆記,有錯希望各路大大可以糾正