Conversor XPub para YPub (python) - Últimos dígitos errados

Sep 02 2020

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

1 AndrewChow Sep 02 2020 at 07:25

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.