2017-07-15 32 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

相关问题