Cuando firmas una transacción, no firmas los bytes en bruto. Firmas un hash de partes seleccionadas, llamado signature hash. Un flag sighash de un byte al final de la firma indica qué partes.
Los flags
- SIGHASH_ALL (por defecto): se compromete con todas las entradas y salidas.
- SIGHASH_NONE: se compromete solo con las entradas; cualquiera puede cambiar las salidas.
- SIGHASH_SINGLE: se compromete con la salida del mismo índice que esta entrada.
- ANYONECANPAY se puede combinar con cada uno, de modo que la firma solo se compromete con su propia entrada.
Actualizaciones
BIP143 (SegWit v0) hizo que los firmantes se comprometan con el importe gastado, lo que corrigió el hashing cuadrático y ayuda a las billeteras de hardware. BIP341 (Taproot) fue más allá y se compromete con todos los importes y scripts gastados, y añadió SIGHASH_DEFAULT, que se comporta como ALL pero ahorra un byte.