比特幣錢包開發:開發比特幣錢包不得不瞭解的概念

買賣虛擬貨幣

目標

本章的內容是理解比特幣錢包開發中非常重要的概念。

  1. 理解錢包、賬號、地址、公鑰、私鑰、密碼、助記詞
  2. 理解HD錢包是什麼
  3. 清楚BIP協議的常見版本的作用
  4. 清楚Base58在比特幣賬號中的重要性

一、錢包應用程式

1. 錢包

  • 錢包不是賬號,錢包是一個應用程式,主要用於管理賬號、保管私鑰、傳送和接受代幣的客戶端。
  • 錢包中可以有很多賬號,賬號也能匯入不同的錢包。

2. 賬號

  • 每個賬戶都是由一對鑰匙組成:公鑰和私鑰。每個賬戶都對應一個地址。
  • 賬戶由錢包來管理,一個錢包可以包含多個賬戶。
  • 賬號與公鑰、私鑰、地址,在以太坊中是一一對應的,而在有的區塊鏈中賬號與公私鑰對、地址不是一一對應的,比如:EOS

3. 地址

  • 地址長度為25位元組,轉為base58編碼後,為34或35個字元,如:1PFjZSK9GEGoGKt3aTDZU2o7kBC4W815pC。
  • base58是類似base64的編碼,但去掉了易引起視覺混淆的字元,又在地址末尾新增了4個位元組校驗位。
  • 由於存在公鑰有兩種形式,那麼一個公鑰便對應兩個地址,這兩個地址都可由同一私鑰簽署交易。
  • 地址標記著一個賬號,可以公開給別人,用於別人給你轉賬。
  • 地址不是公鑰,地址是由公鑰生成,公鑰由私鑰生成,這兩個過程是不可逆的,即地址不能推算出公鑰,公鑰也不能推算出私鑰。

4. 公鑰

  • 公鑰壓縮格式是33位元組,非壓縮格式是65位元組。即壓縮格式是66位長度的十六進位制,非壓縮格式是130位長度的十六進位制字元組成。以0x02/0x03開頭為壓縮公鑰。早期比特幣均使用非壓縮公鑰,現大部分客戶端已預設使用壓縮公鑰。
  • 公鑰對賬號的交易進行加密。即使用公鑰簽名交易,然後使用私鑰去驗證交易。
  • 公鑰是透過使用secp256k1橢圓曲線加密演算法計算私鑰所對應的公鑰獲得。
  • 公鑰、私鑰、地址,它們是一一對應的,唯一的,不可修改的。

5. 私鑰

  • 私鑰由64位長度的十六進位制的字元組成,比如:0xE4356E49C88C8B7AB370AF7D5C0C54F0261AAA006F6BDE09CD4745CF54E0115A
  • 私鑰一定要妥善保管,不能被公開和洩漏,擁有私鑰就相當於擁有此賬號的使用權。
  • 私鑰有可由助記詞推匯出來。

6. 密碼

密碼不是私鑰,密碼可以進行修改或重置。在錢包應用程式中,建立賬號時需要設定一個密碼,這個密碼一般要求不少於 8 個字元,為了安全,密碼最好設定複雜一點。

7. 助記詞

私鑰是64位長度的十六進位制的字元,不利於記錄且容易記錯,且每個賬號對應一個私鑰,多個賬號就有多個私鑰,不易管理,所以用演算法將一串隨機數轉化為了一串12 ~ 24個容易記住的單詞,方便儲存記錄。所以有的同學有了下面的結論:

  • 助記詞是私鑰的另一種表現形式。
  • 還有同學說助記詞=私鑰,這是不正確的說法,透過助記詞可以獲取相關聯的多個私鑰,但是透過其中一個私鑰是不能獲取助記詞的,因此助記詞≠私鑰。

8. 總結

錢包應用程式用於管理多個賬號,在比特幣中賬號與公私鑰對、地址是一一對應的,公鑰、私鑰、地址也是一一對應的,私鑰生成公鑰,公鑰生成地址,且不可逆,私鑰是賬號的核心且不可洩漏,地址可以公開用於轉賬。關於子賬號的介紹稍後說明。

二、HD錢包

這個HD錢包,並不是Hardware Wallet硬體錢包,這裡的 HD 是Hierarchical Deterministic的縮寫,意思是分層確定性,所以HD錢包的全稱為比特幣分成確定性錢包 。比特幣中的錢包就是非確定性錢包,BIP32是 HD錢包的標準定義,由種子派生生成多個私鑰。

1. BIP

BIP是協議,是Bitcoin Improvement Proposals的縮寫,意思是Bitcoin 的改進建議,用於提出 Bitcoin 的新功能或改進措施。BIP協議衍生了很多的版本,主要有BIP32、BIP39、BIP44。

BIP32

BIP32是 HD錢包的核心提案,透過種子來生成主私鑰,然後派生海量的子私鑰和地址,種子是一串很長的隨機數。

BIP39

由於種子是一串很長的隨機數,不利於記錄,所以我們用演算法將種子轉化為一串12 ~ 24個的單詞,方便儲存記錄,這就是BIP39,它擴充套件了 HD錢包種子的生成演算法。

BIP44

BIP44 是在 BIP32 和 BIP43 的基礎上增加多幣種,提出的層次結構非常全面,它允許處理多個幣種,多個帳戶,每個帳戶有數百萬個地址。

在BIP32路徑中定義以下5個級別:

m/purpse'/coin_type'/account'/change/address_index
  • purpose:在BIP43之後建議將常數設定為44'。表示根據BIP44規範使用該節點的子樹。
  • Coin_type:幣種,代表一個主節點(種子)可用於無限數量的獨立加密幣,如比特幣,Litecoin或Namecoin。此級別為每個加密幣建立一個單獨的子樹,避免重用已經在其它鏈上存在的地址。開發人員可以為他們的專案註冊未使用的號碼。幣種列表
  • Account:賬戶,此級別為了設定獨立的使用者身份可以將所有幣种放在一個的帳戶中,從0開始按順序遞增。
  • Change:常量0用於外部鏈,常量1用於內部鏈,外部鏈用於錢包在外部用於接收和付款。內部鏈用於在錢包外部不可見的地址,如返回交易變更。
  • Address_index:地址索引,按順序遞增的方式從索引0開始編號。

BIP44的規則使得 HD錢包非常強大,使用者只需要儲存一個種子,就能控制所有幣種,所有賬戶的錢包,因此由BIP39 生成的助記詞非常重要,所以一定安全妥善保管,那麼會不會被破解呢?如果一個 HD 錢包助記詞是 12 個單詞,一共有 2048 個單詞可能性,那麼隨機的生成的助記詞所有可能性大概是5e+39,因此幾乎不可能被破解。

2. 種子

種子可以派生生成多個私鑰,所以種子是一個錢包賬號中最關鍵的資料,比私鑰的等級更高,因此備份一個種子就備份了相關聯的所有私鑰。HD錢包中包含了在樹結構中派生的金鑰,這樣一來,父金鑰就可以派生出一系列子金鑰,每個金鑰都可以派生出一系列的子金鑰,從而達到無限的深度。

三、Base58編碼

1. Base64編碼

Base64就是一種基於64個可列印字元來表示二進位制資料的方法

  • Base64使用了26個小寫字母、26個大寫字母、10個數字以及兩個符號(例如“+”和“/”),用於在電子郵件這樣的基於文字的媒介中傳輸二進位制資料。
  • Base64通常用於編碼郵件中的附件。

Base64字符集:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

2. Base58編碼

Base58是一種基於文字的二進位制編碼格式,是用於Bitcoin中使用的一種獨特的編碼方式,主要用於產生Bitcoin的錢包地址。

  • 相比Base64,Base58不使用數字"0",大寫字母"O",大寫字母"I"和小寫字母"l",以及"+"和"/"符號。目的就是去除容易混淆的字元。
  • 這種編碼格式不僅實現了資料壓縮,保持了易讀性,還具有錯誤診斷功能。

Base58字符集:

ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz123456789

3. Base58Check

Base58Check是一種常用在比特幣中的Base58編碼格式,增加了錯誤校驗碼來檢查資料在轉錄中出現的錯誤。在Base58Check中,對資料新增了一個稱作“版本位元組”的字首,這個字首用來明確需要編碼的資料的型別。

  1. 首先對資料新增一個版本字首,這個字首用來識別編碼的資料型別。例如,比特幣地址的字首是0(十六進位制是0x00)。
  2. 對資料連續進行兩次SHA256雜湊演算法checksum = SHA256(SHA256(prefix+data))
  3. 在產生的長度為32個位元組(兩次雜湊雲算)的雜湊值中,取其前4個位元組作為檢驗和新增到資料第一步產生的資料之後。
  4. 將資料進行Base58編碼處理

Base58Check的編碼過程如下圖。

Base58Check的作用:

  • 既然有了Base58編碼,已經不會搞錯0和O, 1和l和I,也把大整數轉換成了可讀字串,為什麼還要再有Base58Check這個環節呢?
  • 假設一種情況,你在程式中輸入一個Base58編碼的地址,儘管你已經不會搞錯0和O, 1和l和I,但是萬一你不小心輸錯一個字元,或者少寫多寫一個字元,會咋樣?你可能會說,沒啥大不了的,錯個字元而已,這不是很常見嘛,重新輸入不就可以了嗎?但是當使用者給一個比特幣地址轉賬,如果輸入錯誤,那麼對方就不會收到資金,更關鍵的是該筆資金髮給了一個根本不存在的比特幣地址,那麼這筆資金也就永遠不可能被交易,也就是說比特幣丟失了。
  • 校驗碼長4個位元組,新增到需要編碼的資料之後。
  • 校驗碼是從需要編碼的資料的雜湊值中得到的,所以可以用來檢測並避免轉錄和輸入中產生的錯誤。
  • 使用Base58check編碼格式時,程式會計算原始資料的校驗碼並和自帶的校驗碼進行對比,二者若不匹配則表明有錯誤產生。
  • 實際上,在比特幣交易中,都會校驗比特幣地址是否合法,如果經過Base58Check的比特幣地址被比特幣錢包程式判定是無效的,當然會阻止交易繼續進行,就避免了資金損失。

免責聲明:

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

推荐阅读

;