2017-07-15 31 views
3

我剛剛通過一個教程作爲一個編碼新手。教程是這個:https://www.youtube.com/watch?v=tX-XokHf_nI。我想用一個容易閱讀(而不是神祕)的Python文件來生成我的比特幣地址/特權碼 - 就像現在編寫代碼的風格一樣。Python 2.7將Bitcoin Privkey轉換爲WIF Privkey

本教程介紹了我從比如「1」開始的比特幣地址,但不是以「5」開頭的特權。另外我缺少如何對BIP38加密私鑰(以「6」開頭)。就像您可以看到的主要比特幣網絡一樣。

使用https://en.bitcoin.it/wiki/Wallet_import_format作爲教程後面的一步一步指南。最後我提出了自己的嘗試,因爲這一切都是垃圾。 (帶有「SHA256 HASHED EXTENDED PRIVATE KEY 這個錯誤在很多層次上」的部分)我認爲我將80字節添加到私鑰的部分可能是正確的。 PS:我現在使用靜態私鑰,直到一切正常,這就是爲什麼我將非靜態私鑰部分註釋掉的原因。它已經通過我註釋過的「非靜態私鑰使用」部分生成。我還註釋了簽名的消息代碼行(位於代碼的底部),因爲它們在教程中顯示,對於密鑰/地址生成不重要。我還試圖通過僅在文件底部放置打印等來「美化」代碼,並將事情分類有點不同等,但事實證明,Python 2.7並不喜歡這樣。

我正在使用Python 2.7,成功安裝了所有東西,代碼正在工作,因爲它現在應該與註釋掉的部分一起工作。我使用bitaddress.org驗證了它打印的結果,就像教程的上傳器一樣。試圖尋找解決方案,但我無法從我的搜索結果中獲得任何有用的信息。

如果你能幫我解決一些缺少的代碼行,我會很高興!也可以在代碼中解釋/評論什麼是什麼。特別是對於尚未缺失的BIP38 Privkey密碼加密。所以我可以看到什麼是可以理解的。

運行.py腳本會返回有效的結果,但我添加的80個字節除外 - 如果這樣做已被我完成,則無法創建。添加80個字節是獲取以「5」開始的最終私鑰的必要步驟。

運行它打印:

This is my Private Key: 29a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736 
This is my 80 Byte Private Key: 8029a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736 
This is my Public Key: 04d370b77a4cf0078ab9e0ba3c9e78e8dd87cc047fa58d751b3719daa29ac7fbf2c3ba8338f9a08f60a74a5d3a2d10f26afa2f703b8c430eecad89d59a9df00ec5 
This is my Bitcoin Address: 1B3wS8dQHtfMpFMSmtT5Fy4kHCYvxejtVo 

在這裏你可以看到我的代碼,評論在這裏和那裏一樣好,我可以根據教程: (忘了註釋掉「這是我的散列分機私法關鍵校驗」的一部分,很抱歉的混亂。這是我需要現在幫助的代碼。)

import os 
import ecdsa 
import hashlib 
import base58 

## STATIC KEY USAGE 
private_key_static = "29a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736" 
## PRINTOUT FROM STATIC PRIVATE KEY 
print "This is my Private Key: " + private_key_static 

## NON STATIC PRIVATE KEY USAGE 
#private_key = os.urandom(32).encode("hex") 
#print "this is my private key: " + private_key 

## 80-BYTE EXTENDED PRIVATE KEY 
private_key_plus_80byte = (('80') + private_key_static) 

## PRINTOUT 80-BYTE EXTENDED PRIVATE KEY 
print "This is my 80 Byte Private Key: " + private_key_plus_80byte 

## SHA256 HASHED EXTENDED PRIVATE KEY 
## THIS IS WRONG ON SO MANY LEVELS 
#hashed_ext_priv_key_checksum = hashlib.sha256(hashlib.sha256(private_key_plus_80byte).digest()).digest()[:4] 
#hashed_ext_priv_key_checksum = hashed_ext_priv_key_checksum.decode("hex") 
#print "This is my hashed ext priv key checksum: " + hashed_ext_priv_key_checksum 

## PRIVATE! SIGNING KEY ECDSA.SECP256k1 
sk = ecdsa.SigningKey.from_string(private_key_static.decode("hex"), 
         curve = ecdsa.SECP256k1) 

## PUBLIC! VERIFYING KEY (64 BYTE LONG, MISSING 04 BYTE AT THE BEGINNING) 
vk = sk.verifying_key 

## PUBLIC KEY 
public_key = ('\04' + vk.to_string()).encode("hex") 
## PRINTOUT PUBLIC KEY 
print "This is my Public Key: " + public_key 

## PUBLIC KEY ENCODING (2x RIPEMD160) 
ripemd160 = hashlib.new('ripemd160') 

ripemd160.update(hashlib.sha256(public_key.decode('hex')).digest()) 

middle_man = ('\00') + ripemd160.digest() 

checksum = hashlib.sha256(hashlib.sha256(middle_man).digest()).digest()[:4] 

binary_addr = middle_man + checksum 

addr = base58.b58encode(binary_addr) 

print "This is my Bitcoin Address: " + addr 

## MESSAGE CONTENT 
#msg = "hello world" 

## SIGN MESSAGE CONTENT 
#signed_msg = sk.sign(msg) 

## VERIFY MESSAGE CONTENT 
#assert vk.verify(signed_msg, "hello world") 

## PRINTOUT SIGNED MESSAGE ENCODED TO HEX 
#print "This is a HEX encoded signed Message: " + signed_msg.encode("hex") 
+0

好的細節@BloodyPythonNewbie!歡迎來到這個網站。只是一個暗示 - 閱讀這個問題時沒有背後的個人故事更容易。我剝去了幾個不影響問題內容的句子。希望你能儘快得到答案:) – viraptor

+0

非常感謝!事實上,正如你編輯它似乎刪除了我想要的部分,因爲它容易閱讀,而不是神祕的文件。就像現在一樣! :) 需要幫助我瞭解的代碼行。在網上看到很多真正神祕的python代碼,並沒有用處。就像這個代碼將是最好的幫助我一樣! – BloodyPythonNewbie

回答

3

你可能從Bitcoin Wiki's步驟誤解是什麼,所有的散列和東西必須上的按鍵來完成作爲字節,而不是字符串。

這意味着,如果你想獲得從您的私鑰"29a59..."的WIF鍵,你不必散列"8029a59..."但與之對應,而不是二進制數據

這裏缺少的片段,作品

# importing binascii to be able to convert hexadecimal strings to binary data 
import binascii 

# Step 1: here we have the private key 
private_key_static = "29a59e66fe370e901174a1b8296d31998da5588c7e0dba860f11d65a3adf2736" 
# Step 2: let's add 80 in front of it 
extended_key = "80"+private_key_static 
# Step 3: first SHA-256 
first_sha256 = hashlib.sha256(binascii.unhexlify(extended_key)).hexdigest() 
# Step 4: second SHA-256 
second_sha256 = hashlib.sha256(binascii.unhexlify(first_sha256)).hexdigest() 
# Step 5-6: add checksum to end of extended key 
final_key = extended_key+second_sha256[:8] 
# Step 7: finally the Wallet Import Format is the base 58 encode of final_key 
WIF = base58.b58encode(binascii.unhexlify(final_key)) 
print (WIF) 

其中binascii.unhexlify(...)告訴我們,由十六進制字符串表示的二進制數據。

其餘的代碼工作得很好;)

+0

謝謝!我會仔細研究一下嘗試,並會回覆。 :) 再次感謝! – BloodyPythonNewbie

+0

@BloodyPythonNewbie樂於幫助。如果此答案解決了您的問題,請將其標記爲已接受。否則,請隨時向我們提問。 – Marco

相關問題