我只是作为编码新手阅读了一个教程。本教程就是这个教程:https : //www.youtube.com/watch?v=tX-XokHf_nI。而且我想用1个易于阅读(不是神秘的)Python文件生成我的比特币地址/私钥-就像现在编写代码的样式一样。
本教程介绍了我以“ 1”开头但不是私钥以“ 5”开头的比特币地址的部分。另外,我不知道如何BIP38加密私钥(以“ 6”开头)。如您所见,主要的比特币网络。
在教程之后,使用https://en.bitcoin.it/wiki/Wallet_import_format作为逐步指南。最后,我评论了自己尝试做的事情,因为这一切都是垃圾。(带有“ SHA256哈希扩展扩展私钥的部分在很多级别上都错了”)我认为向私钥添加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
在这里,您可以看到我的代码,该代码在本教程中也得到了尽可能多的评论:(忘记注释掉“这是我的哈希ext私钥校验和”部分,很抱歉造成混淆。这是我需要帮助的代码现在。)
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")
Marco.. 5
您可能会从比特币Wiki的步骤中误解的是,所有散列和填充必须在密钥上以字节而不是字符串的形式进行。
这意味着,如果您想从私钥中派生WIF密钥,"29a59..."
则不必对字符串 进行哈希处理,而可以对与之对应"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(...)
告诉我们由十六进制字符串表示的二进制数据。
您的其余代码工作正常;)
您可能会从比特币Wiki的步骤中误解的是,所有散列和填充必须在密钥上以字节而不是字符串的形式进行。
这意味着,如果您想从私钥中派生WIF密钥,"29a59..."
则不必对字符串 进行哈希处理,而可以对与之对应"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(...)
告诉我们由十六进制字符串表示的二进制数据。
您的其余代码工作正常;)