Warum werden die Eingaben von Bitcoin-Transaktionen signiert?

Dies ist mein Verständnis davon, wie eine Transaktion aussieht:

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> 

Wo die Signatur <sig_redeemer0>vorbei ist:

  • <funding tx0 TXID>
  • <output ID of UTXO in the funding tx0>
  • Pub Key Script der Finanzierungstransaktion
  • <scriptPK for new UTXO>
  • <amount for new UTXO>

Ich habe viel gelesen, was in etwa so lautet: "Die Signatur gilt für die gesamte Transaktion" oder "Die Signatur signiert alle Ein- und Ausgänge". Es gibt jedoch ein paar Punkte, die mich verwirren:

  1. Erfordern mehrere Eingaben mehrere Unterschriften? Oder ist mein Beispiel falsch?

  2. Warum müssen wir die Eingaben der Transaktion signieren?

Wenn die Eingaben nicht signiert sind, bedeutet dies, dass Folgendes nicht signiert bleibt:

  • txidder Finanzierungstransaktion
  • <output ID of UTXO in the funding tx>
  • Sequenznummer (?)

Sind alle Ausgaben signiert, stehen die Beträge und scriptPubKeys aller UTXOs aus Funding-Transaktionen fest. Ein Angreifer kann möglicherweise die Eingaben in den einlösenden TX ändern, sie können jedoch nur entsperrt werden, wenn die Eingaben gleich bleiben, sodass ein Angreifer keine willkürliche Eingabe verwenden kann.

Jede Hilfe wäre willkommen! Danke

Es kann mehrere Utxos geben, die dasselbe Skript entsperren würde. Das häufigste Beispiel sind zwei Transaktionen, die beide dieselbe Adresse bezahlen. Wenn Eingaben nicht signiert wären, könnte ein Angreifer einen Eingabe-Utxo durch einen anderen Utxo ersetzen, der dieselbe Adresse zahlt, und das wäre schlecht.
Also, wenn ich das richtig verstehe, wenn A einen tx erstellt, der B 1 BTC (UTXO 1) zahlt und 1 BTC Wechselgeld an A (UTXO 2) zurückgibt, könnte B: (1) die von UTXO1 gesperrten 1 BTC einlösen, (2) die einlösen 1BTC wird wieder von UTXO1 gesperrt, da es keine explizite Zuordnung zwischen Ein- und Ausgängen im TX gibt. Wenn A versucht, UTXO2 einzulösen, ist dies nicht möglich, da alle Eingaben bereits eingelöst sind.
Dieses spezielle Beispiel wird nicht funktionieren; Da die fragliche Transaktion Ausgaben in Höhe von insgesamt 2 BTC hat, ist sie nicht gültig, wenn B sie bearbeitet, um UTXO 2 als Eingabe zu verwenden (dessen Wert 1 BTC ist). Ich werde eine Antwort hinzufügen, die erklärt, was ich im Sinn habe.

Antworten (1)

Es kann mehrere Utxos geben, die dasselbe Skript entsperren würde. Das häufigste Beispiel sind zwei Transaktionen, die beide dieselbe Adresse bezahlen. Wenn Eingaben nicht signiert wären, könnte ein Angreifer einen Eingabe-Utxo durch einen anderen Utxo ersetzen, der dieselbe Adresse zahlt, und das wäre schlecht.

Betrachten Sie das folgende Szenario. Alice hat zwei Zahlungen an ihre Adresse 1Alice erhalten, beide in Höhe von 1 BTC: eine mit txid 234abc in Höhe von 1 BTC, und eine weitere mit txid 567def. Sie möchte 0,5 BTC an Bob zahlen, also erstellt und signiert sie eine Transaktion mit dem 234abc utxo als Eingabe und den folgenden Ausgaben: 0,5 BTC an die Adresse 1Bob und 0,4999 BTC an eine "Wechsel"-Adresse, 1AliceChange. (Dadurch bleibt eine Transaktionsgebühr von 0,0001 BTC.)

Nachdem diese Transaktion gesendet und bestätigt wurde, ändert Bob die Transaktion, sodass die Eingabe stattdessen 567def ist. Die scriptSig funktioniert gleich gut für jede Transaktion, die 1Alice bezahlt (sie haben alle den gleichen scriptPubKey), also ist diese neue Transaktion auch gültig. Bob sendet es und stiehlt effektiv zusätzliche 0,5 BTC von Alice, die sie ihm nie geben wollte.

Dies funktioniert nur, solange 567def denselben oder einen höheren Wert als 234abc hat, aber das ist keine große Einschränkung. (Wenn 567def einen höheren Wert hat, sagen wir 10 BTC, dann gibt Bobs neue Transaktion immer noch nur 0,4999 BTC an 1AliceChange zurück, also hat es effektiv eine Transaktionsgebühr von 9,0001 BTC. Jeder Miner würde diese Transaktion sehr gerne bestätigen; tatsächlich, vielleicht a Miner wird diesen Angriff ausführen, auch wenn Bob das nicht möchte.)

Danke! Das klärt einiges. Ich bin mir nicht sicher, ob dies besser einer anderen Frage überlassen wird, aber: Warum sind die Ausgänge dann signiert? Ich glaube, ich verstehe, wie ein Miner dies ausnutzen könnte, aber nicht unbedingt Bob. Wenn Ausgaben nicht signiert sind, können der Skript-PK und die Menge jeder Ausgabe von einem böswilligen Akteur geändert werden. Ein Miner könnte: (1) wann immer er eine tx erhält, willkürlich SkriptPKs hinzufügen/entfernen (also Einlöser zensieren und höhere Gebühren erheben) und (2) Ausgänge ändern, um Adressen zu sein, die er kontrolliert. Wie konnte Bob das ausnutzen?
Eigentlich glaube ich zu verstehen, wie Bob das ausnutzen konnte. Bob könnte jede gepostete Transaktion tx0 mit einem neuen tx1 einlösen, indem er das scriptPK ändert, das die Ausgaben von tx0 sperrt, sodass die scriptSig <pkB><sigB> Bob das UTXO geben kann. Ist dieses Verständnis richtig?
@acnalb: Ja, das stimmt. Wenn die Ausgaben nicht signiert sind, kann jeder Angreifer (Charlie) jede Transaktion ändern, um Charlies Adresse anstelle der ursprünglich beabsichtigten Adresse zu bezahlen. Dies würde das gesamte System völlig unbrauchbar machen.
Also, was genau die scriptSig-Zeichen? Eine komplette Single 'prev_out'?