Может кто-нибудь, пожалуйста, помогите мне найти PHP с открытым исходным кодом о том, как проверить/проверить открытый ключ биткойн-кошелька? В настоящее время я работаю над проектом и реализую мультиподпись, и, похоже, я не могу найти какую-либо информацию о том, как проверить/подтвердить открытый ключ кошелька.
Пример открытого ключа, который я пытаюсь проверить: xpub661MyMwAqRbcEwAAmd9DpSfoDEUar3C2e8LtpeMCaaPWMoLjAf3jY3RucUmtim729c2qzGmYPaBcFdkEUQuwgrFjTKFweKSCfRfd949k4DC
По сути, я хочу убедиться, что пользователь не может добавить неправильный или недействительный ключ, иначе кошелек с мультиподписью не может быть создан, когда система попытается его создать, и мне нужно предотвратить это.
Спасибо за ваше время!
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.
Кларис