Saltar al contenido
buybitcoinsmart

Glosario / Transacciones y comisiones

Hash de firma

También se conoce como Sighash.

¿Qué es el hash de firma?
El hash de firma es lo que una billetera firma en realidad: una copia reconstruida de la transacción, recortada según el indicador elegido para esa entrada, a la que luego se le aplica SHA-256 dos veces.

Se especifica en el BIP-143.

Ninguna firma cubre la transacción tal como aparece en la red. Cada entrada recibe su propio hash, construido con un procedimiento que se ha reescrito dos veces: el original de 2009, BIP143 para las entradas SegWit y BIP341 para Taproot. Lo que el hash deja fuera es lo que un atacante tiene libertad para cambiar.

Cómo funciona

Elaborar un hash de firma significa construir una copia modificada de la transacción y calcular el hash de esa copia, no el de la transacción que se va a difundir.

El procedimiento original funciona así. Se toma la transacción, se vacía el script de desbloqueo de todas las entradas, se inserta el script que se gasta en la única entrada que se firma y luego se conservan, se dejan en blanco o se descartan las salidas según el indicador. Se añade al final el indicador como un número de cuatro bytes, se aplica SHA-256 dos veces a todo el conjunto y se firman los 32 bytes que resultan.

Ese diseño tenía un costo que nadie notó hasta que las transacciones crecieron. Como cada entrada reconstruye la transacción entera y vuelve a calcular su hash, el trabajo crece con el cuadrado del número de entradas. BIP143 le pone cifras: validar un bloque corriente de 1 MB lleva algo así como 2 segundos, mientras que una sola transacción de 1 MB fabricada a propósito, con 5.569 operaciones de firma, puede llevar 25 segundos. Una transacción que deja estancados a todos los nodos de la red durante tanto tiempo es una denegación de servicio a la espera de ser industrializada.

BIP143 reescribió el procedimiento para las entradas SegWit versión 0 y resolvió dos problemas a la vez. Tres hash intermedios, que fijan los outpoints, los números de secuencia y las salidas, se calculan una sola vez y se reutilizan para cada entrada, lo que hace que el costo sea lineal. Y, lo que es más importante para quien conserva monedas, el hash ahora fija el valor de la entrada que se firma. Antes había que decirle a un dispositivo de firma cuánto valía una entrada, sin ninguna forma de comprobarlo, así que un programa malicioso podía declarar un valor menor para las entradas y engañar a una billetera de hardware para que aprobara una comisión enorme.

BIP341 lo reescribió por tercera vez para Taproot. El hash de Taproot es un hash etiquetado, precedido de una cadena de dominio para que nunca pueda confundirse con un hash de otro protocolo, y fija los montos y los scripts de bloqueo de todas las entradas que se gastan, no solo los de la entrada que se firma. También introduce un valor predeterminado de cero para el indicador, que cubre todo lo que cubre la regla estándar pero nunca se escribe en la firma.

Dónde aparece

Usted se encuentra con el hash de firma de forma indirecta, como la razón por la que su billetera de hardware se comporta como lo hace.

Para firmar una entrada heredada (legacy) hay que entregar al dispositivo la transacción anterior completa, porque es la única forma de que establezca por sí mismo el valor de la entrada. Sparrow y Electrum envían esas transacciones a un Trezor o un Ledger antes de firmar, y en una billetera llena de monedas antiguas ese paso es la razón de que un gasto tarde apreciablemente más de lo que usted espera. Una entrada SegWit solo necesita el monto, que el PSBT ya lleva.

Aparece de forma directa como el último byte de una firma heredada o SegWit en un explorador de bloques. Una firma que termina en 01 se hizo con la regla que lo cubre todo. Conviene entender cualquier otro valor antes de confiar en la transacción.

Hash de firma frente a SIGHASH_ALL

El hash de firma es el valor que se firma; el indicador SIGHASH_ALL es una de las reglas para construirlo. Toda firma tiene un hash de firma, incluidas las firmas Taproot que no llevan ningún byte del indicador. Lo que varía es qué partes de la transacción entraron en el hash, y el indicador no es más que la etiqueta de esa elección. Decir que una transacción "usa SIGHASH_ALL" describe una política; decir que tiene un hash de firma describe algo que ha tenido toda firma de bitcoin de la historia.

No confundir con

Preguntas frecuentes

¿Por qué firmar una transacción antigua tarda tanto en mi billetera de hardware?

Porque el hash de firma heredado no fija el valor de la entrada, así que hay que enviar al dispositivo cada transacción anterior completa para que calcule los montos por sí mismo. Las entradas SegWit se ahorran ese paso, y por eso las monedas modernas se firman en segundos.

¿El hash de firma es lo mismo que el ID de transacción?

No. El ID de transacción es el hash de la transacción tal como se va a difundir. Un hash de firma fija una copia modificada, distinta para cada entrada y cada indicador, y nunca aparece en ninguna parte de la cadena.

Términos relacionados

Más en la sección Transacciones y comisiones

Leer esta página en inglés