本章的內(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á)到無限的深度。
三、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的編碼過程如下圖。
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)行,就避免了資金損失。
小編推薦閱讀如何使用 Pytorch 中的 DataSet 和 DataLoader
閱讀golang slice相關(guān)常見的性能優(yōu)化手段
閱讀連接Elasticsearch服務(wù)器的Python代碼示例
閱讀國產(chǎn)操作系統(tǒng)上實(shí)現(xiàn)RTMP推流攝像頭視頻和麥克風(fēng)聲音到流媒體服務(wù)器
閱讀使用Python讀取和導(dǎo)出NetCDF格式的多時(shí)相柵格文件
閱讀多租戶系統(tǒng)數(shù)據(jù)權(quán)限設(shè)計(jì)與RuoYi系統(tǒng)的借鑒
閱讀count(*)、count(1)哪個(gè)更快?面試必問:通宵整理的十道經(jīng)典MySQL必問面試題
閱讀從需求分析、產(chǎn)品設(shè)計(jì)到部署交付各階段說明
閱讀如何利用七牛云進(jìn)行數(shù)據(jù)備份和刪除
閱讀強(qiáng)化學(xué)習(xí)筆記之【ACE:Off-PolicyActor-CriticwithCausality-AwareEntropyRegularization】
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2024 haote.com 好特網(wǎng)