Para intercambiar claves públicas en ECDSA se emplean los formatos SEC (Standards of Efficient Cryptography). Como hemos mostrado en un post anterior las claves públicas en Bitcoin consisten en coordenadas (x,y) sobre la curva secp256k1. x e y son números que se representan en 32 bytes completos (256 bits).
Al principio Bitcoin solo usaba el formato no comprimido SEC posiblemente porque openssl, la librería criptográfica por excelencia, solo soportaba ese formato en los años donde se empezó la programación del código del nodo. Actualmente, Bitcoin, usa los formatos comprimido y no comprimido.
Formato no comprimido
Es el que consiste en indicar explícitamente las 2 coordenadas x e y. Ambas coordenadas van precedidas con un byte de cabecera que indica el formato:
- 04: header byte que indica que a continuación viene el punto ECDSA completo
- La coordinada x expresada en un número entero de 32 bytes con alineación big endian.
- La coordinada y expresada en un número entero de 32 bytes con alineación big endian.
Usaremos como ejemplo el mismo que en el post de ECDSA. Se trata del scriptPubKey de la transacción coinbase del bloque 12345. Observemos que la clave pública destacada en negrita comienza con el byte 04 y luego vienen las coordenadas x e y ocupando el conjunto un total 2 + 64 + 64 caracteres hexadecimales o, lo que es lo mismo, 65 bytes:
4104c5d62274610e82819939c3341a4addc72634664d73b11ba761de42839aa3496f93b3b3ee80e497eb5a68439b02f04e9aeb1604fbcaa074aa82f0f7574f9f110dac
Formato comprimido
Se basa en que puede ser redundante indicar x e y si el punto está sobre la curva y se cumple que y^2 = x^3 + 7. Es decir que si tenemos x o y se puede calcular el respectivo par usando la fórmula de la curva. El valor faltante está implícito.
Antes de ver el formato, debemos de darnos cuenta que existe un valor positivo de y (even) y otro negativo (odd) que cumplen que su cuadrado es igual a x^3 +7. Visualmente también debemos recordar que la curva se refleja sobre el eje X. Al margen de las equivalencias criptográficas, de cara a calcular la address Bitcoin esta distinción es importante.
Eso nos deja 2 opciones:
- Código cabecera 02, indicando que debemos usar la coordenada de positiva de y
- La coordinada x expresada en un número entero de 32 bytes con alineación big endian.
ó
- Código cabecera 03, indicando que debemos usar la coordenada de negativa de y
- La coordinada x expresada en un número entero de 32 bytes con alineación big endian.
A modo de ejemplo, el formato comprimido lo vemos en el scriptSig de transacciones que rediman un scriptPubKey de tipo “pubkeyhash”. Cojamos por ejemplo esta TX. Vemos en negrita la clave pública comprida:
48304502210087b4d2ac0169075583f614dc425337e3dbf002cdb0cf36ec0413a585efe7c2ea022056db8626a32705106c3b3c3eb0b184f7863050b759b93e89ce1d45dc46e52c4b4121021d7f73f8aa38bce4ab67da7267c4850495876c00badac49478abd6f81abd3ea5
Solo ocupa 66 caracteres, es decir 1 + 32 bytes, y sabemos que debemos calcular la coordenada y positiva para obtener la address correctamente y verificar la address.
Formatos híbridos
Hay otros 2 posibles formatos que usan como cabecera 0x06 y 0x07 que no vamos a ver porque no nos consta que se usen en Bitcoin.
Recomiendo consultar este tema en la wiki oficial de Bitcoin SV para estar actualizado.