使用 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

所以上面我在函数中添加了一个步骤,在开始时,将传入的变量从十六进制字节字符串解码为原始字节,这似乎是哈希算法所需要的,这产生了结果我希望实现。

康纳