- 1. 確定性錢包
- 2. 助記詞 (BIP-39)
- 3. 拓展公鑰和私鑰
- 4. 硬化密鑰派生
- 5. HD 錢包密鑰標識符(路徑)
- 6. 從種子開始生成 HD 錢包
- 7. 子密鑰衍生函數(Child Key Derivation, CKD)
- 8. 擴展密鑰(extended key)
- 9. HD Wallet 的分層密鑰生成結構圖
- 10. 參考:
博客鏈接:https://hello2mao.github.io/2019/11/18/deterministic-wallet/
1. 確定性錢包
確定性錢包
是指那些所有的私鑰都是通過一個普通的種子使用一個單向哈希函數延伸而來的錢包。
在一個確定性錢包中:
- 一個種子就足夠恢復出所有派生的密鑰,因此只需要在創建的時候做一次備份就可以了。
- 這個種子對於錢包來說也是可以導入導出的,可以讓所有用戶的密鑰在各種不同的錢包之間進行簡單的遷移。
確定性錢包
最高級的實現就是由比特幣的 BIP-32 標準定義的 HD錢包
HD 錢包包含的密鑰來源於一個樹形的結構,例如一個父密鑰可以派生出一系列子密鑰,每一個子密鑰又可以派生出一系列孫子密鑰,不停的循環往復,沒有盡頭。
2. 助記詞 (BIP-39)
BIP-39 標準定義了助記詞編碼和種子的生成過程。
整個過程分成了兩個部分:第一步到第六步在生成助記詞,第七步到第九步在助記詞到種子。
詳見:助記詞 (BIP-39)
BIP-39 標準允許用戶在生成種子的時候使用可選密碼。
3. 拓展公鑰和私鑰
在 BIP-32 的術語中,一個父密鑰可以拓展的生成「兒子」,這個兒子就是拓展密鑰。
如果它是一個私鑰,那麼它就是一個拓展私鑰,並通過前綴 xprv 來區分;一個拓展公鑰通過前綴 xpub 來區分。
無論什麼情況只要部署的服務和應用有一份拓展公鑰並且沒有私鑰,那麼這個快捷方式就可以創建非常安全的公鑰。這種部署可以生成無窮個公鑰和以太坊地址,但是卻不能花費任何發送到這些地址的資金。同時,在另外一個更安全的服務器上,拓展私鑰可以派生出所有相關的私鑰用來給交易簽名,並花費資金。
利用這種解決方案的一個常見的應用就是在一個 web 服務器上安裝一個拓展公鑰,來爲電子商務應用服務。這個網頁服務器可以使用公鑰派生函數爲每一筆交易(例如客戶的購物車)創造出一個全新的以太坊地址。這個網頁服務器沒有任何私鑰所以盜賊也無法竊取。不使用 HD 錢包的情況下,想做到這個程度唯一的方法就是在一個分割的安全服務器上生成上千個以太坊地址然後在電子商務服務器上預加載他們。這個方法低效笨重,並且需要經常的維護以確保電子商務服務器不會泄露密鑰。
還有一個常見的應用就是冷存儲和硬件錢包。在這種場景下,拓展私鑰可以存儲在硬件錢包中,但是拓展公鑰可以放在線上。用戶可以按照他們的意願創建接收的地址,私鑰則會離線安全的保存。想花掉裏面的資金的話,用戶可以在離線簽名的以太坊客戶端或者支持交易簽名的硬件錢包上使用拓展私鑰。
4. 硬化密鑰派生
如果不想承受泄露你自己鏈碼風險,並且還想要方便的使用 xpub 來派生出公鑰分支,那麼你應該通過硬化父輩來派生它,而不是一個正常的父輩。這其中的最佳實踐就是,爲了防止威脅到主要的密鑰,主要密鑰的 level-1 子輩總是通過硬化派生來派生。
5. HD 錢包密鑰標識符(路徑)
HD path | Key described |
---|---|
m/0 |
主私鑰 m 的第一個(0)兒子私鑰 |
m/0/0 |
第一個子輩(m/0)的第一個孫子私鑰 |
m/0'/0 |
第一個硬化子輩 (m/0') 的第一個標準孫子 |
m/1/0 |
第二個子輩(m/1)的第一個孫子私鑰 |
M/23/17/0/0 |
第 24 個子輩的第 18 個孫子輩的第一個曾孫輩的第一個玄孫的公鑰 |
6. 從種子開始生成 HD 錢包
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3ogpEGmx-1575378259682)(https://stevenocean.github.io/2018/09/23/generate-hd-wallet-by-bip39/generate-hd-master-key.jpg)]
7. 子密鑰衍生函數(Child Key Derivation, CKD)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-EOe6YWaz-1575378259683)(https://stevenocean.github.io/2018/09/23/generate-hd-wallet-by-bip39/hd-key-derivation-bip32.jpg)]
8. 擴展密鑰(extended key)
將 密鑰 Key 和 Chain Code 結合起來稱爲 擴展密鑰(extended key),可以通過 擴展密鑰 來生成自其而下的所有分支。
擴展密鑰 中提供的密鑰可以爲 私鑰 或者 公鑰,和 鏈碼 結合起來分別稱爲 擴展私鑰(extended private key) 和 擴展公鑰(extended public key),並且分別記爲 (k, c) 和 (K, c),其中公鑰 K = point(k)。
9. HD Wallet 的分層密鑰生成結構圖
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tvgIC6FI-1575378259684)(https://stevenocean.github.io/2018/09/23/generate-hd-wallet-by-bip39/generate-hd-wallet.jpg)]