什麼是比特幣私鑰,公鑰和地址?

買賣虛擬貨幣

這是比特幣中經常出現的三個詞,那麼他們分別是什麼意思呢?他們之間又有什麼樣的關係呢?


先說說私鑰,例如這樣的一段字串:

5kyzdueo39z3fprtux2qbbwgnnp5ztd7yyr2sc1j299sbcnwjss,就是一個私鑰。只要是正確支援比特幣協議的應用都可以把這段字串識別為私鑰,轉換成公鑰,再轉換為地址,如果對應的地址上面有比特幣,就可以使用這個私鑰花費上面的比特幣。公鑰和地址的生成都依賴私鑰,所以私鑰才是比特幣世界裡面最重要的,有了私鑰就能生成公鑰和地址,就能夠花費對應地址上面的比特幣。私鑰花費比特幣的方式就是對這個私鑰擁有的未花費的交易進行簽名(加密)。

私鑰本質上是32個byte組成的陣列,1個byte等於8位二進位制,一個二進位制只有兩種可能性0或者1,所以私鑰的總數就是2^(8*32)=2^256個,這個數量已經超過了宇宙中原子的總數,想要遍歷所有的私鑰,耗盡整個太陽的能量也是不可能成功的。我們所說的比特幣私鑰的是密碼學上面安全的,並不是不可能出現重複的私鑰,而是說不可能透過遍歷所有的私鑰方式,或者其它的方式,找到上面有比特幣的私鑰,所以私鑰是密碼學上安全的。

私鑰的總數量很大,但是私鑰的生成卻是要依賴隨機,不依賴隨機就會大大的降低生成私鑰的概率空間,密碼學上面安全的隨機是指,是指隨機是不可預測的,隨機的結果是不可遍歷的。密碼學上安全的隨機生成的私鑰才能用來存比特幣,如果隨機不安全,你得到的私鑰有可能會和別人的相同,那麼你的比特幣就有丟失的可能。

32個byte組成的陣列是由256個0或者1組成的,如果顯示出來,不僅僅是識別率太差,而且太長。因此私鑰就會被轉換成上面的樣子,上面私鑰的樣子是對32個byte的陣列做了base58的轉換,base58是用於bitcoin中使用的一種獨特的編碼方式,主要用於產生bitcoin的錢包地址和私鑰。相比base64,base58不使用數字"0",字母大寫"o",字母大寫"i",和字母小寫"l",以及"+"和"/"符號。主要就是為了肉眼容易識別,在輸入的時候不容易打錯,不過我更傾向於使用二維碼的方式掃描私鑰,畢竟上面那段沒有規律的字串輸入起來還是挺費勁的。

我們看到的私鑰除了以5開頭的以外,還有以”l”和”k”開頭的私鑰,為什麼會出現這樣的情況呢?5,l,k又帶代表什麼呢?關於這部分的內容就是說到公鑰了。

公鑰是由私鑰生成的,透過橢圓曲線(ecpoint)生成,一個私鑰經過橢圓曲線變換之後會生成一個65個byte的陣列,一般我們會看到這樣的一個公鑰:04a34b99f22c790c4e36b2b3c2c35a36db06226e41c692fc82b8b56ac1c540c5bd5b8dec5235a0fa8722476c7709c02559e3aa73aa03918ba2d492eea75abea235,公鑰一般是把byte陣列是經過hex(16進位制)的處理之後顯示出來的,不同於私鑰的base58,公鑰是用來解開私鑰簽名的資料,使用私鑰簽名交易之後,會把自己的公鑰一起傳送,私鑰簽名的資料可以使用公鑰解密,傳送公鑰之後曠工才能驗證私鑰的簽名的正確性(能不能解開),私鑰和公鑰是成對出現的,一個私鑰簽名的資料,只有對應的公鑰才能解開,而地址也是從公鑰生成的,這樣就可以驗證花費的交易是不是屬於這個地址的。

至於為什麼會出現5開頭或者l,k開頭的私鑰,問題就是在公鑰上面,例子中的私鑰不僅僅包含了32個byte陣列的資訊,還是私鑰version的資訊和公鑰是否壓縮的資訊,早期的比特幣開發者並不知道生成的公鑰是可以壓縮的,壓縮的公鑰只有33個byte,而未壓縮的公鑰有65個byte。壓縮的公鑰對比特幣的意義更大,因為比特幣是去中心化的p2p加密貨幣,每個節點都會擁有完整的交易記錄,除了coinbase(挖礦得到的比特幣)以外,每個交易都會傳送公鑰,支援壓縮格式的公鑰,交易資料就會減少32個位元組,這對整個比特幣網路是非常有意義的,整個比特幣網路的資料就會因此而減少不少。

而對私鑰進行base58編碼的時候,支援未壓縮公鑰的私鑰其實是33位byte陣列,第一位存放版本資訊,當前值為128。支援壓縮公鑰的私鑰是34位,同樣是第一位是version資訊,它的值也是128,而多出來的一位是最後一個byte是用來存放是否壓縮資訊,1就表示是支援壓縮格式的公鑰,5開頭的私鑰都是不支援壓縮格式的私鑰,而l和k開頭的都是支援壓縮格式的私鑰。

公鑰是否壓縮除了對私鑰的顯示有影響以外,還是地址有影響。地址是由公鑰產生的,看到的地址都是base58編碼處理的,地址的生成比較複雜,說地址之前不得不先說下hash260,地址是由公鑰生成的的,但是公鑰生成地址的時候會先生成一個hash260。

生成的過程是,先對公鑰做一次sha256,再對得到的結果做一次ripemd160,再從結果中取20個byte的陣列,這個得到的陣列就是得到的hash260,例如:9a1c78a507689f6f54b847ad1cef1e614ee23f1e,在這個20位的byte陣列前面再加上一個byte,就是地址的version資訊(當前為0)得到一個21位的byte陣列,對它進行base58轉換就是我們看到的地址的樣子,也就是說hash260和是可以和地址相互轉換的。

一個私鑰可以有一個壓縮的公鑰,和一個未壓縮的公鑰,每個公鑰都會生成一個地址,上面私鑰就會有兩個地址分別為:1hzwkjkeaozftsajxdw6akkxp45agdiezn(未壓縮公鑰),1f3sam6ztwlaunj7d38pgfxtp3rvevtsbv(壓縮公鑰),這兩個地址都是這一個私鑰的地址,每個地址上面的錢都可以用這個私鑰花費。但是目前大多數的應用都是支援壓縮格式的私鑰。

這樣就給大家簡單的介紹了一個私鑰,公鑰和地址。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;