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>
<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:
¿Múltiples entradas requieren múltiples firmas? ¿O mi ejemplo está mal?
¿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:
txid
de transacción de financiación<output ID of UTXO in the funding tx>
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.
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).
Nate Eldredge
acnalb
Nate Eldredge