Convertitore da XPub a YPub (python) - Ultime cifre sbagliate

Sep 02 2020

Il codice seguente sta generando un YPub da XPub con le ultime 6 cifre sbagliate.

Come posso verificare cosa sta succedendo e correggere questo errore?

ad esempio: dovrebbe essere ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9 VcBZZrP94

ma restituisce ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZZJSSP94 Y

Il codice è adattato da questa funzione in JS, che funziona bene.

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)

Risposte

1 AndrewChow Sep 02 2020 at 07:25

Le funzioni base58.b58decodee eseguono solo la decodifica / codifica della Base 58. Tuttavia gli xpub sono codificati con la codifica Base 58 Check . La differenza è che la codifica Base 58 Check calcola un checksum del payload e aggiunge i primi 4 byte di quello al payload prima della codifica base 58.base58.b58encode

È necessario utilizzare base58.b58decode_checke base58.b58encode_checkche eliminerà il checksum per la decodifica e aggiungerà il checksum per la codifica.