區(qū)塊鏈基礎(chǔ)知識(shí)篇——《精通比特幣》第四章“密鑰、地址、錢包”解讀

通過本章的學(xué)習(xí),可以幫你很具象的熟悉錢包的原理,以及私鑰、公鑰、比特幣地址和錢包的關(guān)系。本章可以為產(chǎn)品和技術(shù)人員設(shè)計(jì)研發(fā)數(shù)字錢包時(shí)提供參考。

閱讀時(shí)長(zhǎng):15分鐘左右

4.1 ?私鑰、公鑰、地址和錢包的關(guān)系

錢包:錢包是私鑰的容器,錢包中只包含私鑰,不包含比特幣,錢包定義了一套生成私鑰、管理私鑰以及使用私鑰簽名的規(guī)則。

私鑰:作用是對(duì)交易進(jìn)行簽名。由錢包通過隨機(jī)熵源生成,也可由錢包導(dǎo)入已有的私鑰。

公鑰:由私鑰通過特定的橢圓曲線函數(shù)生成。由私鑰可以推出公鑰,但由公鑰很難計(jì)算出私鑰。

比特幣地址:由公鑰經(jīng)過單向的雙哈希函數(shù)生成,通過Base58check編碼的方式呈現(xiàn),比特幣地址以數(shù)字1開頭。

在了解以上4個(gè)概念的關(guān)系后,下面詳細(xì)講解私鑰、公鑰、地址的生成原理以及錢包的分類。

4.2 ? ?私鑰的生成原理

私鑰就是一個(gè)隨機(jī)選出的數(shù)字而已,該隨機(jī)數(shù)是一個(gè)二進(jìn)制的256位數(shù)字。隨機(jī)性數(shù)據(jù)來源于符合密碼學(xué)安全的隨機(jī)數(shù)生成器,即從一堆隨機(jī)源的數(shù)據(jù)中取出一串隨機(jī)字節(jié),通過SHA算法轉(zhuǎn)化成256位的二進(jìn)制數(shù)字,再驗(yàn)證選擇的隨機(jī)數(shù)是否處于1到n-1之間(其中n是一個(gè)常數(shù),略小于2^256),如果運(yùn)算結(jié)果小于n-1,則隨機(jī)數(shù)合適,否則需要重新選取隨機(jī)數(shù),直至所選取的隨機(jī)數(shù)滿足驗(yàn)證條件為止。

當(dāng)然,不同的錢包選取的隨機(jī)數(shù)位數(shù)可能不一樣。

私鑰的表示方法

私鑰的常見表示法有十六進(jìn)制、WIF格式、WIF-compressed格式。

十六進(jìn)制格式的私鑰,是將原始256位的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成了64位的十六進(jìn)制數(shù)據(jù)表示出來;

WIF(Wallet Import Format),即錢包導(dǎo)入格式,指將私鑰導(dǎo)入新的錢包中時(shí),錢包用來識(shí)別私鑰的格式,所以在錢包導(dǎo)出私鑰時(shí),會(huì)生成該格式的私鑰。WIF格式的私鑰以5開頭,代表該格式的私鑰需要生成非壓縮格式的公鑰。

WIF-compressed,即錢包導(dǎo)入壓縮格式,該私鑰的格式以K或L開頭,將私鑰導(dǎo)入到錢包后,代表錢包會(huì)用該格式的私鑰生成壓縮格式的公鑰,以便正確解析比特幣地址。

4.3公鑰的生成原理

私鑰通過橢圓曲線函數(shù),可以計(jì)算得到公鑰,這是不可逆的過程:K=k * G。其中k是私鑰,G是橢圓曲線上定義的初始常數(shù)點(diǎn),K是公鑰。

比特幣的橢圓曲線方程:y^2=x^3+7, 這條曲線定義在素?cái)?shù)階p的有限域內(nèi),可以想象為在一個(gè)極大的網(wǎng)格上定義了一系列復(fù)雜的散點(diǎn)。公鑰K的計(jì)算運(yùn)用了橢圓曲線的加法和乘法規(guī)則:k*G=G+G+……+G(k次),且該橢圓曲線上的兩個(gè)點(diǎn)想加,其相加的和等于與橢圓曲線相交于另一點(diǎn)、然后在X軸上的反射點(diǎn)。那么G+G的值相當(dāng)于從G點(diǎn)做切線后與曲線相交點(diǎn),其在X軸上的反射點(diǎn)2G,如下圖所示:

圖一 橢圓曲線同點(diǎn)相加,圖片來源于網(wǎng)絡(luò)

公鑰K定義為該反射點(diǎn)的坐標(biāo)K=(x,y)。

公鑰的表示方法

公鑰是根據(jù)橢圓曲線計(jì)算出來的坐標(biāo)(x,y),知道了x的值,可以根據(jù)函數(shù)求出對(duì)應(yīng)y的值。如果同時(shí)將x和y用256位二進(jìn)制存儲(chǔ)的話,所占空間將增大1倍,存儲(chǔ)空間上有些浪費(fèi)。所以,公鑰的表示格式分為非壓縮格式和壓縮格式。

非壓縮格式的公鑰,是指生成的公鑰拼接了x和y的值,非壓縮格式的公鑰,以前綴04開頭

壓縮格式的公鑰,是指生成的公鑰中只包含了x的值,壓縮格式的公鑰,以前綴02或03開頭。如上述橢圓曲線同點(diǎn)相加圖示,同一個(gè)橫坐標(biāo)x可能對(duì)應(yīng)2個(gè)y值,由于y在有限域中只有正數(shù),此處的2個(gè)y值分別對(duì)應(yīng)奇數(shù)和偶數(shù),前綴02開頭表示y是偶數(shù),前綴03開頭表示y是奇數(shù)

由私鑰生成壓縮格式的公鑰時(shí),會(huì)在私鑰的后面拼接01,用以表明該私鑰來自于一個(gè)較新的錢包,只能用來生成壓縮的公鑰。對(duì)于私鑰本身,是不會(huì)改變?cè)刀鴫嚎s的。這樣做的目的是為了給導(dǎo)入私鑰的錢包一個(gè)信號(hào):到底是使用壓縮格式公鑰和比特幣地址去掃描區(qū)塊鏈,還是使用非壓縮格式公鑰和比特幣地址。

4.4比特幣地址

比特幣地址是將公鑰經(jīng)過雙哈希,得到公鑰哈希后,采用Base58check編碼的形式展示。比特幣地址以1開頭。

Base64編碼是將任意的一長(zhǎng)串輸入轉(zhuǎn)化成特定長(zhǎng)度的數(shù)字和字母組成的表示法,其編碼字符使用了26個(gè)小寫字母、26個(gè)大寫字母、10個(gè)數(shù)字和兩個(gè)符號(hào)+以及/,Base58編碼舍棄了一些容易錯(cuò)讀和混淆的字符,其不含數(shù)字0,小寫o、大寫O、小寫i、大寫I以及+和/兩個(gè)字符。Base58check編碼采用的是Base58編碼,同時(shí)加入了校驗(yàn)的功能。

最終的比特幣地址由版本前綴、公鑰哈希和校驗(yàn)碼3部分組成。其中版本前綴用來標(biāo)識(shí)編碼后得到的是比特幣地址,如采用Base58check編碼時(shí),比特幣地址的前綴是0,私鑰編碼的前綴為128;公鑰哈希,即將原始公鑰經(jīng)過SHA256和RIPEMD計(jì)算后得到的20字節(jié)的值;校驗(yàn)碼,是由前綴拼接公鑰哈希后,經(jīng)過2次SHA256,取計(jì)算后的值的前4個(gè)字節(jié)得到。

比特幣地址的生成原理,如下圖所示:

圖二 比特幣地址的生成原理

使用Base58check編碼格式時(shí),編碼軟件會(huì)計(jì)算原始數(shù)據(jù)的校驗(yàn)碼和結(jié)果數(shù)據(jù)中自帶的校驗(yàn)碼進(jìn)行對(duì)比,二者不匹配則表明有錯(cuò)誤產(chǎn)生,那么這個(gè)地址也是無效的。

4.5比特幣錢包的分類

錢包是用來管理私鑰的容器。比特幣錢包分為非確定性錢包(隨機(jī))錢包和確定性(種子)錢包。

非確定性錢包:由錢包預(yù)先隨機(jī)生成N個(gè)私鑰,每個(gè)私鑰一旦使用,需要單獨(dú)備份,當(dāng)密鑰足夠多時(shí),很難管理、備份和導(dǎo)入到新錢包,所以這種錢包使用起來很不方便,正被確定性錢包替代。

確定性錢包:又稱種子錢包,顧名思義,即通過一個(gè)種子即可推出所有密鑰。所以,在備份密鑰或?qū)氲叫洛X包時(shí),只需要備份種子密鑰即可,剩余的密鑰可以根據(jù)既定規(guī)則推算出來。常見的確定性錢包,包含助記碼詞匯以及分層確定性錢包。

助記碼詞匯

助記碼詞匯是用英文單詞序列代表作種子,來對(duì)應(yīng)確定性錢包的隨機(jī)數(shù)。單詞的順序就是錢包的備份,也就是對(duì)應(yīng)的私鑰集合。助記碼詞匯可以讓使用者復(fù)制錢包更容易一些,它們相對(duì)于隨機(jī)數(shù)字順序來說,可以很容易的被讀并且正確抄寫。

助記碼和種子的創(chuàng)建過程如下:

1.創(chuàng)造一個(gè)128到256位的隨機(jī)順序;

2.使用SHA256哈希該隨機(jī)順序,取前幾位作為校驗(yàn)和。所選取的隨機(jī)數(shù)的位數(shù)不同,校驗(yàn)和的字符數(shù)也不相同。

3.把校驗(yàn)和拼接在隨機(jī)順序的后面

4.按順序把拼接后的值分解成11位不同的集合,并用這些集合去和一個(gè)預(yù)先已經(jīng)定義的2048個(gè)單詞字典做對(duì)應(yīng)

5.取出對(duì)應(yīng)的單詞,按順序即可生成一個(gè)12至24個(gè)詞的助記碼。

分層確定性錢包(HD錢包)

分層確定性錢包,是通過單個(gè)種子生成主密鑰,再由主密鑰以樹狀結(jié)構(gòu)衍生子密鑰,子密鑰又可以通過規(guī)則衍生出孫密鑰,以此類推,一個(gè)種子可以衍生出無窮個(gè)子密鑰,而且備份時(shí)只需備份種子即可將錢包中的所有密鑰備份。

由種子衍生主密鑰的過程:

如上圖所示,由隨機(jī)數(shù)生成種子后,通過單向哈希函數(shù),輸出512位的值,其中左邊的256位做為主密鑰,右邊的256位作為主鏈編碼。

由父私鑰衍生子私鑰的過程:

如上圖所示,父私鑰衍生子私鑰時(shí),先由父私鑰生成父公鑰,再由父公鑰、父鏈編碼和索引號(hào)通過單向哈希函數(shù)計(jì)算輸出512位的值,左邊的256位對(duì)應(yīng)子密鑰,右邊的256位對(duì)應(yīng)子鏈編碼。其中索引號(hào)用來標(biāo)識(shí)子私鑰對(duì)應(yīng)的位置。

4.6總結(jié)

通過本章的學(xué)習(xí),可以很具象的熟悉私鑰、公鑰和比特幣地址的背后原理,同時(shí)了解錢包的本質(zhì)及其管理私鑰的方式。本章可以為產(chǎn)品和技術(shù)人員設(shè)計(jì)研發(fā)數(shù)字錢包時(shí)提供參考。

本文首發(fā)于微信公眾號(hào)“Tina說”:轉(zhuǎn)型區(qū)塊鏈,來這里就對(duì)了。

推薦閱讀

區(qū)塊鏈基礎(chǔ)知識(shí)篇——《精通比特幣》第三章“比特幣客戶端”解讀

區(qū)塊鏈基礎(chǔ)知識(shí)篇——《精通比特幣》第二章“比特幣的原理”解讀

區(qū)塊鏈基礎(chǔ)知識(shí)篇——比特幣經(jīng)典書籍《精通比特幣》第一章解讀

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,582評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,801評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,223評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,442評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,976評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,800評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,996評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評(píng)論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,233評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,702評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容

  • 一、快速術(shù)語檢索 比特幣地址:(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串...
    不如假如閱讀 16,043評(píng)論 4 87
  • 原文地址 https://mbinary.coding.me/introduction-to-bitcoin.ht...
    mbinary閱讀 5,225評(píng)論 0 4
  • 錢包 - 比特幣開發(fā)指南 原文鏈接: https://bitcoin.org/en/developer-guide...
    terryc007閱讀 3,008評(píng)論 0 7
  • 誰是lucky呢 Lucky是我養(yǎng)的第一條狗,從八周大的時(shí)候抱回來,一直養(yǎng)到三歲半,幾乎串連了我整個(gè)留學(xué)生涯,是我...
    94e283042770閱讀 760評(píng)論 2 2
  • 有一天約我去跑步,但是當(dāng)時(shí)和姐姐看電影,就放了他鴿子。他好像有點(diǎn)生氣,電影快結(jié)束的時(shí)候,他問我還在看?我說是,他說...
    小鹿砰砰閱讀 298評(píng)論 0 0