分層確定性錢包 HD Wallet 介紹

買賣虛擬貨幣
錢包是用於傳送和接受代幣的客戶端,就像我們使用郵箱來管理自己的郵件,我們需要一個客戶端來管理自己的代幣。錢包的本質是保管私鑰的工具,私鑰就是一串很長的數字和字母組合的字串,這個字串讓你有權力把自己的數字貨幣送給別人,換句話說,無論誰知道你的私鑰,都可以控制你的數字貨幣。私鑰也用於生成你的代幣地址 - 這就像郵箱地址,只有知道地址才能給別人傳送代幣。然而,儘管代幣地址是透過私鑰生成的,但是沒有辦法透過檢查數字貨幣地址來確定私鑰是什麼。總而言之,錢包的核心功能是私鑰的建立、儲存和使用。

錢包的型別
私鑰不同的生成方法,也對應著不同的錢包結構,通常可以分為非確定性錢包和確定性錢包。比特幣最早的客戶端(satoshi client)就是非確定性錢包,錢包是一堆隨機生成的私鑰的集合。 客戶端會預先生成 100 個隨機私鑰,並且每個私鑰只使用一次。每個交易使用一個地址的概念是中本聰提出的。如果交易比較頻繁,私鑰可能會用光,然後再產生一批私鑰,所以每次完成 100 個交易後,你必須備份新的  wallet.dat  檔案,否則可能會丟失資產。這種錢包難以管理和備份。如果你生成很多私鑰,你必須儲存它們所有的副本。這就意味著這個錢包必須被經常性地備份。每個私鑰都必須備份,否則一旦錢包不可訪問時,無法找回錢包。

確定性錢包則不需要每次轉賬都要備份,確定性錢包的私鑰是對種子進行單向雜湊運算生成的,種子是一串由隨機數生成器生成的隨機數。在確定性錢包中,只要有這個種子,就可以找回所有私鑰,只需備份種子就相當於備份您的所有錢包,所以這個種子也相當重要,一定要備份到安全的地方。

什麼是 hd 錢包
hd 錢包是目前常用的確定性錢包 ,說到 hd 錢包,大家可能第一反應會想到硬體錢包 (hardware wallet),其實這裡的 hd 是 hierarchical deterministic(分層確定性)的縮寫。所謂分層,就是一個大公司可以為每個子部門分別生成不同的私鑰,子部門還可以再管理子子部門的私鑰,每個部門可以看到所有子部門裡的幣,也可以花這裡面的幣。也可以只給會計人員某個層級的公鑰,讓他可以看見這個部門及子部門的收支記錄,但不能花裡面的錢,使得財務管理更方便了。

分層確定性的概念早在 bip32 提案提出。根據比特幣核心開發者 gregory maxwell 的原始描述和討論,pieter wuille 在2012 年 02月 11日整理完善提交 bip32 。直到 2016年 6月 15 日 才被合併到 bitcoin core,目前幾乎所有的錢包服務商都整合了該協議。bip32 是 hd 錢包的核心提案,透過種子來生成主私鑰,然後派生海量的子私鑰和地址,但是種子是一串很長的隨機數,不利於記錄,所以我們用演算法將種子轉化為一串助記詞 (mnemonic),方便儲存記錄,這就是 bip39,它擴充套件了 hd 錢包種子的生成演算法。bip43 對 bip32 樹結構增加了子索引標識 purpose 的擴充套件  m/purpose'/ * 。 bip44 是在 bip43 和 bip32 的基礎上增加多幣種,透過 hd 錢包派生多個地址,可以同時管理主網和測試網的比特幣,bip44 提出了5層的路徑建議,如下:

m/purpse'/coin_type'/account'/change/address_index, 

bip44的規則使得 hd 錢包非常強大,使用者只需要儲存一個種子,就能控制所有幣種,所有賬戶的錢包。

比特幣 hd 錢包是如何生成的?

1. 生成一個助記詞(參見 bip39)
2. 該助記詞使用 pbkdf2 轉化為種子(參見 bip39)
3. 種子用於使用 hmac-sha512 生成根私鑰(參見 bip32)
4. 從該根私鑰,匯出子私鑰(參見 bip32),其中節點佈局由bip44設定

可以看出 bip39 生成助記詞的過程非常重要, 大家肯定關心 bip39 的安全性,如果一個 hd 錢包助記詞是 12 個單詞,一共有 2048 個單詞可能性,如何算出隨機的生成的助記詞所有可能性是一個排列問題,根據公式: n!/( n - r )! ,既 2048!/(2048-12)! = 5.2715379713014884760003093175282 e+39

我們可以舉個類比,地球上的沙子數量在大約是1 後面 18 個零。如果你可以每秒生成 一百萬個助記詞,那麼一年可以生成  1000000*60*60*24*365=3.1536e+13,大約需要  1.6715937e+26 年遍歷所有助記詞,這是多少年呢?

以太坊目前解決方案
以太坊在 eip84 討論,是否遵循 bip32 和 bip44,社羣裡提出來很多有意思的觀點,比特幣是基於 utxo 的,所以可以使用 hd 錢包(bip32)為每個交易分配一個新地址,以保護您的隱私。然而,以太坊是基於帳戶,每個帳戶都有一個地址,bip 是比特幣的提案,而且比特幣的資料結構的設計是圍繞改變地址的想法構建的,bip 的一些提案可能並不適合以太坊。以太坊的模式和比特幣utxo 不同,以太坊轉賬不能改變地址,如果在以太坊上實現 utxo ,使用者還必須簽名兩個交易以將餘額的一部分傳送到一個地址,將餘額的一部分傳送到第二個地址 - 這將使成本增加一倍,而且第二個交易可能不會在同一個區塊中,當然以太坊也可以透過智慧合約的方式實現。另外,以太坊目前官方錢包採用 kdf 的形式,也就是我們常說的 keystore 的形式。

在 eip85 的討論,以太坊社羣似乎預設也採用了 bip32 的做法,先來說一說 bip32 的好處

1. 使用時間長,已經接受社羣審查
2. 已經有多個程式語言的實現
3. 多個硬體錢包正在使用
4. 可以一個錢包,同時支援比特幣和以太坊

eip85  提議 hd 路徑為 :  m/44'/60'/a'/0/n

這裡 的 a 表示帳號,n 是第 n 生成的地址,60 是在 slip44 提案中暫定的,因為 bip44 只定義到 0 - 31。

目前已知以太坊客戶端的具體實現:

m/44'/60'/0'/0/x:  bip44,imtoken(可以自定義路徑),metamask,jaxx,myetherwallet,trezor,exodus
m/44'/60'/x'/0/0:bip44,keepkey,metamask
m/44'/60'/0'/x:electrum,ledger chrome app,
m/44'/coin_type'/account'/0:coinomi

最後
使用單個地址錢包,你的所有交易都將與單個地址相關聯,由於區塊鏈所有的交易記錄都是公開的,所以任何人都可以看到看到每個地址的所有交易記錄以及賬戶餘額。hd 錢包透過在傳送和接收資金時能夠生成新地址,大大提高隱私性,使你的交易難以追蹤。當然匿名性是相對的,現在我們也有隱私性更好的零知識證明演算法。hd 錢包是生成不重複使用地址的方法 ,記住一個種子就可以訪問所有地址的錢而不需要每個地址都備份私鑰。當然hd 錢包不僅適用於比特幣,hd 錢包可以讓一個錢包同時管理多資產成為可能性。

參考:
http://zhibimo.com/books/wang-miao/mastering-bitcoin
http://www.8btc.com/hd-wallets
http://www.8btc.com/how-to-use-hd-wallets

免責聲明:

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

推荐阅读

;