¿Cómo puedo probar si una dirección de bitcoin está comprimida o no?

Tengo dos direcciones de bitcoin:

1D8VSXHFAWNhAbruwUMbNp4hsXAnRNkYvX
12T15tvMGaymMX97X9KxVzyLF323r8v6Hg

Uno está comprimido, el otro no.

¿Cómo puedo probar cuál es cuál? (Preferiblemente usando python 2.7)

Gracias por adelantado :)

Respuestas (4)

No puede determinar (solo a partir de una dirección base58check) si la clave pública correspondiente está comprimida.

Un hash de clave pública de pago "normal" (P2PKH) es un hash criptográfico de una clave pública comprimida o sin comprimir. Debido a que los hashes no se pueden revertir de manera factible, no se puede saber si la clave pública, antes de ser codificada, estaba comprimida o descomprimida.

Más específicamente, una clave pública en Bitcoin es un par de números enteros (x,y). Para las claves públicas sin comprimir, estos enteros se codifican como enteros big-endian sin firmar de 256 bits , se concatenan y luego se anteponen con un solo byte 0x04. El resultado tiene una longitud de 65 bytes.

Para claves públicas comprimidas, solo se codifica la coordenada x (como arriba, como int big-endian sin firmar de 256 bits). Resulta que la coordenada y solo puede ser uno de dos valores, uno par y otro impar. En lugar de anteponer un solo byte 0x04, se antepone un solo byte 0x02 o 0x03 según el valor de y (0x02 para par, 0x03 para impar). El resultado tiene una longitud de 33 bytes.

Finalmente, estos bytes (de uno de los dos párrafos anteriores) pasan por el proceso de conversión de direcciones descrito aquí en la Guía para desarrolladores de bitcoin.org , que incluye tomar un hash criptográfico irreversible (en realidad, dos hash).

Tenga en cuenta que para canjear un UTXO asociado con una dirección P2PKH, el canjeador debe crear una transacción que incluya la clave pública sin cifrar, ya sea comprimida o sin comprimir . Si tal tx existe en la cadena de bloques, se puede conectar a su dirección base58check "normal". Esta es una de las razones por las que se desaconseja la reutilización de direcciones: una vez que canjea un UTXO, "revela" su clave pública, que es un poco más sensible que su dirección de bitcoin.

Información de fondo:

Dada solo la dirección en sí, no, no hay forma de saber si se generó a partir de una clave pública comprimida o sin comprimir. Esto se calcula a partir de la codificación base58 de RIPEMD (SHA256 (public_key_bytes)). Dado que el hash no es reversible, sin la clave pública ya disponible, no podrá obtener más información.

Solo mire los datos decodificados en base58:

$ decodeBase58 12T15tvMGaymMX97X9KxVzyLF323r8v6Hg
000FE302E0D96D9F9AA71738A426A9696EB49AD458679BAFD3

$ decodeBase58 1D8VSXHFAWNhAbruwUMbNp4hsXAnRNkYvX
00850C296420DC9B02CE237ED630B89815E0803EA3BED0F344

El byte de la versión es 0x00 en ambos, luego están los 20 bytes del hash y una suma de comprobación de 4 bytes. Nada de esto revela ninguna información sobre qué información fue codificada.

Una dirección es el hash de la clave pública (más la suma de comprobación y el control de versiones). Los hashes son irreversibles y se distribuyen aleatoriamente, por lo que no hay forma de determinar la clave pública a partir de la clave pública.

Como mencionaron los demás, la respuesta corta es no, pero a partir de una clave WIF ( formato de importación de billetera ) puede determinar si la dirección está comprimida o no al verificar el último byte si lo está 0x01.