Firma

La prueba de que eres el dueño de una clave pública

Una firma se usa para probar que eres el dueño de una clave pública.

Se usa dentro de las transacciones para desbloquear salidas que fueron bloqueadas a una clave pública.

Una firma se crea usando la clave privada que se utilizó para crear la clave pública. La firma tiene, por tanto, una conexión matemática única con la clave pública, lo que basta para probar que eres el "dueño" de la clave pública sin tener que revelar la clave privada original.

Creando

¿Cómo firmas una transacción de bitcoin?

Para crear una firma, necesitas firmar un mensaje usando tu clave privada. En Bitcoin, ese mensaje son los datos de la transacción que contienen la entrada que quieres desbloquear.

El flujo general es: preparar los datos de la transacción (de una forma específica), hacer el HASH256 de ellos para obtener el mensaje, y luego firmar el mensaje con la clave privada (generando la firma), repitiendo para cada entrada que quieras firmar.

Hay tres algoritmos de firma, y el que usas depende del tipo de script de bloqueo de la salida:

Algoritmo legado

Usado para crear firmas que desbloquean scripts no-segwit (P2PK, P2PKH, P2MS, P2SH). Resumiendo: tomas la transacción, vacías todos los ScriptSigs, colocas el ScriptPubKey de la salida que se está gastando en el lugar del ScriptSig de la entrada que estás firmando, añades el tipo de hash al final, haces HASH256 de todo y firmas con ECDSA.

Algoritmo SegWit

Usado para desbloquear P2WPKH y P2WSH (BIP 143). Reorganiza los datos que se hashean — incluyendo el valor de la entrada que se está gastando — lo que corrige problemas del algoritmo legado y permite verificar las tarifas con más seguridad en carteras de hardware. También usa ECDSA.

Algoritmo Taproot

Usado para desbloquear P2TR (BIP 341). Usa el esquema de firma Schnorr (en lugar de ECDSA) y hashea todavía más datos de la transacción para mayor seguridad.

Las salidas no-segwit y segwit usan ECDSA; las salidas Taproot usan Schnorr. Puedes probar los dos algoritmos abajo (firmar un mensaje con una clave privada y verificar la firma):

Firma ECDSA

Firme el hash de un mensaje usando una clave privada.

Normalmente es el hash de datos de una transacción (ya preparados para la firma)

0x
0 bytes
0x
0x
0 bytes
Firma
0d
0d
High: Low:

Nunca introduzca su clave privada en un sitio web, ni use una clave privada generada por un sitio web. Los sitios pueden guardar fácilmente la clave privada y usarla para robar sus bitcoins.

Firma Schnorr

Firme un mensaje usando una clave privada.

0x
0 bytes
0x
0 bytes
0x
0 bytes
0x
0 bytes

Nunca introduzca su clave privada en un sitio web, ni use una clave privada generada por un sitio web. Los sitios pueden guardar fácilmente la clave privada y usarla para robar sus bitcoins.

HASH256

HASH256

SHA-256 doble. Se usa para hashear cabeceras de bloque, datos de transacción y prácticamente cualquier cosa que necesite hash en Bitcoin.

0 bytes
SHA-256
SHA-256

SHA-256(SHA-256(dados))

0 bytes
Little Endian

Little Endian

Convierte un número entre los órdenes de bytes big-endian y little-endian.

0d
0x
0 bytes
0x
0 bytes
Tamaño del campo

Codificación DER

¿Cómo se serializa una firma ECDSA?

Una firma ECDSA está formada por dos números: r y s. Para colocarlos en la transacción, se serializan usando el estándar DER (Distinguished Encoding Rules), que codifica ambos valores con marcadores de tipo y tamaño. Un byte de tipo de hash se añade al final.

Codificación DER

Serializa los dos números de una firma ECDSA (r y s) en formato DER, usado dentro de las transacciones.

Firma
0d
0d
0 bytes

Las firmas Schnorr (Taproot) NO usan DER: son simplemente los 64 bytes de r y s concatenados (más el byte de tipo de hash, si no es el estándar).

Tipo de Hash de la Firma (SIGHASH)

¿Qué firma realmente una firma?

El tipo de hash (sighash) es un byte al final de la firma que indica qué partes de la transacción compromete la firma. Los tipos principales:

La gran mayoría de las firmas usa SIGHASH_ALL, que efectivamente "bloquea" toda la transacción, impidiendo cualquier modificación después de la firma.