比特幣私鑰、公鑰、錢包地址關係
https://www.jianshu.com/p/12c4714e273f
在比特幣交易中常常會聽到私鑰、公鑰、錢包地址,它們三者直接到底有什麼聯繫呢?算法
生成流程
- 1.首先使用隨機數發生器生成一個私鑰,通常是256位。
- 2.私鑰通過SECP256K1算法生成公鑰,65個字節。SECP256K1是一種橢圓曲線算法,是不可逆的,因此公鑰是不能夠反推出私鑰。
- 3.同SHA256同樣,RIPEMD160也是一種Hash算法,經過公鑰計算得出公鑰哈希,20個字節。
- 4.將一個字節的地址版本號鏈接到公鑰哈希頭部(對於比特幣網絡的pubkey地址,這一字節爲「0」),而後對齊進行兩次SHA256運算,將結果的前4字節做爲公鑰哈希的校驗值(後續能夠經過逆運算驗證地址是否是錯了),鏈接在其尾部。
- 5.將上一步結果(地址版本號+公鑰哈希+校驗值)進行base58進行編碼,獲得錢包地址,58個字節。
三者間關係
生成地址例子
- 1.隨機數產生私鑰
18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
- 2.經過橢圓曲線算法產生公鑰
0450863AD64A87AE8A2FE8….82BA6
- 3.對公鑰進行SHA256計算
600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408
- 4.對第三步結果進行RIPEMD160運算
010966776006953D5567439E5E39F86A0D273BEE
- 5.對第四步結果加上版本號
00010966776006953D5567439E5E39F86A0D273BEE
- 6.對第五步進行SHA256運算
445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094
- 7 對第六步進行SHA256運算
D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30
- 8.提出第七步結果的前4個字節
D61967F6
- 9.將第八步的4個字節放在第五步結果的尾部
00010966776006953D5567439E5E39F86A0D273BEED61967F6
- 10.對第九步結果進行base58編碼
16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
爲何說不會輸錯比特幣地址
由於錢包通常對地址進行逆運算,得出第九步的結果,而後去掉最後4個字節,而後進行兩次SHA256得出結果的前4個字節,而後與校驗值比較,稱爲checksum檢查。網絡
爲何最後生成地址要使用base58而不是base64
base64包含52個大小寫英文字母,0-9的10個數字,\和+。學習
由於base58去除了容易產生歧義的字符:區塊鏈
- 大寫的i(I),大寫的O
- 小寫的L(l)
- 數字0
- 影響雙擊選擇的/和+