Проблема с созданием действительного ключа WIF с помощью Python 3.6 (Pythonista — iPadOS)

#python-3.x #cryptography #bitcoin

#python-3.x #криптография #биткойн

Вопрос:

У меня возникли некоторые проблемы с некоторым кодом. Я приступил к проекту по созданию биткойн-кошельков в попытке превратить хобби в учебный процесс, благодаря которому я могу более подробно понять как Python, так и протокол Биткойн. Я разместил здесь, а не на сайте биткойнов, поскольку вопрос связан с программированием на Python.

Ниже у меня есть некоторый код, который я создал, чтобы превратить закрытый ключ в ключ WIF. Я написал это для ясности, а не для наиболее оптимального метода кодирования, чтобы я мог четко видеть все шаги и работать над проблемами. Ранее этот код представлял собой серию строк, которые я теперь превратил в класс с функциями.

Я следую примеру с этой страницы: 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 символов!

Любые предложения и помощь будут высоко оценены.

Заранее благодарю вас.

Коннор

Ответ №1:

Мне удалось найти решение, добавив недостающий шаг кодирования.

Я публикую для всех тех, кто столкнулся с подобной проблемой, и вижу шаги, которые привели к разрешению.

 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
 

Итак, выше я добавил шаг к функции, в начале, для декодирования переданной переменной из строки шестнадцатеричных байтов в необработанные байты, чего, похоже, требуют алгоритмы хеширования, и это дало результат, которого я надеялся достичь.

Коннор