當前位置:
首頁 > 最新 > 虛擬貨幣錢包從 BIP32、BIP39、BIP44到Ethereum HDWallet

虛擬貨幣錢包從 BIP32、BIP39、BIP44到Ethereum HDWallet

錢包是很多人第一次接觸 Ethereum 或其他虛擬貨幣的地方。不管是用手機或瀏覽器的錢包,相信很多人都對一串陌生的單字感到好奇(而且很重要還要備份)。這是源自於Bitcoin中錢包的設計,採用這套機制的錢包通常稱為HD Wallet本篇希望簡述 HD Wallet 的架構,再使用 JavaScript 套件從頭創建一個 Ethereum HD Wallet


虛擬貨幣錢包

錢包顧名思義是存放$$$。但在虛擬貨幣世界有點不一樣,我的帳戶資訊(像是我有多少錢)是儲存在區塊鏈上,實際存在錢包中的是我的帳戶對應的key。有了這把 key 我就可以在虛擬貨幣世界證明我的身份、就可以更改我帳戶的狀態(像是送錢給別人)。這樣來說,虛擬貨幣錢包實際上是管理和儲存 key 的工具。這把 key 就是我的私鑰,而帳戶是從我的公鑰衍伸出來。

-Ledger 虛擬貨幣錢包-


BIP 全名是Bitcoin Improvement Proposals,是提出 Bitcoin 的新功能或改進措施的文件。可由任何人提出,經過審核後公布在 bitcoin/bips 上。BIP 和 Bitcoin 的關係,就像是 RFC 之於 Internet。

而其中的BIP32, BIP39, BIP44 共同定義了目前被廣泛使用的 HD Wallet,包含其設計動機和理念、實作方式、實例等。

BIP32:定義Hierarchical Deterministic wallet (簡稱 "HD Wallet"),是一個系統可以從單一個seed產生一樹狀結構儲存多組 keypairs(私鑰和公鑰)。好處是可以方便的備份、轉移到其他相容裝置(因為都只需要 seed),以及分層的許可權控制等。

-BIP32 定義的 HD Wallet-

BIP39:將seed用方便記憶和書寫的單字表示。一般由12 個單字組成,稱為mnemonic code(phrase),中文稱為助記詞或助記碼。例如:

BIP44:基於 BIP32 的系統,賦予樹狀結構中的各層特殊的意義。讓同一個 seed 可以支援多幣種、多帳戶等。各層定義如下:

其中的 固定是 ,代表使用 BIP44。而 用來表示不同幣種,例如 Bitcoin 就是 ,Ethereum 是 。


Ethereum 的錢包目前均採用以上 Bitcoin HD Wallet 的架構,並訂 為 ,可以在 ethereum/EIPs/issues 中看到相關的討論。舉例來說,在一個 Ethereum HD Wallet 中,第一個帳戶(這裡的帳戶指 BIP44 中定義的 )的第一組 keypair,其路徑會是 。


使用的 JavaScript 套件包含:

bip39:實作 BIP39,隨機產生新的 mnemonic code,並可以將其轉成 binary 的 seed。

ethereumjs-wallet:產生和管理公私鑰,我使用其中的 hdkey 子套件來創建 HD Wallet。

ethereumjs-util:集合許多 Ethereum 需要的運算功能。


取得的 mnemonic code 會像:


先將 mnemonic code 轉成 binary 的 seed。

使用 seed 產生 HD Wallet。如果要說更明確,就是產生Master Key並記錄起來。


產生 Wallet 中第一個帳戶的第一組 keypair。可以從 Master Key,根據其路徑 推導出來。

使用 keypair 中的公鑰產生 address。

取得的 Address:

Encoding Address

Ethereum 很貼心,為了避免大家打錯 address(導致把錢送錯人),Ethereum 讓 Address 變得比較難打?!總之一般會用 EIP55: Mixed-case checksum address encoding 再進行編碼。許多錢包也支援用戶輸入沒經過編碼的 Address,那就會跳過 checksum 機制,建議還是使用編碼過的 Address。

最後取得的 Address 會像:


輸入 mnemonic code

-產生 Address、公鑰、私鑰,結果和我取得的 Address -


把 mnemonic code 記錄下來好好保存,就會是一個冷錢包(指不連網路的錢包,所以安全很多)。可以使用產生出來的 address 收 Ether 或任何 REC20 Token。要送錢的話,可以匯入到任一個支援 Ethereum HD Wallet 的錢包。常用的 Ethereum HD wallet 像,在瀏覽器使用的 MyEtherWallet、MetaMask 和在手機使用的 imToken 等。

-MetaMask-


相信大家都了解了,有 mnemonic code 就可以產生 HD Wallet 中所有的 keys。有了 keys 就可以任意送錢包中的 Ether 或 Token 給別人。所以 mnemonic code 很重要!!!那這麼重要的東西保存在瀏覽器不會很危險嗎?我便研究下我常用的 MetaMask 瀏覽器錢包。MetaMask 將加密後的 mnemonic code 存在瀏覽器的 Local Storage(一塊只存在 Local 且不會過期的資料區塊)。加密使用用戶另外輸入的密碼,再匯入時會要求用戶設定密碼(如上圖),而每一次重新開啟錢包都會要求輸入密碼。解密演算法有 Open Source,也有線上 Live Demo。

-MetaMask Local Storage-


Standardizing of HD wallet derivation paths (BIP32, BIP39, BIP44)

HD Wallet by 徐粲邦


ethers.js

ethereum-bip44

truffle-hdwallet-provider

ethjs

感謝 Jiyi 大大提供密碼學專業知識,雖然詳細的數學計算本篇沒有提到,但讓我有底氣的完成這篇文章。

作者:安德森_Anderson

本文首發於簡書,EthFans 經作者授權後轉載。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 以太坊愛好者 的精彩文章:

以太坊正在為下一次硬分叉做準備·以太坊核心開發者第32次例會

TAG:以太坊愛好者 |