文章閱讀頁通欄

比特幣的地址,密鑰,錢包之間的關系

來源: Ehcoo 作者:
引言 目前市面上講授區塊鏈技術大多比較膚淺,夾雜著很多商業的元素,很難一下子觸及技術核心技術,前兩天有朋友在群里問,索性決定把 Andreas M.......
引言

目前市面上講授區塊鏈技術大多比較膚淺,夾雜著很多商業的元素,很難一下子觸及技術核心技術,前兩天有朋友在群里問,索性決定把 Andreas M. Antonopoulos的經典之作翻譯一下,英文名:《Mastering Bitcoin-Unlocking Digital Cryptocurrencies》,中文名《精通比特幣》,翻譯完第一節的時候才發現網上已經有了翻譯版本。

下面的時間里將和大家一起探索比特幣技術,以后將嘗試推出一系列的文章去探究比特幣和區塊鏈的技術本質,今天的主要內容包括:比特幣地址,比特幣密鑰使用,比特幣錢包,以及這三者存在怎樣的關系。


密鑰

私鑰

A private key in the context of Bitcoin is a secret number that allows bitcoins to be spent. Every Bitcoin wallet contains one or more private keys, which are saved in the wallet file. The private keys are mathematically related to all Bitcoin addresses generated for the wallet. -wiki

私鑰就是一個隨機選出的數字而已。一個比特幣地址中的所有資金的控制取決于相應私鑰的所有權和控制權。在比特幣交易中,私鑰用于生成支付比特幣所必需的簽名以證明資金的所有權。私鑰必須始終保持機密,因為一旦被泄露給第三方,相當于該私鑰保護之下的比特幣也拱手相讓了。私鑰還必須進行備份,以防意外丟失,因為私鑰一旦丟失就難以復原,其所保護的比特幣也將永遠丟失。

比特幣私鑰只是一個數字。你可以用硬幣、鉛筆和紙來隨機生成你的私鑰:擲硬幣256次,用紙和筆記錄正反面并轉換為0和1,隨機得到的256位二進制數字可作為比特幣錢包的私鑰。該私鑰可進一步生成公鑰。

生成密鑰的第一步也是最重要的一步,是要找到足夠安全的熵源,即隨機性來源。生成一個比特幣私鑰在本質上與“在1到2256之間選一個數字”無異。只要選取的結果是不可預測或不可重復的,那么選取數字的具體方法并不重要。比特幣軟件使用操作系統底層的隨機數生成器來產生256位的熵(隨機性)。通常情況下,操作系統隨機數生成器由人工的隨機源進行初始化,也可能需要通過幾秒鐘內不停晃動鼠標等方式進行初始化。對于真正的偏執狂,可以使用擲骰子的方法,并用鉛筆和紙記錄。

· 比特幣私鑰空間的大小是22562256,這是一個非常大的數字。用十進制表示的話,大約是10771077,而可見宇宙被估計只含有1080個原子。
· 把私鑰以Base58校驗和編碼格式顯示,這種私鑰格式被稱為錢包導入格式(WIF,Wallet Import Format)。

公鑰

非對稱密鑰往往有一對密碼組成,一個是私鑰,另一個是公鑰,公鑰就像銀行的帳號,而私鑰就像控制賬戶的PIN碼或支票的簽名。比特幣的用戶很少會直接看到數字密鑰。一般情況下,它們被存儲在錢包文件內,由比特幣錢包軟件進行管理。

其中公鑰是有私鑰生成,根據選擇的算法(RSA,DSA,EIGamal等)不同,生成的方式也不同。比特幣采用是的橢圓曲線算法。通過橢圓曲線算法可以從私鑰計算得到公鑰,這是不可逆轉的過程:K = k * G 。其中k是私鑰,G是被稱為生成點的常數點,而K是所得公鑰。其反向運算,被稱為“離散對數分解”——已知公鑰K來求出私鑰k——是非常困難的,就像去試驗所有可能的k值,即暴力破解。為了更好的理解私鑰和公鑰的對應關系

橢圓曲線加密法是一種基于離散對數問題的非對稱(或公鑰)加密法,可以用對橢圓曲線上的點進行加法或乘法運算來表達。

下面我們舉出一個例子,如下就是我們高中最常見的橢圓曲線

假設我們設p=17,就是說在x = 17, y= 17 的范圍內找出所有符合上面公式的值。當然了這些值一會落在曲線上面。

上面的這些點其實就是構成了一個群GROUP,群一定的特征,這里就不深究了,但是提一點,在群中也具有一定運算,也具有加法乘法等,但是和我們平時認知的加減乘除有所區別。

關于此部分是知識,如果讀者有濃厚的興趣可以私信我,因為太過學術,所以點到為止。

下面舉一個乘法的例子,下面整數點的乘法,我們的目標是找到生成點G的倍數kG。也就是將G相加k次。在橢圓曲線中,點的相加等同于從該點畫切線找到與曲線相交的另一點,然后映射到x軸。

如果我們已經知道G和k,可以很輕易的計算出 kG,但是如果知道了KG卻很難反推算出k和G,其實這里的k就是私鑰,kG就是公鑰,私鑰可以推算出公鑰,但是公鑰計算理論上不能推算出私鑰。

Note: 很多人會疑惑,按照上面的理論我們計算出來的至公鑰是一個點啊,但是我們平時看到的公鑰都是一串數字,其實公鑰就是X緊跟著Y。

舉個例子,如下(現實中為了安全往往取值非常大,前綴04表示未壓縮格式公鑰)
x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
則公鑰為:K = x + y

地址

在比特幣交易的支付環節,收件人的公鑰是通過其數字指紋表示的,稱為比特幣地址,就像支票上的支付對象的名字(即“收款方”)。一般情況下,比特幣地址由一個公鑰生成并對應于這個公鑰。地址與公鑰之間的關系,如下圖所示:

javascript的代碼實現如下:上圖中我提及了Base58Check算法,而在算法實現中我用的卻是base58encode,這兩者之間有什么差別? 下文將揭曉答案。

從Base64編碼到Base58

為了更簡潔方便地表示長串的數字,許多計算機系統會使用一種以數字和字母組成的大于十進制的表示法。例如,傳統的十進制計數系統使用0-9十個數字,而十六進制系統使用了額外的 A-F 六個字母。一個同樣的數字,它的十六進制表示就會比十進制表示更短。更進一步,Base64使用了26個小寫字母、26個大寫字母、10個數字以及兩個符號(例如“+”和“/”),用于在電子郵件這樣的基于文本的媒介中傳輸二進制數據。Base64通常用于編碼郵件中的附件。Base58是一種基于文本的二進制編碼格式,用在比特幣和其它的加密貨幣中。這種編碼格式不僅實現了數據壓縮,保持了易讀性,還具有錯誤診斷功能。Base58是Base64編碼格式的子集,同樣使用大小寫字母和10個數字,但舍棄了一些容易錯讀和在特定字體中容易混淆的字符。具體地,Base58不含Base64中的0(數字0)、O(大寫字母o)、l(小寫字母L)、I(大寫字母i),以及“+”和“/”兩個字符。簡而言之,Base58就是由不包括(0,O,l,I)的大小寫字母和數字組成。

比特幣的Base58字母表

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

從Base58到Base58Check編碼

Base58Check是一種常用在比特幣中的Base58編碼格式,增加了錯誤校驗碼來檢查數據在轉錄中出現的錯誤。校驗碼長4個字節,添加到需要編碼的數據之后。校驗碼是從需要編碼的數據的哈希值中得到的,所以可以用來檢測并避免轉錄和輸入中產生的錯誤。使用Base58check編碼格式時,編碼軟件會計算原始數據的校驗碼并和結果數據中自帶的校驗碼進行對比。二者不匹配則表明有錯誤產生,那么這個Base58Check格式的數據就是無效的。例如,一個錯誤比特幣地址就不會被錢包認為是有效的地址,否則這種錯誤會造成資金的丟失。

為了使用Base58Check編碼格式對數據(數字)進行編碼,首先我們要對數據添加一個稱作“版本字節”的前綴,這個前綴用來明確需要編碼的數據的類型。例如,比特幣地址的前綴是0(十六進制是0x00),而對私鑰編碼時前綴是128(十六進制是0x80)。 常見版本的前綴。

錢包

比特幣的所有權是通過數字密鑰、比特幣地址和數字簽名來確立的。數字密鑰實際上并不是存儲在網絡中,而是由用戶生成并存儲在一個文件或簡單的數據庫中,稱為錢包。存儲在用戶錢包中的數字密鑰完全獨立于比特幣協議,可由用戶的錢包軟件生成并管理,而無需區塊鏈或網絡連接。

錢包是私鑰的容器,通常通過有序文件或者簡單的數據庫實現。另外一種制作私鑰的途徑是 確定性密鑰生成。在這里你可以用原先的私鑰,通過單向哈希函數來生成每一個新的私鑰,并將新生成的密鑰按順序連接。只要你可以重新創建這個序列,你只需要第一個私鑰(稱作種子、主私鑰)來生成它們

比特幣錢包只包含私鑰而不是比特幣。每一個用戶有一個包含多個私鑰的錢包。錢包中包含成對的私鑰和公鑰。用戶用這些私鑰來簽名交易,從而證明它們擁有交易的輸出(也就是其中的比特幣)。比特幣是以交易輸出的形式來儲存在區塊鏈中(通常記為vout或txout)。

非確定性的錢包

錢包只是隨機生成的私鑰集合。這種類型的錢包被稱作零型非確定錢包。舉個例子,比特幣核心客戶端預先生成100個隨機私鑰,從最開始就生成足夠多的私鑰并且每把鑰匙只使用一次。這種類型的錢包有一個昵稱“Just a Bunch Of Keys(一堆私鑰)”簡稱JBOK。這種錢包現在正在被確定性錢包替換,因為它們難以管理、備份以及導入。隨機鑰匙的缺點就是如果你生成很多,你必須保存它們所有的副本。這就意味著這個錢包必須被經常性地備份。每一把鑰匙都必須備份,否則一旦錢包不可訪問時,錢包所控制的資金就付之東流。這種情況直接與避免地址重復使用的原則相沖突——每個比特幣地址只能用一次交易。地址通過關聯多重交易和對方的地址重復使用會減少隱私。0型非確定性錢包并不是錢包的好選擇,尤其是當你不想重復使用地址而創造過多的私鑰并且要保存它們。雖然比特幣核心客戶包含0型錢包,但比特幣的核心開發者并不想鼓勵大家使用。下圖表示包含有松散結構的隨機鑰匙的集合的非確定性錢包。

確定性的錢包

下面列舉一種確定性錢包的例子:助記碼詞匯錢包
助記碼詞匯是英文單詞序列代表(編碼)用作種子對應所確定性錢包的隨機數。單詞的序列足以重新創建種子,并且從種子那里重新創造錢包以及所有私鑰。在首次創建錢包時,帶有助記碼的,運行確定性錢包的錢包的應用程序將會向使用者展示一個12至24個詞的順序。單詞的順序就是錢包的備份。它也可以被用來恢復以及重新創造應用程序相同或者兼容的錢包的鑰匙。助記碼代碼可以讓使用者復制錢包更容易一些,因為它們相比較隨機數字順序來說,可以很容易地被讀出來并且正確抄寫。

總結

本文介紹了比特幣地址,比特幣密鑰原理,比特幣錢包,以及這三者存在怎樣的關系。

聲明

本文70%為翻譯組合,30%為原創, 文中大量引用了經典之作《Mastering Bitcoin-Unlocking Digital Cryptocurrencies》
d3d3LmVoY29vLmNvbSwg5L2c6ICFOmVoY29v(BASE64編碼)

來源:Ehcoo
更多數字貨幣信息:www.guwutu.icu/news

關鍵詞: 比特幣地址  比特幣錢包  
0/300
? 时时彩龙虎和计划app