PHP ¿Cómo puedo validar/verificar una clave pública de billetera?

¿Puede alguien ayudarme a encontrar algún código abierto de PHP sobre cómo validar / verificar una clave pública de billetera bitcoin? Actualmente estoy trabajando en un proyecto y estoy implementando multisig, y parece que no puedo encontrar ningún tipo de información sobre cómo verificar/validar una clave pública de billetera.

Ejemplo de clave pública que estoy tratando de validar: xpub661MyMwAqRbcEwAAmd9DpSfoDEUar3C2e8LtpeMCaaPWMoLjAf3jY3RucUmtim729c2qzGmYPaBcFdkEUQuwgrFjTKFwEKSCfRfd949k4DC

Básicamente, quiero asegurarme de que el usuario no pueda agregar una clave incorrecta o inválida, de lo contrario, la billetera multisig no se puede crear cuando el sistema intentará crearla, y necesito evitar eso.

¡Gracias por tu tiempo!

Eso no es una clave pública.

Respuestas (1)

BIP32 especifica el formato de serialización utilizado por las claves extendidas como:

Formato de serialización Las claves públicas y privadas extendidas se serializan de la siguiente manera:

  • 4 bytes: bytes de versión (mainnet: 0x0488B21E público, 0x0488ADE4 privado; testnet: 0x043587CF público, 0x04358394 privado)
  • 1 byte: profundidad: 0x00 para nodos maestros, 0x01 para claves derivadas de nivel 1,
  • 4 bytes: la huella digital de la clave principal (0x00000000 si es clave maestra)
  • 4 bytes: número de niño. Esto es ser32(i) para i en xi = xpar/i, siendo xi la clave serializada. (0x00000000 si es clave maestra)
  • 32 bytes: el código de cadena
  • 33 bytes: la clave pública o los datos de la clave privada (serP(K) para claves públicas, 0x00 || ser256(k) para claves privadas)

Esta estructura de 78 bytes se puede codificar como otros datos de Bitcoin en Base58, agregando primero 32 bits de suma de verificación (derivados de la suma de verificación doble SHA-256) y luego convirtiéndolos a la representación de Base58. Esto da como resultado una cadena codificada en Base58 de hasta 112 caracteres. Debido a la elección de los bytes de versión, la representación de Base58 comenzará con "xprv" o "xpub" en mainnet, "tprv" o "tpub" en testnet.

Tenga en cuenta que la huella digital del padre solo sirve como una forma rápida de detectar los nodos padre e hijo en el software, y el software debe estar dispuesto a lidiar con las colisiones. Internamente, se podría utilizar el identificador completo de 160 bits.

Al importar una clave pública extendida serializada, las implementaciones deben verificar si la coordenada X en los datos de la clave pública corresponde a un punto en la curva. De lo contrario, la clave pública extendida no es válida.

Su código PHP primero debe ejecutar el algoritmo b58check para verificar que xpub esté codificado correctamente y luego decodificarlo en los valores anteriores. Por último, debe verificar que la clave pública encontrada al decodificar el xpub sea un punto de valor en la curva secp256k1.

¡Gracias por su rápida y muy informativa respuesta!
¿Se puede hacer esto también en javascript (para la validación del formulario de entrada), o hay funciones especiales de PHP que lo permiten?