1. 程式人生 > >比特幣地址的生成演算法是怎樣的?

比特幣地址的生成演算法是怎樣的?

首先,讓我們先簡單的說說比特幣地址是怎麼算出來的。比特幣是建立在數學加密學基礎上的,中本聰大神用了橢圓加密演算法(ECDSA)來產生比特幣的私鑰和公鑰。由私鑰是可以計算出公鑰的,公鑰的值經過一系列數字簽名運算會得到比特幣地址。 需要說明的是:因為由公鑰可以算出比特幣地址,所以我們經常把公鑰和比特幣地址的說法相混淆,但是他們都是指的一個概念。比特幣地址只是另一種格式的公鑰。 從比特幣私鑰得到我們所用的比特幣地址需要九個步驟。中間要用到SHA256加密、RIPEMD160加密和BASE58編碼。我們最終用到的比特幣私鑰和比特幣地址一般都是經過BASE58編碼的結果。整個流程如下圖所示。 第一步,隨機選取一個32位元組的數、大小介於1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之間,作為私鑰。 18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725 第二步,使用橢圓曲線加密演算法(ECDSA-secp256k1)計算私鑰所對應的非壓縮公鑰。 (共65位元組, 1位元組 0x04, 32位元組為x座標,32位元組為y座標)關於公鑰壓縮、非壓縮的問題另文說明。 0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B 23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6 第三步,計算公鑰的 SHA-256 雜湊值 600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408 第四步,取上一步結果,計算 RIPEMD-160 雜湊值 010966776006953D5567439E5E39F86A0D273BEE 第五步,取上一步結果,前面加入地址版本號(比特幣主網版本號“0x00”) 00010966776006953D5567439E5E39F86A0D273BEE 第六步,取上一步結果,計算 SHA-256 雜湊值 445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094 第七步,取上一步結果,再計算一下 SHA-256 雜湊值(哈哈) D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30 第八步,取上一步結果的前4個位元組(8位十六進位制) D61967F6 第九步,把這4個位元組加在第五步的結果後面,作為校驗(這就是比特幣地址的16進位制形態)。 00010966776006953D5567439E5E39F86A0D273BEED61967F6 第十步,用base58表示法變換一下地址(這就是最常見的比特幣地址形態)。 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM (說明: 有些數字以"0x"開頭,意思是此數字使用十六進位制表示法。"0x"本身沒有任何含義,它是C語言流傳下來的,約定俗成的寫法,比如0xA就是十進位制的10。另外,1個位元組 = 8位二進位制 = 2位十六進位制)。
我們經常說的比特幣公鑰就是指的圖中第二步所產生的結果。而HASH160指的是第四步RIPEMD160簽名所產生的結果,由於RIPEMD也是一種HASH演算法所以就統稱為HASH160了。而我們常用的比特幣地址就是經過BASE58編碼後的結果。 比特幣客戶端和錢包也接受各種比特幣地址格式,常用的格式有BASE58格式、WIF壓縮格式、130位和66位公鑰(Public key)格式。進入比巴克的錢包工具點選錢包詳情查詢頁面,如下圖,紅色框中130位的字串就是比特幣ECDSA算出的原始公鑰,下面是公鑰壓縮成66位的格式,上面兩個分別是我們常用的比特幣BASE58地址格式和比特幣地址WIF(wallet import format)壓縮格式。
其實現在各種格式的地址基本上都是通用的,在學習了相關知識後,我們會對比特幣體系有更加深入的理解。 Gobittest網站(國外可訪問)提供了從比特幣原始私鑰到公鑰再到HASH160和BASE58的計算程式,讀者可以參考。