XPub เป็น YPub Converter (python) - ตัวเลขสุดท้ายผิด

Sep 02 2020

โค้ดด้านล่างสร้าง YPub จาก XPub โดยมีตัวเลข 6 หลักสุดท้ายไม่ถูกต้อง

ฉันจะตรวจสอบสิ่งที่เกิดขึ้นและแก้ไขข้อผิดพลาดนี้ได้อย่างไร

เช่น: ควรเป็นypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZZrC

แต่มันส่งกลับ ypub6X7aFbqxwbJHJQqUhfTEZDWxVT8qbu4qjN8fCz9ADRuAwaZQ243YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZZrP94 YiB1w5yTE2qRJzRJ3Kza9DbefU8pnqjk3GEmn6g9usvkZZrP94

โค้ดนี้ดัดแปลงมาจากฟังก์ชันใน 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)

คำตอบ

1 AndrewChow Sep 02 2020 at 07:25

base58.b58decodeและbase58.b58encodeฟังก์ชั่นเพียงทำฐาน 58 ถอดรหัส / เข้ารหัส อย่างไรก็ตาม xpubs ถูกเข้ารหัสด้วยฐาน 58 ตรวจสอบการเข้ารหัส ความแตกต่างคือการเข้ารหัส Base 58 Check จะคำนวณการตรวจสอบของเพย์โหลดและผนวก 4 ไบต์แรกของสิ่งนั้นเข้ากับเพย์โหลดก่อนการเข้ารหัสฐาน 58

คุณต้องใช้base58.b58decode_checkและbase58.b58encode_checkจะวางการตรวจสอบสำหรับการถอดรหัสและเพิ่มการตรวจสอบสำหรับการเข้ารหัส