Python

XPub 到 YPub 轉換器 (python) - 最後一位數字錯誤

  • September 2, 2020

下面的程式碼從 XPub 生成一個 YPub,最後 6 位數字錯誤。

如何驗證正在發生的事情並修復此錯誤?

例如:應該是 ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZZrP94 VcBVdz

但它返回 ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZZrP94 YkSjSS

程式碼改編自JS中的這個函式,效果很好。

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)

和函式base58.b58decode執行Base 58 解碼/編碼。但是 xpubs 使用 Base 58 Check編碼進行編碼。不同之處在於 Base 58 Check 編碼計算有效負載的校驗和,並將其前 4 個字節附加到 base 58 編碼之前的有效負載。base58.b58encode

您需要使用base58.b58decode_check並且base58.b58encode_check將刪除解碼的校驗和,並添加編碼的校驗和。

引用自:https://bitcoin.stackexchange.com/questions/98812