您的位置:首頁 > 軟件教程 > 教程 > 開發(fā)比特幣錢包不得不了解的概念

開發(fā)比特幣錢包不得不了解的概念

來源:好特整理 | 時間:2022-10-12 12:27:04 | 閱讀:189 |  標簽: 區(qū)塊鏈開發(fā) 疫情對比特幣的影響 比特幣錢包   | 分享到:

本章的內(nèi)容是理解比特幣錢包開發(fā)中非常重要的概念,理解錢包、賬號、地址、公鑰、私鑰、密碼、助記詞

理解HD錢包是什么

清楚BIP協(xié)議的常見版本的作用,清楚Base58在比特幣賬號中的重要性

一、錢包應用程序

1. 錢包

錢包不是賬號,錢包是一個應用程序,主要用于管理賬號、保管私鑰、發(fā)送和接受代幣的客戶端。

錢包中可以有很多賬號,賬號也能導入不同的錢包。

2. 賬號

每個賬戶都是由一對鑰匙組成:公鑰和私鑰。每個賬戶都對應一個地址。

賬戶由錢包來管理,一個錢包可以包含多個賬戶。

賬號與公鑰、私鑰、地址,在以太坊中是一一對應的,而在有的區(qū)塊鏈中賬號與公私鑰對、地址不是一一對應的,比如:EOS。

3. 地址

地址長度為25字節(jié),轉(zhuǎn)為base58編碼后,為34或35個字符,如:1PFjZSK9GEGoGKt3aTDZU2o7kBC4W815pC。

base58是類似base64的編碼,但去掉了易引起視覺混淆的字符,又在地址末尾添加了4個字節(jié)校驗位。

由于存在公鑰有兩種形式,那么一個公鑰便對應兩個地址,這兩個地址都可由同一私鑰簽署交易。

地址標記著一個賬號,可以公開給別人,用于別人給你轉(zhuǎn)賬。

地址不是公鑰,地址是由公鑰生成,公鑰由私鑰生成,這兩個過程是不可逆的,即地址不能推算出公鑰,公鑰也不能推算出私鑰。

4. 公鑰

公鑰壓縮格式是33字節(jié),非壓縮格式是65字節(jié)。即壓縮格式是66位長度的十六進制,非壓縮格式是130位長度的十六進制字符組成。以0*02/0*03開頭為壓縮公鑰。早期比特幣均使用非壓縮公鑰,現(xiàn)大部分客戶端已默認使用壓縮公鑰。

公鑰對賬號的交易進行加密。即使用公鑰簽名交易,然后使用私鑰去驗證交易。

公鑰是通過使用secp256k1橢圓曲線加密算法計算私鑰所對應的公鑰獲得。

公鑰、私鑰、地址,它們是一一對應的,唯一的,不可修改的。

5. 私鑰

私鑰由64位長度的十六進制的字符組成,比如:0xE4356E49C88C8B7AB370AF7D5C0C54F0261AAA006F6BDE09CD4745CF54E0115A,

私鑰一定要妥善保管,不能被公開和泄漏,擁有私鑰就相當于擁有此賬號的使用權(quán)。

私鑰有可由助記詞推導出來。

6. 密碼

密碼不是私鑰,密碼可以進行修改或重置。在錢包應用程序中,創(chuàng)建賬號時需要設定一個密碼,這個密碼一般要求不少于 8 個字符,為了安全,密碼最好設置復雜一點。

7. 助記詞

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

助記詞是私鑰的另一種表現(xiàn)形式。

還有同學說助記詞=私鑰,這是不正確的說法,通過助記詞可以獲取相關(guān)聯(lián)的多個私鑰,但是通過其中一個私鑰是不能獲取助記詞的,因此助記詞≠私鑰。

8. 總結(jié)

錢包應用程序用于管理多個賬號,在比特幣中賬號與公私鑰對、地址是一一對應的,公鑰、私鑰、地址也是一一對應的,私鑰生成公鑰,公鑰生成地址,且不可逆,私鑰是賬號的核心且不可泄漏,地址可以公開用于轉(zhuǎn)賬。關(guān)于子賬號的介紹稍后說明。

二、HD錢包

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

1. BIP

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

BIP32

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

BIP39

由于種子是一串很長的隨機數(shù),不利于記錄,所以我們用算法將種子轉(zhuǎn)化為一串12 ~ 24個的單詞,方便保存記錄,這就是BIP39.它擴展了 HD錢包種子的生成算法。

BIP44

BIP44 是在 BIP32 和 BIP43 的基礎(chǔ)上增加多幣種,提出的層次結(jié)構(gòu)非常全面,它允許處理多個幣種,多個帳戶,每個帳戶有數(shù)百萬個地址。

在BIP32路徑中定義以下5個級別:m/purpse'/coin_type'/account'/change/address_index

purpose:在BIP43之后建議將常數(shù)設置為44'。表示根據(jù)BIP44規(guī)范使用該節(jié)點的子樹。

Coin_type:幣種,代表一個主節(jié)點(種子)可用于無限數(shù)量的獨立加密幣,如比特幣,Litecoin或Namecoin。此級別為每個加密幣創(chuàng)建一個單獨的子樹,避免重用已經(jīng)在其它鏈上存在的地址。開發(fā)人員可以為他們的項目注冊未使用的號碼。幣種列表

Account:賬戶,此級別為了設置獨立的用戶身份可以將所有幣種放在一個的帳戶中,從0開始按順序遞增。

Change:常量0用于外部鏈,常量1用于內(nèi)部鏈,外部鏈用于錢包在外部用于接收和付款。內(nèi)部鏈用于在錢包外部不可見的地址,如返回交易變更。

Address_index:地址索引,按順序遞增的方式從索引0開始編號。

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

2. 種子

種子可以派生生成多個私鑰,所以種子是一個錢包賬號中最關(guān)鍵的數(shù)據(jù),比私鑰的等級更高,因此備份一個種子就備份了相關(guān)聯(lián)的所有私鑰。HD錢包中包含了在樹結(jié)構(gòu)中派生的密鑰,這樣一來,父密鑰就可以派生出一系列子密鑰,每個密鑰都可以派生出一系列的子密鑰,從而達到無限的深度。

開發(fā)比特幣錢包不得不了解的概念

三、Base58編碼

1. Base64編碼

Base64就是一種基于64個可打印字符來表示二進制數(shù)據(jù)的方法

Base64使用了26個小寫字母、26個大寫字母、10個數(shù)字以及兩個符號(例如“+”和“/”),用于在電子郵件這樣的基于文本的媒介中傳輸二進制數(shù)據(jù)。

Base64通常用于編碼郵件中的附件。

Base64字符集:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

2. Base58編碼

Base58是一種基于文本的二進制編碼格式,是用于Bitcoin中使用的一種獨特的編碼方式,主要用于產(chǎn)生Bitcoin的錢包地址。

相比Base64.Base58不使用數(shù)字”0”,大寫字母”O(jiān)”,大寫字母”I”和小寫字母”l”,以及”+”和”/”符號。目的就是去除容易混淆的字符。

這種編碼格式不僅實現(xiàn)了數(shù)據(jù)壓縮,保持了易讀性,還具有錯誤診斷功能。

Base58字符集:ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz123456789

3. Base58Check

Base58Check是一種常用在比特幣中的Base58編碼格式,增加了錯誤校驗碼來檢查數(shù)據(jù)在轉(zhuǎn)錄中出現(xiàn)的錯誤。在Base58Check中,對數(shù)據(jù)添加了一個稱作“版本字節(jié)”的前綴,這個前綴用來明確需要編碼的數(shù)據(jù)的類型。

首先對數(shù)據(jù)添加一個版本前綴,這個前綴用來識別編碼的數(shù)據(jù)類型。例如,比特幣地址的前綴是0(十六進制是0*00)。

對數(shù)據(jù)連續(xù)進行兩次SHA256哈希算法checksum = SHA256(SHA256(prefix+data))。

在產(chǎn)生的長度為32個字節(jié)(兩次哈希云算)的哈希值中,取其前4個字節(jié)作為檢驗和添加到數(shù)據(jù)第一步產(chǎn)生的數(shù)據(jù)之后。

將數(shù)據(jù)進行Base58編碼處理

Base58Check的編碼過程如下圖。

開發(fā)比特幣錢包不得不了解的概念

Base58Check的作用:既然有了Base58編碼,已經(jīng)不會搞錯0和O, 1和l和I,也把大整數(shù)轉(zhuǎn)換成了可讀字符串,為什么還要再有Base58Check這個環(huán)節(jié)呢?

假設一種情況,你在程序中輸入一個Base58編碼的地址,盡管你已經(jīng)不會搞錯0和O, 1和l和I,但是萬一你不小心輸錯一個字符,或者少寫多寫一個字符,會咋樣?你可能會說,沒啥大不了的,錯個字符而已,這不是很常見嘛,重新輸入不就可以了嗎?

但是當用戶給一個比特幣地址轉(zhuǎn)賬,如果輸入錯誤,那么對方就不會收到資金,更關(guān)鍵的是該筆資金發(fā)給了一個根本不存在的比特幣地址,那么這筆資金也就永遠不可能被交易,也就是說比特幣丟失了。

校驗碼長4個字節(jié),添加到需要編碼的數(shù)據(jù)之后。

校驗碼是從需要編碼的數(shù)據(jù)的哈希值中得到的,所以可以用來檢測并避免轉(zhuǎn)錄和輸入中產(chǎn)生的錯誤。

使用Base58check編碼格式時,程序會計算原始數(shù)據(jù)的校驗碼并和自帶的校驗碼進行對比,二者若不匹配則表明有錯誤產(chǎn)生。

實際上,在比特幣交易中,都會校驗比特幣地址是否合法,如果經(jīng)過Base58Check的比特幣地址被比特幣錢包程序判定是無效的,當然會阻止交易繼續(xù)進行,就避免了資金損失。

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認同期限觀點或證實其描述。

相關(guān)視頻攻略

更多

掃二維碼進入好特網(wǎng)手機版本!

掃二維碼進入好特網(wǎng)微信公眾號!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]

湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)