1. 程式人生 > >區塊鏈學習(2)錢包

區塊鏈學習(2)錢包

rar 結構 nic 通過 可能 如果 基本 方式 樹狀

比特幣中的錢包並不包含比特幣,只包含私鑰,每一個用戶有一個包含多個私鑰的錢包。錢包中包含成對的私鑰和公鑰。用戶用這些私鑰來簽名交易。可以說錢包是私鑰的容器。

最開始的錢包只儲存隨機生成的私鑰。這種類型的錢包被稱作零型非確定錢包。從名字中就可以看出,這種錢包從最開始就生成足夠多的私鑰,私鑰都是隨機產生的。但這種錢包的缺點很明顯,為了增加安全性,每次交易都使用不同的地址,而一個私鑰對應一個地址,可以看下圖。

技術分享圖片

就是如果你生成很多私鑰,你必須保存它們所有的副本。錢包中的每一把鑰匙都必須備份。非確定性的錢包私鑰之間是沒有任何關系的,所以你需要備份所有不同的私鑰,十分麻煩。而確定性錢包就很好的解決了這個問題,確定性錢包也稱為種子錢包。這個錢包的特點就是隨機生成一個的種子數,這個種子便可以通過哈希方程計算出很多私鑰,於是只要備份一個種子就行了。

助記碼詞匯對應確定性錢包的種子。一般由12、15、18、21個單詞構成,這些單詞都取自一個固定詞庫,其生成順序也是按照一定算法而來。也可以被用來恢復以及重新創造應用程序相同或者兼容的錢包的鑰匙。助記碼代碼可以讓使用者復制錢包更容易一些, 因為助記詞比私鑰更容易記憶。PBKDF2 (Password-Based Key Derivation Function 2) 的基本原理是通過一個為隨機函數(例如 HMAC 函數),把明文和鹽值作為輸入參數,然後重復進行運算最終產生密鑰。

為了從助記詞中生成二進制種子,BIP39 采用 PBKDF2 函數推算種子,其參數如下:

  • 助記詞句子作為密碼
  • "mnemonic" + passphrase 作為鹽
  • 2048 作為重復計算的次數
  • HMAC-SHA512 作為隨機算法
  • 512 位(64 字節)是期望得到的密鑰長度

      技術分享圖片

種子錢包的一個優點就是只需要備份一個種子便可以恢復所有的私鑰。

現在大部分錢包都是HD錢包了,全稱the hierarchical deterministic wallet,私鑰衍生結構是樹狀結構,父密鑰可以衍生一系列子密鑰,每個子密鑰又可以衍生出一系列孫密鑰,以此類推,無限衍生。

      技術分享圖片

上圖就是HD錢包,與我們學過的數據結構中的多叉樹很像。生成一個子密鑰需要一個母私鑰或者公共鑰匙,一個叫做鏈碼(256 bits)的種子,一個索引號(32 bits)。這三個項目相結合並散列可以生成子密鑰,

技術分享圖片

這裏采用的也是單向的哈希函數,應此不能從子密鑰中推出母密鑰。上述方法中通過推導出的私鑰可推導出對應公鑰,但 HD 錢包優點之一就是在隱藏私鑰的前提下通過公鑰推導出子公鑰,這樣私鑰的離線儲存更加安全。具體來說,你的主私鑰是以紙錢包的方式備份的,並且離線存放在一個安全的地方。你手頭有主公鑰,用這個公鑰,你就可以生成所有的子公鑰。 舉個實際的例子,我們要開一個網店,接受比特幣付款。你可以離線存放你的私鑰,只需要提供公鑰,你的網站可以使用這個公鑰為網站上的每一個商品生成一個收款地址,或者給你的每個顧客生成一個唯一的地址。上次已經講過公鑰無法推出私鑰, 並且因為私鑰是離線存放的,沒人可以黑進你的服務器偷走比特幣。

但是這種推導方式存在問題。

  1. 雖然泄漏公鑰並不會導致丟幣,但含有公鑰的擴展密鑰泄漏會導致以此為根節點推導出來的擴展公鑰全部泄漏,一定程度上破壞了隱私性。
  2. 泄漏擴展公鑰加上該公鑰推導出的後任一代擴展公鑰對應的私鑰有被推導出該擴展公鑰的所有後代私鑰的可能性

BIP32 協議把 CKD 函數改為 HKD (hardened key derivation formula) 生成增強密鑰推導函數。

技術分享圖片

上圖就是采用HKD的推導過程,與之前未強化的推導過程相比不同的是是母私鑰被用來輸入散列方程中而不是母公鑰。

總而言之數字錢包到目前為止經歷了以下3個階段:非確定性錢,包確定性錢包,分層確定性錢包(HD錢包)目前HD錢包是主流,在使用HD錢包過程中,備好好助記詞非常重要!助記詞一旦丟失或被他人盜取,所有的私鑰都會不翼而飛。

區塊鏈學習(2)錢包