Convertidor de XPub a YPub (python) - Últimos dígitos incorrectos

Sep 02 2020

El siguiente código genera un YPub desde XPub con los últimos 6 dígitos incorrectos.

¿Cómo puedo verificar lo que está sucediendo y corregir este error?

Por ejemplo: debería ser ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZVdPz94

pero devuelve ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZZrP94 Yk

El código está adaptado de esta función en JS, que funciona bien.

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)

Respuestas

1 AndrewChow Sep 02 2020 at 07:25

Las funciones base58.b58decodey solo las decodifica / codifica la Base 58. Sin embargo, los xpubs están codificados con la codificación Base 58 Check . La diferencia es que la codificación Base 58 Check calcula una suma de comprobación de la carga útil y agrega los primeros 4 bytes de esa a la carga útil antes de la codificación base 58.base58.b58encode

Necesita usar base58.b58decode_checky base58.b58encode_checkque eliminará la suma de verificación para la decodificación y agregará la suma de verificación para la codificación.