有關錢包、助記詞、私鑰

中杯星巴克
·
·
IPFS
·
了解錢包、助記詞與私鑰這三者之間的關係,是每個用戶踏入區塊鏈世界的第一道門檻。

了解錢包、助記詞與私鑰這三者之間的關係,是每個用戶踏入區塊鏈世界的第一道門檻。現在有很多服務「號稱」可以讓你用傳統的帳號密碼形式去管理錢包,而不用理解相對複雜的助記詞與私鑰的概念。但在我看來,這是一種自我閹割所有權的行為,極其的打咩。要說錢包就會涉及到密碼學,內容就會變得很多又很難,我們這邊只談最基本的部分。

強烈建議起碼要掌握〈簡介與分類〉的內容,並在日常上,搭配使用硬體錢包,這是你遨遊區塊鏈黑暗森林應有的起手裝備。


[ 簡介與分類 ]

首先,錢包就是一個私鑰的容器,最核心的功能就是生成、儲存、管理、使用私鑰。錢還是存在於區塊鏈之上,而並不是存在錢包中的。錢包是讓你可以透過其中的私鑰,去使用在鏈上的錢。

依有無連網區分:

  • 冷錢包:就是不連網的
  • 熱錢包:就是有連網的

依介質區分:

  • 紙錢包:在一張紙上寫著你的Public Key (address) 跟Private Key,現在基本被淘汰。
  • 硬體錢包:一個硬體設備,不會聯網(也就是冷錢包),裡面存著Private Key。比較知名的有Ledger、CoolWallet。
  • 軟體錢包:一般人最常用的錢包,可以再細分成三種:網路錢包:做成瀏覽器的extension的那種;桌面錢包:會有一個wallet.dat檔,裡面有密鑰;手機錢包:就是桌面錢包的手機版本。
紙錢包

依所有權區分:

  • Non-Custodial Wallets:自己掌控全部的所有權,例如手機上的MetaMask。
  • Custodial Wallets:有個第三方幫你代管,例如存放在幣安上的錢包。

依Private Key之間是否有從屬關係區分:

  • Non-Deterministic Wallet:非確定性錢包,就是隨機生成的一堆Private key的集合,密鑰與密鑰之間沒有從屬關係,所以又稱為JBOK(Just a Bunch Of Keys),也叫做Type 0。最早的比特幣錢包就是這一種,但很難管理,現在基本沒人在用。
  • Deterministic Wallet:確定性錢包,是先有一個種子,所有的密鑰都是從這個種子來的,所以又成為Seeded Wallet,也叫做Type 1。
  • Hierarchical Deterministic Wallet:Deterministic Wallet的一種,也是現在最主流的錢包類型。它的密鑰從同一個種子來,但密鑰之間還能有父子關係。例如一個種子,生出一個Master Key,Master Key可以生出很多Child Key,Child Key可以再生出很多GrandChild Key,子孫滿堂的概念。
  • 這種樹狀結構的好處是可以用來表達額外的意義。例如一個Master Key是一個集團,Child Key是一間子公司,然後有一個GrandChild Key專門用來支付,另一個GrandChild Key拿來收款。另一個好處是,我們可以創造很多GrandChild Key來用,但毋需用到最前面的種子,這樣就可以在不安全的環境下用來收款。

以最常見到的MetaMask錢包(aka 小狐狸錢包)舉例,它同時是:熱錢包、軟體錢包、Non-Custodial錢包、Hierarchical Deterministic錢包。

Source: Matamask.io

[ BIP-39 ]

  • Bitcoin Improvement Proposal 39 ,主流助記詞生成技術的標準
  • 這框架可以用不同語言實現,例如用Python的SatoshiLabs團隊、用JavaScript的bitcoinJS、用C++的Libbitcoin
  • 生成助記詞(以生成12個助記詞為例)
  1. 創建一個128 bits的隨機序列(entropy)
  2. 取SHA256 Hash後,把前四bits加在entropy的後面(現在有132 bits)
  3. 拆分為12個,每一個分段是11 bits
  4. 每11 bits 可以映射到有2048個單詞的預定義字典中的一個單詞,那就是你的助記詞了
  5. 同理,如果你想要有24個詞的助記詞,那一開始就要有256 bits的entropy
Source: <Mastering Bitcoin>

助記詞 → Private Key

  1. 助記詞Salt喂到一個PPBKDF2的函數中,它會給你512 bits長度的Output
  2. PPBKDF2是種使用HMAC-SHA512演算法的函數
  3. Salt可以想成一個自己給的密碼,不同Salt會生成不同的Output,不加也行,這機制就是多一層的保護
  4. 這512 bits的Output,有256 bits是Private Key本身,另外256 bits叫做Master Chain Code,是拿來要生其它小孩時的初始entropy
  5. 父生子的過程:專有名詞叫做Child Key Derivation (CKD),基本能理解成,拿{ Parent Private Key、Master Chain Code、Index Number },再去喂到PPBKDF2中,就能再生成一個512 bits的字串
  6. 這邊美妙的地方在於,Child Key之間不會互相知道,且不能回推出Parent Key
Source: <Mastering Bitcoin>

Private Key → Public Key →地址

  • 這三者之間有一個「單向」關係
  • Private Key → Public Key:透過橢圓曲線乘法,細節不展開,知道是種很難回推的算法就行了
  • Public Key →地址:透過兩次的Hash函數
Source: <Mastering Bitcoin>

綜上所述,在最主流的Hierarchical Deterministic Wallet的系統,是由BIP-39所定義的,其中,最重要的有四個環節:最一開始的entropy要足夠隨機、函數能讓output無法回推input、函數要能在保持隨機性的條件下把short input轉換成long output、函數要能添加額外的input來增加保護性。

CC BY-NC-ND 2.0

Like my work? Don't forget to support and clap, let me know that you are with me on the road of creation. Keep this enthusiasm together!