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):
HASH256
Little Endian
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.
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:
SIGHASH_ALL(0x01) — firma todas las entradas y todas las salidas. El más común (la transacción no puede ser alterada).SIGHASH_NONE(0x02) — firma todas las entradas, pero ninguna salida (las salidas pueden ser alteradas).SIGHASH_SINGLE(0x03) — firma todas las entradas y solo la salida del mismo índice.SIGHASH_ANYONECANPAY(0x80) — modificador: firma solo tu propia entrada (otras personas pueden añadir entradas).
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.