¿Por qué se firman las entradas de las transacciones de Bitcoin?

Este es mi entendimiento de cómo se ve una transacción:

inputs: 
  input0: 
    txid: <funding tx0 TXID>
    outputID: <output ID of UTXO in the funding tx0>
    scriptSig: <pkhash_redeemer> <sig0_redeemer>
  input1: 
    txid: <funding tx1 TXID>
    outputID: <output ID of UTXO in the funding tx1>
    scriptSig: <pkhash_redeemer> <sig1_redeemer>
  ...
outputs: 
  output0: 
    scriptPK: <scriptPK for new UTXO>
    amount: <amount for new UTXO> 

Donde <sig_redeemer0>termina la firma:

  • <funding tx0 TXID>
  • <output ID of UTXO in the funding tx0>
  • Pub Key Script de la transacción de financiación
  • <scriptPK for new UTXO>
  • <amount for new UTXO>

He leído mucho que dice cosas como: "la firma está sobre toda la transacción" o "la firma firma todas las entradas y salidas". Sin embargo, hay algunos puntos de confusión que tengo:

  1. ¿Múltiples entradas requieren múltiples firmas? ¿O mi ejemplo está mal?

  2. ¿Por qué necesitamos firmar las entradas de la transacción?

Si las entradas no están firmadas, eso significa que lo siguiente se deja sin firmar:

  • txidde transacción de financiación
  • <output ID of UTXO in the funding tx>
  • secuencia de números (?)

Si todas las salidas están firmadas, los montos y scriptPubKeys de todos los UTXO de las transacciones de financiación son fijos. Un atacante podría cambiar las entradas al tx de canje, pero solo se pueden desbloquear si las entradas siguen siendo las mismas, por lo que un atacante no puede usar una entrada arbitraria.

¡Cualquier ayuda sería apreciada! Gracias

Puede haber múltiples utxos que el mismo script desbloquearía. El ejemplo más común son dos transacciones en las que ambas pagan la misma dirección. Si las entradas no estuvieran firmadas, un atacante podría reemplazar un utxo de entrada por otro utxo diferente que pague la misma dirección, y esto sería malo.
Entonces, si entiendo correctamente, si A crea un tx que le paga a B 1 BTC (UTXO 1) y devuelve 1 BTC de cambio a A (UTXO 2), B podría: (1) Canjear el 1BTC bloqueado por UTXO1, (2) Canjear el 1BTC bloqueado por UTXO1 nuevamente, ya que no hay un mapeo explícito entre entradas y salidas en el tx. Si A intenta canjear UTXO2, no podrá hacerlo, ya que todas las entradas ya están canjeadas.
Ese ejemplo en particular no funcionará; dado que la transacción en cuestión tiene salidas por un total de 2 BTC, si B la edita para usar UTXO 2 como entrada (cuyo valor es 1 BTC), no será válida. Agregaré una respuesta explicando lo que tengo en mente.

Respuestas (1)

Puede haber múltiples utxos que el mismo script desbloquearía. El ejemplo más común son dos transacciones en las que ambas pagan la misma dirección. Si las entradas no estuvieran firmadas, un atacante podría reemplazar un utxo de entrada por otro utxo diferente que pague la misma dirección, y esto sería malo.

Considere el siguiente escenario. Alice ha recibido dos pagos en su dirección 1Alice, ambos por importe de 1 BTC: uno con txid 234abc por importe de 1 BTC, y otro con txid 567def. Desea pagar 0,5 BTC a Bob, por lo que crea y firma una transacción utilizando el utxo 234abc como entrada, con las siguientes salidas: 0,5 BTC a la dirección 1Bob y 0,4999 BTC a alguna dirección de "cambio", 1AliceChange. (Esto deja una tarifa de transacción de 0.0001 BTC).

Después de que esta transacción se transmita y confirme, Bob modifica la transacción para que la entrada sea 567def en su lugar. El scriptSig funciona igual de bien para cada transacción que paga 1Alice (todos tienen el mismo scriptPubKey), por lo que esta nueva transacción también es válida. Bob lo transmite y efectivamente roba 0.5 BTC adicionales de Alice, que ella nunca tuvo la intención de darle.

Esto solo funciona siempre que 567def tenga el mismo valor, o mayor, que 234abc, pero eso no es una gran restricción. (Si 567def tiene un valor mayor, digamos 10 BTC, entonces la nueva transacción de Bob solo devuelve BTC 0.4999 a 1AliceChange, por lo que efectivamente tiene una tarifa de transacción de BTC 9.0001. Cualquier minero estaría muy feliz de confirmar esta transacción; de hecho, tal vez un el minero realizará este ataque incluso si a Bob no le importa).

¡Gracias! Eso aclara mucho las cosas. No estoy seguro de si es mejor dejar esto para otra pregunta, pero: ¿por qué entonces, las salidas están firmadas? Creo que entiendo cómo un minero podría explotar esto, pero no necesariamente Bob. Si las salidas no están firmadas, un actor malintencionado puede cambiar el scriptPK y la cantidad de cada salida. Un minero podría: (1) cada vez que recibe un tx, agregar/eliminar arbitrariamente scriptPK (para censurar a los canjeadores y cobrar tarifas más altas) y (2) cambiar las salidas para que sean direcciones que controlen. ¿Cómo podría Bob explotar esto?
En realidad, creo que entiendo cómo Bob podría aprovechar esto. Para cualquier transacción publicada tx0, Bob podría canjearla con un nuevo tx1 cambiando el scriptPK que bloquea las salidas de tx0 de modo que el scriptSig <pkB><sigB> pueda darle a Bob el UTXO. ¿Es correcto este entendimiento?
@acnalb: Sí, así es. Si las salidas no están firmadas, cualquier atacante (Charlie) puede modificar cualquier transacción para pagar la dirección de Charlie en lugar de la dirección que se pretendía originalmente. Esto haría que todo el sistema fuera completamente inutilizable.
Entonces, ¿qué firma exactamente el scriptSig? ¿Un single completo 'prev_out'?