#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
Итак, выше я добавил шаг к функции, в начале, для декодирования переданной переменной из строки шестнадцатеричных байтов в необработанные байты, чего, похоже, требуют алгоритмы хеширования, и это дало результат, которого я надеялся достичь.
Коннор