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.
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?
Haddar Macdasi