PHP Как я могу проверить/проверить открытый ключ кошелька?

Может кто-нибудь, пожалуйста, помогите мне найти PHP с открытым исходным кодом о том, как проверить/проверить открытый ключ биткойн-кошелька? В настоящее время я работаю над проектом и реализую мультиподпись, и, похоже, я не могу найти какую-либо информацию о том, как проверить/подтвердить открытый ключ кошелька.

Пример открытого ключа, который я пытаюсь проверить: xpub661MyMwAqRbcEwAAmd9DpSfoDEUar3C2e8LtpeMCaaPWMoLjAf3jY3RucUmtim729c2qzGmYPaBcFdkEUQuwgrFjTKFweKSCfRfd949k4DC

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

Спасибо за ваше время!

Это не открытый ключ.

Ответы (1)

BIP32 определяет формат сериализации, используемый расширенными ключами, как:

Формат сериализации Расширенные открытые и закрытые ключи сериализуются следующим образом:

  • 4 байта: байты версии (основная сеть: общедоступная 0x0488B21E, частная 0x0488ADE4; тестовая сеть: общедоступная 0x043587CF, закрытая 0x04358394)
  • 1 байт: глубина: 0x00 для главных узлов, 0x01 для производных ключей уровня 1,
  • 4 байта: отпечаток родительского ключа (0x00000000, если мастер-ключ)
  • 4 байта: номер ребенка. Это ser32(i) для i в xi = xpar/i, где xi — серийный ключ. (0x00000000, если мастер-ключ)
  • 32 байта: код цепочки
  • 33 байта: открытый ключ или данные закрытого ключа (serP(K) для открытых ключей, 0x00 || ser256(k) для закрытых ключей)

Эту 78-байтовую структуру можно закодировать, как и другие биткойн-данные в Base58, сначала добавив 32 бита контрольной суммы (полученных из двойной контрольной суммы SHA-256), а затем преобразовав в представление Base58. В результате получается строка в кодировке Base58 длиной до 112 символов. Из-за выбора байтов версии представление Base58 будет начинаться с «xprv» или «xpub» в основной сети, «tprv» или «tpub» в тестовой сети.

Обратите внимание, что отпечаток родителя служит только быстрым способом обнаружения родительских и дочерних узлов в программном обеспечении, а программное обеспечение должно быть готово справляться с коллизиями. Внутри можно использовать полный 160-битный идентификатор.

При импорте сериализованного расширенного открытого ключа реализации должны проверять, соответствует ли координата X в данных открытого ключа точке на кривой. В противном случае расширенный открытый ключ недействителен.

Ваш PHP-код должен сначала запустить алгоритм b58check, чтобы убедиться, что xpub закодирован правильно, а затем декодировать его в приведенные выше значения. Наконец, вы должны убедиться, что публичный ключ, найденный путем декодирования xpub, является точкой значения на кривой secp256k1.

Спасибо за быстрый и очень информативный ответ!
Можно ли это также сделать в javascript (для проверки формы ввода) или существуют специальные функции PHP, которые позволяют это сделать?