Преобразование ключа xpub в основной формат

Я испытываю некоторые серьезные проблемы, которые я, честно говоря, не могу понять. Когда я создаю кошелек из Electrum, открытый ключ выглядит так:xpub661MyMwAqRbcG8Zah6TcX3QpP5yJApaXcyLK8CJcZkuYjczivsHxVL5qm9cw8BYLYehgFeddK5WrxhntpcvqJKTVg96dUVL9P7hZ7Kcvqvd

Когда я генерирую адрес кошелька из биткойн-ядра rpc, открытый ключ выглядит так:037acd3408dfb612a69204c5f5bafe2a326646398cdd16c85fedd65a4e96a28278

Когда я пытаюсь создать мультиподписной адрес в ядре, используя этот тип открытых ключей, я получаю сообщение об ошибке:xpub661MyMwAqRbcG8Zah6TcX3QpP5yJApaXcyLK8CJcZkuYjczivsHxVL5qm9cw8BYLYehgFeddK5WrxhntpcvqJKTVg96dUVL9P7hZ7Kcvqvd

Когда я пытаюсь создать мультиподписной адрес в ядре (через PHP), используя этот тип открытых ключей, он работает:037acd3408dfb612a69204c5f5bafe2a326646398cdd16c85fedd65a4e96a28278

Я очень смущен.

Я разрабатываю мультиподписную систему для биткойнов, но кажется, что я не могу этого сделать, так как клиенты почти всегда будут использовать этот тип открытого ключа, сгенерированного из Electrum:xpub661MyMwAqRbcG8Zah6TcX3QpP5yJApaXcyLK8CJcZkuYjczivsHxVL5qm9cw8BYLYehgFeddK5WrxhntpcvqJKTVg96dUVL9P7hZ7Kcvqvd

Есть ли какой-либо способ преобразования в PHP из этого типа открытого ключа: xpub661MyMwAqRbcG8Zah6TcX3QpP5yJApaXcyLK8CJcZkuYjczivsHxVL5qm9cw8BYLYehgFeddK5WrxhntpcvqJKTVg96dUVL9P7hZ7Kcvqvdв этот тип 037acd3408dfb612a69204c5f5bafe2a326646398cdd16c85fedd65a4e96a28278:? Я пытаюсь понять, что я делаю неправильно

Спасибо за ваше время, и надеюсь получить ответ!

Ответы (1)

Открытый ключ Electrum xpub661MyMwAqRbcG8Zah6TcX3QpP5yJApaXcyLK8CJcZkuYjczivsHxVL5qm9cw8BYLYehgFeddK5WrxhntpcvqJKTVg96dUVL9P7hZ7Kcvqvd представляет собой расширенный открытый ключ BIP32 . Это можно использовать для получения дочерних адресов.

Открытый ключ Bitcoin-Core 037acd3408dfb612a69204c5f5bafe2a326646398cdd16c85fedd65a4e96a28278 представляет собой шестнадцатеричное представление сжатой формы открытого ключа .

Чтобы преобразовать из расширенного в сжатый формат, все, что вам нужно сделать, это декодировать из Base58Check и получить последние 33 байта (32 для закрытых ключей). Я уверен, что в PHP есть реализация для декодирования Base58Check. См. BIP32 — расширенная сериализация ключей :

$ printf "xpub661MyMwAqRbcG8Zah6TcX3QpP5yJApaXcyLK8CJcZkuYjczivsHxVL5qm9cw8BYLYehgFeddK5WrxhntpcvqJKTVg96dUVL9P7hZ7Kcvqvd" | base58 -dc | xxd -p 0488b21e0000000000000000009f8b20f34eceef6ea60d35db00446763f7 dc76bd60ec8cf6fd63dc912499cbd4039edccce0e93f436a283947412378 8b33a28ed7ad7cffc3a130889f232344ad1c

Последние 33 байта представляют собой шестнадцатеричную версию сжатого открытого ключа (последние 32 байта для закрытых ключей).

039edccce0e93f436a2839474123788b33a28ed7ad7cffc3a130889f232344ad1c