Glosario / Transacciones y comisiones
SIGHASH_SINGLE
- ¿Qué es SIGHASH_SINGLE?
- SIGHASH_SINGLE es el indicador que ata una firma a una sola salida, la que ocupa en la lista la misma posición que la entrada que se firma.
La entrada cero se empareja con la salida cero, la entrada uno con la salida uno, y todo lo demás de la transacción queda sin firmar. El diseño permite que varias partes garanticen cada una su propio pago dentro de una misma transacción compartida. También arrastra el error de firma más tristemente célebre de bitcoin, que las entradas heredadas (legacy) todavía contienen.
Cómo funciona
El hash conserva la entrada que se firma, la versión de la transacción, el locktime y exactamente una salida: aquella cuyo índice coincide con el índice de la entrada.
Las salidas posteriores a ese índice se eliminan de la copia antes de calcular el hash. Las anteriores se conservan como marcadores de posición, pero vaciadas, con un valor de menos uno y un script vacío, así que la firma tampoco cubre su contenido real. Los números de secuencia de todas las demás entradas se ponen a cero, como ocurre con el indicador sin salidas.
Luego viene el error. En el algoritmo original, si el índice de la entrada que se firma es mayor o igual que el número de salidas, no hay ninguna salida coincidente de la que calcular el hash. En lugar de fallar, el código devuelve un hash fijo: el valor uno de 32 bytes. Todo firmante que cae en esa posición produce una firma sobre exactamente el mismo hash, así que la firma no está atada a ninguna transacción concreta, y cualquiera capaz de colocar una entrada en el mismo índice puede copiarla y repetirla. La rama sobrevive en Bitcoin Core hasta hoy, porque eliminarla cambiaría la validez de monedas que ya están en la cadena.
Las dos reescrituras del algoritmo de hash de firma lo cerraron. BIP143 especifica que, para una entrada SegWit versión 0 sin salida coincidente, la parte de las salidas del hash consiste en 32 bytes cero, mientras que el resto del hash sigue fijando esa entrada concreta, así que no hay nada que pueda repetirse. BIP341 va más allá: en una entrada Taproot, una firma de este tipo con un índice más allá del número de salidas simplemente no supera la validación.
Dónde aparece
El indicador aparece como un 03 al final de una firma, y usted lo encontrará casi exclusivamente dentro de ofertas prefirmadas y no en pagos corrientes.
El patrón es una media transacción publicada como invitación. Un vendedor firma la declaración "esta entrada mía entra, y la salida del índice coincidente me paga el precio que pido", y luego deja el resto de la transacción en blanco para que lo rellene un comprador. Como la firma del vendedor hace caso omiso de todas las demás entradas y salidas, el comprador puede añadir sus propios fondos, su propio cambio y una comisión al nivel que exija la mempool, y la garantía del vendedor se mantiene. Los mercados de Ordinals y Runes se basan exactamente en esto, distribuido en forma de PSBT, y es una de las pocas operaciones que bitcoin admite sin ningún tercero de por medio y en las que de verdad no hace falta confiar en nadie.
Casi siempre se combina con el modificador ANYONECANPAY, porque por sí solo el indicador sigue cubriendo la lista completa de entradas, lo que frustra el propósito de dejar la transacción abierta para que otro la complete.
SIGHASH_SINGLE frente a SIGHASH_ANYONECANPAY
SIGHASH_SINGLE es un modo base y SIGHASH_ANYONECANPAY es un modificador, así que responden a preguntas distintas. El modo base decide qué parte del lado de las salidas cubre una firma: todo, nada o una salida coincidente. El modificador decide qué parte del lado de las entradas cubre: todas las entradas o solo la que se firma. Se elige un modo base y luego se decide por separado si se añade el modificador, y por eso el byte del indicador de una firma real suele ser la suma de los dos y no uno solo de ellos.