So erstellen Sie die Teil in "scriptSig"?

  • Ich habe decoderawtransaction und sehe im vin-Teil ein "scriptSig", von dem ich glaube, dass es das "Unlocking-Skript" ist. Angenommen, ich habe den privaten Schlüssel in einer Brieftasche aus Papier und jemand sendet mir eine Transaktion an meine Bitcoin-Adresse. Wie generiere ich den, um ihn zu entsperren?
  • Meine zweite Frage ist: Nachdem ich es generiert habe, kann jemand diesen
    Teil kopieren und ihn in Zukunft verwenden, um eine zukünftige Transaktion freizuschalten, die an dieselbe Bitcoin-Adresse getätigt wurde?
Für die 1. Frage suche ich nach einer mathematischen Antwort, dh: PK-Hash 160 extra nehmen. schick mich nicht in irgendeine Bibliothek.

Antworten (2)

Die erste Frage hat eine lange Antwort, da sie vom scriptPubKey, aber auch vom sigHash-Flag abhängt, ich nehme an, Sie sprechen von klassischen P2PKH-Transaktionen. (ScriptPubKey legt die Bedingung für das „Entsperren“ offen, während ScriptSig sie für das „Entsperren“ erfüllt. Es kann eine Signatur verwenden ... oder nicht, geht aber davon aus, dass Sie P2PKH scriptPubKey verwenden, also tut es das)

Also das scriptPubKey ist

OP_DUP OP_HASH160 <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG

Wobei PubkeyHash von Ihrer Bitcoin-Adresse angegeben wird.

Das scriptSig sollte sein

<Sig> <PubKey>

Der PubKey ist einfach. Von Ihrem privaten Schlüssel können Sie den öffentlichen Schlüssel erhalten (Kurve secp256k1)

Q = dG

wobei d privater Schlüssel: int, Q öffentlicher Schlüssel: EC-Punkt, G: EC-Punkt, gegeben durch Kurve.

<sig>

besteht aus 2 Komponenten

<ecdsaSig> <sigHash>

ECDA Sig ist die Signatur eines Hashs der Transaktion in DER-Codierung. sigHash ist ein Byte, das angibt, wie dieser Hash generiert wird (dh was tatsächlich signiert ist).

sigHash selbst enthält 2 Informationen.

<AnyoneCanPay><All|None|Single>

Was also signiert wird, ist ein berechneter Hash Ihrer Transaktion, abhängig vom sigHash. Die menschenfreundliche Erklärung ist hier , und der am besten lesbare Code dafür ist hier .

Sobald Sie den Hash berechnet haben, müssen Sie ihn gemäß dieser Mathematik auf elliptischen Kurven signieren. Da der Algorithmus einen zufälligen K-Wert benötigt, setzt er einen fairen RNG voraus. RFC6979 beschreibt also einen Weg, einen K-Wert zu finden, der nicht zufällig, sondern sicher zu verwenden ist. (Umsetzung hier )

Hier ist also, was je nach gewähltem sigHash signiert wird:

AnyCanPay : Sie erlauben jemandem, jede Eingabe in der Transaktion zu ändern. (keine Eingaben signieren, außer deiner)

Alle : Sie verweigern die Änderung von Ausgaben in der Transaktion. (Vorzeichenausgänge)

Single : Sie verweigern die Änderung der Ausgabe mit demselben Index wie Ihre Eingabe (signieren Sie eine Ausgabe).

Keine : Sie erlauben die Änderung aller Ausgaben in der Transaktion. (Zeichen keine Ausgabe)

Zweite Frage: Nein, unabhängig davon, welchen sigHash Sie verwenden, enthält ein Teil Ihrer Signatur die vorherige Ausgabereferenz, die Sie ausgeben. Da Sie nicht doppelt ausgeben können, können Sie die Signatur nicht wiederverwenden. Wenn Sie das jedoch wirklich wollen, dann verwenden Sie denselben K-Wert zum Signieren von 2 verschiedenen Hashes, dann haben Sie im Grunde Ihren privaten Schlüssel geleakt. So wäre jeder in der Lage, eine zukünftige Transaktion an Ihre Bitcoin-Adresse zu „entsperren“, indem er die beiden Signaturen kennt.

Wenn ich sigHash=None unterschreibe, kann dann jeder die Transaktion ändern, um die Bitcoin zu erhalten?
Ja, wenn sigHash = None (mit AnyCanPay), dann kann im Grunde jeder die von Ihnen signierte Eingabe nehmen und in eine beliebige Transaktion einfügen. Wenn sigHash=None ohne AnyCanPay, dann kann jemand nur die anderen Eingaben ändern.
  1. Wie löse ich einen Basis-Tx ein?

  2. Die Frage ist mir nicht klar. Möchten Sie Ihre Transaktion nach der Unterzeichnung senden? Oder möchten Sie die Signatur für eine spätere Verwendung aufbewahren?