基於Vue開發的以太坊開源HD錢包Vuethwallet原始碼分析
前言
隨著區塊鏈越來越火熱,數字貨幣錢包也隨之被人重視。數字錢包的發展歷程是從最初比特幣的非確定性錢包,到確定性錢包,一直到我們現在最廣為使用HD分層確定性錢包,而今天要分析的錢包就是現在最為流行的HD分層確定性錢包。
HD錢包的英文全稱是:Hierarchical Deterministic 之所以叫分層確定性錢包是因為私鑰的衍生結構是樹狀結構,父金鑰可以衍生一系列子金鑰,每個子金鑰又可以衍生出一系列孫金鑰,以此類推,無限衍生。在建立錢包或者備份錢包的時候都會看到一堆英文單詞(或者中文漢字),這些詞就是助記詞。
一、錢包介紹
1.1 功能
(1)Vuethwallet => 普通錢包,隨機生成助記
(2)Seed Wallet => 自定義助記詞錢包Import
(3)Wallet => 匯入錢包(匯入Keysotre) Value
(4)Transaction => 匯入錢包並進行交易
1.2 特色
( 1 ) 該錢包的特點就是簡單,只具備一個數字錢包最基本的功能:金鑰管理(私鑰的 生成 + 匯入 + 備份)和交易。
金鑰生成主要使用原生的bip-39庫生成助記詞(可自定義助記詞或隨機助記詞)然後進一步生成私鑰
( 2 ) 因為使用的是原生的庫進行私鑰生成,私鑰生成過程會比較接觸底層
備份使用Keystore進行儲存
( 3 ) 以太坊的 keystore檔案Linux 系統儲存在/home_path/.ethereum/keystore或者Windows系統儲存在C:\Users\Appdata/Roaming/Ethereum/keystore)是你獨有的、用於簽署交易的以太坊私鑰的加密檔案。如果你丟失了這個檔案,你就丟失了私鑰,意味著你失去了簽署交易的能力,意味著你的資金被永久的鎖定在了你的賬戶裡。
這裡是一個Keystore例子:
交易使用 web3.jsAPI 進行交易
web3.js是以太坊提供的一個Javascript庫,它封裝了以太坊的JSON RPC API,提供了一系列與區塊鏈互動的Javascript物件和函式,包括檢視網路狀態,檢視本地賬戶、檢視交易和區塊、傳送交易、編譯/部署智慧合約、呼叫智慧合約等,該錢包交易功能比較簡單,沒有一些完備錢包所具有的功能比如餘額查詢,Gas價格查詢等,但足以學習所用
二、錢包的程式碼架構
主要檔案
本文主要對錢包建立以及交易處理部分進行詳細分析,其他程式碼有興趣可自行深入:
(1)index.html ==> 主頁,只有一個大框架,並無實際內容,靠js進行填充
(2)/src/views/main.js ==> 入口主程式,將App.vue插入到index.html
(3)/src/views/App.vue ==> 主要元件,響應使用者點選並路由到相應的頁面
(4)/src/view/Wallet.vue ==> 建立普通錢包
(5)/src/view/WalletSeed.vue ==> 建立帶seed錢包
(6)/src/view/ImportKeystore.vue ==> 匯入錢包(Keystore)
(7)/src/view/ValueTransaction.vue ==> 交易處理
(8)/util/confirmedTransaction.js ==> 交易確認邏輯
(9)/node_modlues/zxcvb ==> 密碼強度校驗(分數計算)
三、程式碼分析
3.1 /src/view/Wallet.vue ==> 建立普通錢包(隨機助記詞)
3.1.3 newAddress(password,callback) ==> 頁面展示 + keystore檔案生成
Keystore檔案生成步驟:
使用者傳入password,使用金鑰生成函式(:kdf => “scrypt”)計算加密金鑰 => encryption key
利用加密金鑰對私鑰進行加密(:cipher => “aes-128-ctr”)得到私鑰加密後密文 => ciphertext
通過加密金鑰(左第二個位元組起的16個位元組)和ciphertext連線在一起進行雜湊雜湊(SHA3-256)計算得出校驗值 => mac
3.2 /src/view/WalletSeed.vue ==> 建立錢包(自定義助記詞)
3.4.2 傳送交易到網路函式分析
3.4.3 確認交易函式分析