Saltar al contenido
buybitcoinsmart

Glosario / Transacciones y comisiones

SIGHASH_ALL

¿Qué es SIGHASH_ALL?
SIGHASH_ALL es el indicador que hace que una firma cubra cada entrada y cada salida de una transacción, de modo que nada del pago puede cambiarse después de firmar.

Este es el indicador que usa su billetera, y es la razón por la que aprobar una transacción en la pantalla de una billetera de hardware significa algo. Su valor es 1, y puede verlo como el último byte de casi todas las firmas en un explorador de bloques. Taproot cambió el nombre del valor predeterminado a SIGHASH_DEFAULT y dejó de escribir el byte por completo, con lo que se ahorra un byte por firma.

Cómo funciona

Con SIGHASH_ALL, el hash que se firma abarca la versión de la transacción, cada outpoint que se gasta, cada número de secuencia, el monto de cada salida, el script de bloqueo de cada salida y el locktime.

Si se cambia un solo satoshi de una sola salida, todas las firmas de la transacción dejan de ser válidas. Añadir una entrada, eliminar una salida, reordenarlas, mover ligeramente el locktime: el mismo resultado. Eso es lo que quiere decir la gente cuando afirma que una transacción de bitcoin firmada es definitiva en su contenido antes incluso de difundirse. La única decisión que le queda a cualquiera es si enviarla.

Hay una cosa que se excluye deliberadamente: los scripts de desbloqueo de las demás entradas. Si el hash los abarcara, en una transacción con dos firmantes cada firma tendría que hacerse después de la otra, lo cual es circular e imposible. Dejarlos fuera es lo que permite que partes independientes firmen la misma transacción en el orden que prefieran.

La codificación varía según el tipo de entrada. En una entrada heredada (legacy) o SegWit de versión 0, el byte 01 se añade a la firma con codificación DER, y de ahí sale el conocido total de 71 o 72 bytes. En un gasto por ruta de clave de Taproot, BIP341 define un valor de cero como SIGHASH_DEFAULT, que significa una cobertura idéntica sin escribir ningún byte, así que la firma tiene exactamente 64 bytes. Escribir 01 de forma explícita en una entrada Taproot sigue siendo válido y produce el mismo hash; simplemente cuesta un byte adicional a cambio de nada.

Dónde aparece

SIGHASH_ALL se usa casi en todas partes: Bitcoin Core, Electrum, Sparrow, todas las billeteras de hardware y todos los motores de retiro de los exchanges firman así por defecto, y ninguno de ellos ofrece una opción para cambiarlo.

La consecuencia práctica es la que usted nota cuando un pago está atascado. Como la comisión es lo que sobra entre las entradas y las salidas, y todas las salidas están firmadas, no se pueden quitar unos miles de satoshis de una salida para aumentar la comisión. La transacción tiene que reconstruirse y volver a firmarse desde el principio, y eso solo puede hacerlo la billetera que tiene las claves. Por eso el replace-by-fee es una funcionalidad de la billetera que envía y no algo que un exchange o un explorador de bloques puedan hacer en su nombre, y por eso existe el child pays for parent (el hijo paga por el padre) como vía de escape cuando no se puede contactar con el remitente.

También es lo que convierte la pantalla de una billetera de hardware en un contrato y no en una sugerencia. El dispositivo muestra el destino, el monto y la comisión, y como la firma que produce a continuación cubre los tres, ningún software que intervenga después puede alterar ninguno de ellos sin desechar esa firma. Apruebe lo que dice la pantalla y no podrá ocurrir nada más.

SIGHASH_ALL frente a SIGHASH_NONE

Con SIGHASH_ALL, la firma cubre la lista completa de salidas; con SIGHASH_NONE, no cubre nada de ella. La brecha entre ambos es la que separa un pago de una simple autorización para mover una moneda a un destino sin especificar. Los dos indicadores están a un solo valor de distancia, así que una biblioteca de firma que acepta el indicador como un parámetro entero está a un error tipográfico de convertir el retiro de un cliente en una moneda que puede redirigir cualquiera que vigile la mempool. El código de firma de producción debería llevar el valor escrito en el código fuente en lugar de recibirlo como valor de entrada.

No confundir con

Preguntas frecuentes

¿Necesito elegir alguna vez un indicador de sighash?

No. Las billeteras para el público general firman con SIGHASH_ALL y no exponen esa elección, y eso es lo correcto como valor predeterminado. Los demás indicadores existen para quienes construyen protocolos y ensamblan transacciones de forma colaborativa, no para los pagos corrientes.

Si todo está firmado, ¿cómo se puede aumentar una comisión?

No se puede editar. El replace-by-fee construye una transacción completamente nueva que gasta las mismas monedas con una comisión más alta y la vuelve a firmar, y por eso solo la billetera que tiene las claves privadas puede aumentar una comisión.

Para seguir leyendo

Términos relacionados

Más en la sección Transacciones y comisiones

Leer esta página en inglés