Conversor XPub para YPub (python) - Últimos dígitos errados
O código abaixo está gerando um YPub a partir do XPub com os últimos 6 dígitos errados.
Como posso verificar o que está acontecendo e corrigir esse erro?
Por exemplo: deve ser ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6gzdzkZVr94
mas retorna ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZZrSS94 Ykjg9usvkZZrSS94
O código é adaptado desta função em JS, que funciona bem.
import hashlib
import base58
prefixesPub = {
'xpub': '0488b21e',
'ypub': '049d7cb2',
'Ypub': '0295b43f',
'zpub': '04b24746',
'Zpub': '02aa7ed3',
'tpub': '043587cf',
'upub': '044a5262',
'Upub': '024289ef',
'vpub': '045f1cf6',
'Vpub': '02575483'
}
def convert_pub_key(_xpub, target_prefix):
decoded_extended_publicKey = base58.b58decode(_xpub.strip())
extended_public_key_no_prefix = decoded_extended_publicKey[4:]
extended_public_key_new_prefix = bytes.fromhex(prefixesPub[target_prefix]) + extended_public_key_no_prefix
print(base58.b58encode(extended_public_key_new_prefix))
pub_key = "xpub6CHJwwB3nukoT7eMsJfcM8RTKUzPfH5LpFcSRbFGqRXHtUkAmPsz67Mo4mVe2vmPanBEaWyakwJ7arDE83L2U16BELTVJ1w5J8KVfyMqtzE"
prefix = "ypub"
convert_pub_key(pub_key, prefix)
Respostas
As funções base58.b58decodee apenas fazem a decodificação / codificação Base 58. No entanto, os xpubs são codificados com a codificação Base 58 Check . A diferença é que a codificação Base 58 Check calcula uma soma de verificação da carga útil e acrescenta os primeiros 4 bytes à carga antes da codificação base 58.base58.b58encode
Você precisa usar base58.b58decode_checke base58.b58encode_checkque eliminará a soma de verificação para a decodificação e adicionará a soma de verificação para a codificação.