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

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

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

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

理解HD錢包是什么

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

一、錢包應(yīng)用程序

1. 錢包

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

錢包中可以有很多賬號,賬號也能導(dǎo)入不同的錢包。

2. 賬號

每個(gè)賬戶都是由一對鑰匙組成:公鑰和私鑰。每個(gè)賬戶都對應(yīng)一個(gè)地址。

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

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

3. 地址

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

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

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

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

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

4. 公鑰

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

公鑰對賬號的交易進(jìn)行加密。即使用公鑰簽名交易,然后使用私鑰去驗(yàn)證交易。

公鑰是通過使用secp256k1橢圓曲線加密算法計(jì)算私鑰所對應(yīng)的公鑰獲得。

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

5. 私鑰

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

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

私鑰有可由助記詞推導(dǎo)出來。

6. 密碼

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

7. 助記詞

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

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

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

8. 總結(jié)

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

二、HD錢包

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

1. BIP

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

BIP32

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

BIP39

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

BIP44

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

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

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

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

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

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

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

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

2. 種子

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

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

三、Base58編碼

1. Base64編碼

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

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

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

Base64字符集:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

2. Base58編碼

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

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

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

Base58字符集:ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz123456789

3. Base58Check

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

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

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

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

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

Base58Check的編碼過程如下圖。

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

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

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

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

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

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

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

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

小編推薦閱讀

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

相關(guān)視頻攻略

更多

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

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

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

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