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.