Address
從 Electrum 導出的私鑰,無法使用 Python 重新創建地址
我創建了一個新的 Electrum 錢包,這是一個地址:
1JkZLnmFfpVFLT2ZMtKzc6BuXMdmY41EHA
通過右鍵點擊它,我選擇“私鑰”,它給出:
Kzuucz58MiTbbedeVuqBaPYwG1TQrV3n2NYU2dJRZ7HEHnHsUXWx
現在我希望能夠(了解它是如何工作的)通過橢圓曲線乘法從這個私鑰到地址。
這是我嘗試過的:
import bitcoin #pybitcointools import base58 import binascii pvt = 'Kzuucz58MiTbbedeVuqBaPYwG1TQrV3n2NYU2dJRZ7HEHnHsUXWx' pvtdecoded = base58.b58decode(pvt) pvthex = binascii.hexlify(pvtdecoded)[2:-8] # remove the first initial byte for version and 4 final bytes for checksum pvt2 = bitcoin.decode_privkey(pvthex, 'hex') # decode as a decimal # generate pubkey from pvtkey with elliptic curve multiplication public_key = bitcoin.fast_multiply(bitcoin.G, pvt2) addr = bitcoin.pubkey_to_address(public_key) print addr
這給出:
1LNSuE4NKHTyHygeKwnU1equ7MjPMhayxB
這不是原始地址。怎麼了?如何
1JkZLnmFfpVFLT2ZMtKzc6BuXMdmY41EHA
使用橢圓曲線乘法從私鑰中恢復原始地址( )?編輯:由於
Kz....Wx
私鑰看起來像一個 WIF 壓縮的,我試圖替換:pvt2 = bitcoin.decode_privkey(pvthex, 'hex') # decode as a decimal
經過
pvt2 = bitcoin.decode_privkey('Kzuucz58MiTbbedeVuqBaPYwG1TQrV3n2NYU2dJRZ7HEHnHsUXWx', 'wif')
但是在橢圓曲線乘法之後,它給出了另一個地址,這仍然不是一個好地址!(
18dFF3EQoPxR44TygdGxHPMe3LSLFeQe4U
)
在這兩種情況下,您都不會生成與壓縮公鑰對應的地址。
在第一種情況下,您正在創建看似無效的地址。至少,它使用的私鑰是不正確的,因為它有壓縮字節。這將更改您在解碼時獲得的私鑰值。為了獲得與第二種情況相同的結果,您需要從解碼的 WIF 密鑰中刪除一個額外的字節,因為該字節指定了壓縮。您使用的密鑰是 33 個字節,而不是實際私鑰的 32 個字節。
在第二種情況下,您沒有創建壓縮公鑰來生成地址。它仍在使用未壓縮的公鑰。與其
fast_multiply
自己使用和創建公鑰,不如使用privkey_to_pubkey
.fast_multiply
是一種數學運算,它沒有壓縮公鑰的概念。但是privkey_to_pubkey
,這樣做會創建正確的公鑰。然後您可以使用該公鑰生成地址。而不是做
public_key = bitcoin.fast_multiply(bitcoin.G, pvt2)
你應該做
public_key = bitcoin.privkey_to_pubkey(pvt)