優(yōu)惠購網(wǎng)站怎么做的青島網(wǎng)站建設(shè)與設(shè)計(jì)制作
在前面章節(jié)中,我們詳細(xì)介紹了公鑰的壓縮,在比特幣網(wǎng)絡(luò)中,一個(gè)私鑰可以對應(yīng)兩個(gè)地址,一個(gè)地址是由未壓縮公鑰所生成的地址,另一個(gè)就是由壓縮公鑰所創(chuàng)建的地址,從公鑰到區(qū)塊鏈地址的轉(zhuǎn)換算法,我們在這里給出詳細(xì)描述和代碼實(shí)現(xiàn),本節(jié)我們看看私鑰的壓縮以及相關(guān)的WIF數(shù)據(jù)格式。
搞笑的是私鑰”壓縮“后,其長度反而比壓縮前增加了一個(gè)字節(jié)。而“壓縮”方法也相當(dāng)簡單,就是在私鑰末尾增加一個(gè)字節(jié)01,例如如果私鑰的數(shù)據(jù)為:1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD,
那么對應(yīng)的“壓縮”格式就是:
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD01
我們比較一下就可以看出,“壓縮”后的私鑰就是在末尾增加了字節(jié)01。為什么“壓縮”私鑰呢。前面我們提到過公鑰有兩種存儲方法,壓縮格式和非壓縮格式,私鑰是否“壓縮”就對應(yīng)創(chuàng)建哪種公鑰存儲模式,如果私鑰”壓縮“過,那就意味著使用它來創(chuàng)建壓縮格式的公鑰,如果沒有“壓縮”,那就使用它創(chuàng)建非壓縮格式的公鑰。
公鑰的壓縮是為了能在網(wǎng)絡(luò)進(jìn)行傳輸,通常情況下私鑰不需要經(jīng)常進(jìn)行網(wǎng)絡(luò)傳輸,因?yàn)檫^多的把私鑰暴露在網(wǎng)絡(luò)會增加泄露的幾率,一旦私鑰泄露,你所有的資產(chǎn)或私有信息將會丟失。然而在某些情況下,私鑰也有傳輸?shù)男枰?#xff0c;例如將私鑰從一個(gè)區(qū)塊鏈客戶端發(fā)送到另一個(gè)客戶端進(jìn)行導(dǎo)入時(shí),私鑰就需要進(jìn)行網(wǎng)絡(luò)傳輸了,于是我們也就有了對其進(jìn)行編碼的需要,由此私鑰對應(yīng)的編碼簡稱為WIF。
我們看看WIF編碼格式的基本步驟:
1,如果私鑰對應(yīng)的是比特幣主網(wǎng)絡(luò),那么在私鑰的開頭增加一個(gè)字節(jié)0x80,如果對應(yīng)測試網(wǎng)絡(luò)增增加字節(jié)0xef.
2,將其進(jìn)行大端格式存儲
3,如果該私鑰要用來創(chuàng)建壓縮格式的公鑰,那么在步驟2的末尾增加1個(gè)字節(jié)0x01
4,對步驟3做sha256哈希,然后去結(jié)果的前4個(gè)字節(jié)
5.把步驟3和4的結(jié)果首尾相連,然后再做base58編碼
我們使用代碼實(shí)現(xiàn)看看:
privKey = 0x038109007313a5807b2eccc082c8c3fbb988a973cacf1a7df9ce725c31b14776
pubKey = privKey * Gclass PrivateKey:def __init__(self, secret):self.secret = secretdef wif(self, compressed=True, testnet=False):#先將私鑰進(jìn)行大端轉(zhuǎn)換secret_bytes = self.secret.to_bytes(32, 'big')if testnet:#如果是測試網(wǎng)絡(luò)的私鑰則在開頭增加字節(jié)0xefprefix = b'\xef'else:#如果是主網(wǎng)絡(luò)則在開頭增加字節(jié)0x80prefix = b'\0x80'if compressed:#如果要?jiǎng)?chuàng)建壓縮格式的公鑰,在末尾增加自己0x1suffix = b'\0x01'else:suffix = ''return encode_base58_checksum(prefix + secret_bytes + suffix)private_key = PrivateKey(privKey)
wif_private_key = private_key.wif()
print(f"the wif for give private key is: {wif_private_key}")
上面代碼運(yùn)行后結(jié)果為:
the wif for give private key is: 19re3h9z4eEC6WYaziGHvAY8nS8hNddiPcxe4B9a6vA2SbEaSjtqDLYC3SYk
更多內(nèi)容請?jiān)?b 站搜索 coding 迪斯尼