放個我寫的以太坊bip44實現: https://github.com/wuminzhe/ethereum_bip44.rbhtml
bip32約定,主密鑰(master private key)是從一個種子值生成的,步驟以下:git
從(P)RNG生成所選長度(128到512位;建議256位)的種子字節序列S。github
計算I = HMAC-SHA512(Key =「Bitcoin seed」,Data = S)算法
將I分爲兩個32字節序列,IL和IR。編程
使用parse256(IL)做爲主密鑰,IR做爲主鏈碼.安全
BIP44中定義的標準key派生結構:數據結構
Master key / Purpose Code(44) / Coin Code / Account Index / Change Address(Boolean) / Child Index
先生成一個512位僞隨機數,而後對這個僞隨機數使用HMAC-SHA512哈希算法,獲得一個512位的值,左半邊的256位就是master private key,右半邊的256位做爲chain code用於key的派生。編程語言
爲了派生出一個child private key,master private key 和 chain code 和 index 一塊兒被哈希成一個新的512位的值,而後這個值的左邊是child private key,右邊是child chain code. 工具
上面的過程其實就是hardened派生,就是private key參與的派生叫作hardened派生。佈局
另一種派生就是public key參與的派生,這裏描述下過程:
從private key能夠獲得public key,而後public key 和 chain code 和 index 一塊兒被哈希成一個新的512位的值,而後這個值的左邊是child public key,右邊是child chain code.
這種派生的好處是安全,不須要private key就能生成須要的n多地址。
這就是Hardened 派生的標誌
BIP-0032: https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
This document describes hierarchical determinstic wallets (or "HD Wallets"): wallets which can be shared partially or entirely with different systems, each with or without the ability to spend coins.
BIP-0039: https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
This BIP describes the implementation of a mnemonic code or mnemonic sentence -- a group of easy to remember words -- for the generation of deterministic wallets.
BIP-0044: https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki
This BIP defines a logical hierarchy for deterministic wallets based on an algorithm described in BIP-0032 (BIP32 from now on) and purpose scheme described in BIP-0043 (BIP43 from now on).
-----------------------------------------------------------------------------
錢包是用於發送和接受代幣的客戶端,就像咱們使用郵箱來管理本身的郵件,咱們須要一個客戶端來管理本身的代幣。錢包的本質是保管私鑰的工具,私鑰就是一串很長的數字和字母組合的字符串,這個字符串讓你有權力把本身的數字貨幣送給別人,換句話說,不管誰知道你的私鑰,均可以控制你的數字貨幣。私鑰也用於生成你的代幣地址 - 這就像郵箱地址,只有知道地址才能給別人發送代幣。然而,儘管代幣地址是經過私鑰生成的,可是沒有辦法經過檢查數字貨幣地址來肯定私鑰是什麼。總而言之,錢包的核心功能是私鑰的建立、存儲和使用。
私鑰不一樣的生成方法,也對應着不一樣的錢包結構,一般能夠分爲非肯定性錢包和肯定性錢包。比特幣最先的客戶端(Satoshi client)就是非肯定性錢包,錢包是一堆隨機生成的私鑰的集合。 客戶端會預先生成 100 個隨機私鑰,而且每一個私鑰只使用一次。每一個交易使用一個地址的概念是中本聰提出的。若是交易比較頻繁,私鑰可能會用光,而後再產生一批私鑰,因此每次完成 100 個交易後,你必須備份新的 wallet.dat 文件,不然可能會丟失資產。這種錢包難以管理和備份。若是你生成不少私鑰,你必須保存它們全部的副本。這就意味着這個錢包必須被常常性地備份。每一個私鑰都必須備份,不然一旦錢包不可訪問時,沒法找回錢包。
肯定性錢包則不須要每次轉帳都要備份,肯定性錢包的私鑰是對種子進行單向哈希運算生成的,種子是一串由隨機數生成器生成的隨機數。在肯定性錢包中,只要有這個種子,就能夠找回全部私鑰,只需備份種子就至關於備份您的全部錢包,因此這個種子也至關重要,必定要備份到安全的地方。
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 錢包很是強大,用戶只須要保存一個種子,就能控制全部幣種,全部帳戶的錢包。
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。
目前已知以太坊客戶端的具體實現:
最後
使用單個地址錢包,你的全部交易都將與單個地址相關聯,因爲區塊鏈全部的交易記錄都是公開的,因此任何人均可以看到看到每一個地址的全部交易記錄以及帳戶餘額。HD 錢包經過在發送和接收資金時可以生成新地址,大大提升隱私性,使你的交易難以追蹤。固然匿名性是相對的,如今咱們也有隱私性更好的零知識證實算法。HD 錢包是生成不重複使用地址的方法 ,記住一個種子就能夠訪問全部地址的錢而不須要每一個地址都備份私鑰。固然HD 錢包不只適用於比特幣,HD 錢包可讓一個錢包同時管理多資產成爲可能性。