【轉(zhuǎn)自:https://zhuanlan.zhihu.com/p/28036845】
對(duì)比特幣熟悉的朋友一定都知道,買賣比特幣最后都是通過一個(gè)錢包地址來實(shí)現(xiàn)的,就像我們?nèi)粘J褂玫你y行卡卡號(hào),我們隨便找一個(gè)比特幣的錢包地址,大家看一下:
1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7
但是當(dāng)談到比特幣的錢包地址是如何算出來的時(shí)候,可能就很少有人能夠說清楚了。
下面,景辰通過實(shí)際計(jì)算,來給大家講解一下比特幣的錢包地址是怎么來的,公鑰、私鑰是怎么來的,以及他們?nèi)咧g的關(guān)系。
下面的過程你不一定懂得轉(zhuǎn)換的原理,知道他們流轉(zhuǎn)的過程就可以了。
眾所周知,比特幣是建立在數(shù)學(xué)加密學(xué)基礎(chǔ)上的,而不是像銀行卡那樣是基于信用的,基于信用體系的銀行卡卡號(hào)我們都熟悉,是我們?cè)谙蜚y行申請(qǐng)銀行卡的時(shí)候銀行給隨機(jī)發(fā)的,那么比特幣的錢包地址是怎么來的呢?
在《比特幣:一種點(diǎn)對(duì)點(diǎn)的電子現(xiàn)金系統(tǒng)》一文中,中本聰提到了用橢圓加密算法(ECDSA)來產(chǎn)生比特幣的私鑰和公鑰。
基于橢圓加密的原理,由私鑰是可以計(jì)算出公鑰的,再由公鑰經(jīng)過一系列數(shù)字簽名運(yùn)算就會(huì)得到比特幣錢包地址。
因?yàn)橛晒€可以算出比特幣地址,所以我們經(jīng)常把公鑰和比特幣地址的說法相混淆,他們都是指的同一個(gè)概念,比特幣錢包地址只是另一種格式的公鑰,但是兩者的外在表現(xiàn)形式是不一樣的。
那么我們就可以梳理出一個(gè)脈絡(luò)了:
私鑰 —— 公鑰 —— 比特幣錢包地址
從比特幣私鑰得到我們?nèi)粘^D(zhuǎn)賬所用的比特幣錢包地址總共需要九個(gè)步驟,中間用到了SHA256加密、RIPEMD160加密和BASE58編碼。
下面,我們以實(shí)際案例來模擬一下整個(gè)流程:
第一步:生成隨機(jī)私鑰
私鑰是一個(gè)隨機(jī)數(shù),隨機(jī)選取一個(gè)32字節(jié)的數(shù),這個(gè)數(shù)的范圍大小是介于1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之間的一個(gè)數(shù),為了方便后面的計(jì)算,我們隨機(jī)生成一個(gè)合法的私鑰:
8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3
第二步:橢圓曲線算公鑰
生成了私鑰之后,我們使用橢圓曲線加密算法(ECDSA-secp256k1)計(jì)算私鑰所對(duì)應(yīng)的非壓縮公鑰,生成的公鑰共65字節(jié), 其中一個(gè)字節(jié)是0x04,其中32個(gè)字節(jié)是X坐標(biāo),另外32個(gè)字節(jié)是Y坐標(biāo):
公鑰P.X:
06CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385
公鑰P.Y:
FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB
第三步:計(jì)算公鑰的SHA-256哈希值
將上述公鑰地址拼合,得到標(biāo)準(zhǔn)地址:
0406CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB
對(duì)齊進(jìn)行SHA-256哈希計(jì)算,得到結(jié)果:
2572e5f4a8e77ddf5bb35b9e61c61f66455a4a24bcfd6cb190a8e8ff48fc097d
第四步:計(jì)算 RIPEMD-160哈希值
取上一步結(jié)果,進(jìn)行RIPEMD-160計(jì)算,得到結(jié)果:
0b14f003d63ab31aef5fedde2b504699547dd1f6
第五步:加入地址版本號(hào)(比特幣主網(wǎng)版本號(hào)“0x00”)
取上一步結(jié)果,在前面加上16進(jìn)制的00,即:
000b14f003d63ab31aef5fedde2b504699547dd1f6
第六步:計(jì)算 SHA-256 哈希值
取上一步結(jié)果,進(jìn)行SHA-256計(jì)算,可得:
ddc2270f93cc84cc6869dd373f3c340bbf5cb9a8f5559297cc9e5d947aab2536
然后,對(duì)以上結(jié)果再次計(jì)算 SHA-256 哈希值,得到:
869ac57b83ccf75ca9da8895823562fffb611e3c297d9c2d4612aeeb32850078
第七步:取上一步結(jié)果的前4個(gè)字節(jié)(8位十六進(jìn)制)
869ac57b
第八步:把這4個(gè)字節(jié)加在第五步的結(jié)果后面
作為校驗(yàn)位,將這4個(gè)字節(jié)加載第五步的結(jié)果后面,這就是比特幣地址的16進(jìn)制形態(tài)了:
869ac57b000b14f003d63ab31aef5fedde2b504699547dd1f6
第九步:用Base58編碼變換一下地址
對(duì)上一步的結(jié)果進(jìn)行Base58編碼,得到:
1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7
這就是我們經(jīng)常看到的傳統(tǒng)意義上的比特幣錢包地址了。
以上步驟可以簡化為下圖所示:
<figure style="margin: 24px 0px;">
</figure>
我們經(jīng)常說的比特幣公鑰就是指的圖中第二步所產(chǎn)生的結(jié)果,而HASH160指的是第四步RIPEMD160簽名所產(chǎn)生的結(jié)果,由于RIPEMD也是一種HASH算法所以就統(tǒng)稱為HASH160了,而我們常用的比特幣地址就是經(jīng)過BASE58編碼后的結(jié)果。
推薦往期閱讀:區(qū)塊鏈在交易發(fā)展演進(jìn)中的地位區(qū)塊鏈的地位 | 區(qū)塊鏈的來源 | 比特幣的概念 | 瘋狂的ICO | 助力跨境支付