使用 Python 3.6 (Pythonista - iPadOS) 生成有效 WIF 密钥的问题
Issue producing a valid WIF key with Python 3.6 (Pythonista - iPadOS)
我在使用某些代码时遇到了一些问题。我已经开始了一个创建比特币钱包的项目,试图将一种爱好变成一种学习体验,借此我可以更详细地理解 Python 和比特币协议。我在这里而不是在比特币网站上发帖,因为问题与 Python 编程有关。
下面是我创建的一些代码,用于将私钥转换为 WIF 密钥。我写出来是为了清楚而不是最佳的编码方法,这样我就可以清楚地看到所有步骤并处理问题。这段代码以前是一系列的代码,现在我已经发展成为一个 class 的函数。
我正在按照此页面中的示例进行操作:https://en.bitcoin.it/wiki/Wallet_import_format
这是我当前的代码:
import hashlib
import codecs
class wif():
def private_to_wif(private_key):
extended_key = wif.create_extended(private_key)
address = wif.create_wif_address(extended_key)
return address
def create_extended(private_key):
private_key1 = bytes.fromhex(private_key)
private_key2 = codecs.encode(private_key1, 'hex')
mainnet = b'80'
#testnet = b'ef'
#compressed = b'01'
extended_key = mainnet + private_key2
return extended_key
def create_wif_address(extended_key):
first_hash = hashlib.sha256(extended_key)
first_digest = first_hash.digest()
second_hash = hashlib.sha256(first_digest)
second_digest = second_hash.digest()
second_digest_hex = codecs.encode(second_digest, 'hex')
checksum = second_digest_hex[:8]
extended_key_chksm = (extended_key + checksum).decode('utf-8')
wif_address = base58(extended_key_chksm)
return wif_address
def base58(extended_key_chksm):
alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
b58_string = ''
leading_zeros = len(extended_key_chksm) - len(extended_key_chksm.lstrip('0'))
address_int = int(extended_key_chksm, 16)
while address_int > 0:
digit = address_int % 58
digit_char = alphabet[digit]
b58_string = digit_char + b58_string
address_int //= 58
ones = leading_zeros // 2
for one in range(ones):
b58_string = '1' + b58_string
return b58_string
然后我使用上面指南中的示例私钥,使用几行代码来实现它,如下所示:
key = ‘0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D‘
address = wif.private_to_wif(key)
Print(address)
我应该得到输出:5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ
相反,我得到:
5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbWs6eYX
只有最后6个字符不同!
如有任何建议和帮助,我们将不胜感激。
提前致谢。
康纳
我已经通过添加缺失的编码步骤找到了解决方案。
我发帖是为了所有 运行 遇到类似问题并且可以看到解决问题的步骤。
def create_wif_address(extended_key):
extended_key_dec = codecs.decode(extended_key, 'hex')
first_hash = hashlib.sha256(extended_key_dec)
first_digest = first_hash.digest()
second_hash = hashlib.sha256(first_digest)
second_digest = second_hash.digest()
second_digest_hex = codecs.encode(second_digest, 'hex')
checksum = second_digest_hex[:8]
extended_key_chksm = (extended_key + checksum).decode('utf-8')
wif_address = base58(extended_key_chksm)
return wif_address
所以上面我在函数中添加了一个步骤,在开始时,将传入的变量从十六进制字节字符串解码为原始字节,这似乎是哈希算法所需要的,这产生了结果我希望实现。
康纳
我在使用某些代码时遇到了一些问题。我已经开始了一个创建比特币钱包的项目,试图将一种爱好变成一种学习体验,借此我可以更详细地理解 Python 和比特币协议。我在这里而不是在比特币网站上发帖,因为问题与 Python 编程有关。
下面是我创建的一些代码,用于将私钥转换为 WIF 密钥。我写出来是为了清楚而不是最佳的编码方法,这样我就可以清楚地看到所有步骤并处理问题。这段代码以前是一系列的代码,现在我已经发展成为一个 class 的函数。
我正在按照此页面中的示例进行操作:https://en.bitcoin.it/wiki/Wallet_import_format
这是我当前的代码:
import hashlib
import codecs
class wif():
def private_to_wif(private_key):
extended_key = wif.create_extended(private_key)
address = wif.create_wif_address(extended_key)
return address
def create_extended(private_key):
private_key1 = bytes.fromhex(private_key)
private_key2 = codecs.encode(private_key1, 'hex')
mainnet = b'80'
#testnet = b'ef'
#compressed = b'01'
extended_key = mainnet + private_key2
return extended_key
def create_wif_address(extended_key):
first_hash = hashlib.sha256(extended_key)
first_digest = first_hash.digest()
second_hash = hashlib.sha256(first_digest)
second_digest = second_hash.digest()
second_digest_hex = codecs.encode(second_digest, 'hex')
checksum = second_digest_hex[:8]
extended_key_chksm = (extended_key + checksum).decode('utf-8')
wif_address = base58(extended_key_chksm)
return wif_address
def base58(extended_key_chksm):
alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
b58_string = ''
leading_zeros = len(extended_key_chksm) - len(extended_key_chksm.lstrip('0'))
address_int = int(extended_key_chksm, 16)
while address_int > 0:
digit = address_int % 58
digit_char = alphabet[digit]
b58_string = digit_char + b58_string
address_int //= 58
ones = leading_zeros // 2
for one in range(ones):
b58_string = '1' + b58_string
return b58_string
然后我使用上面指南中的示例私钥,使用几行代码来实现它,如下所示:
key = ‘0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D‘
address = wif.private_to_wif(key)
Print(address)
我应该得到输出:5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ
相反,我得到:
5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbWs6eYX
只有最后6个字符不同!
如有任何建议和帮助,我们将不胜感激。
提前致谢。
康纳
我已经通过添加缺失的编码步骤找到了解决方案。
我发帖是为了所有 运行 遇到类似问题并且可以看到解决问题的步骤。
def create_wif_address(extended_key):
extended_key_dec = codecs.decode(extended_key, 'hex')
first_hash = hashlib.sha256(extended_key_dec)
first_digest = first_hash.digest()
second_hash = hashlib.sha256(first_digest)
second_digest = second_hash.digest()
second_digest_hex = codecs.encode(second_digest, 'hex')
checksum = second_digest_hex[:8]
extended_key_chksm = (extended_key + checksum).decode('utf-8')
wif_address = base58(extended_key_chksm)
return wif_address
所以上面我在函数中添加了一个步骤,在开始时,将传入的变量从十六进制字节字符串解码为原始字节,这似乎是哈希算法所需要的,这产生了结果我希望实现。
康纳