Warum ist dieses Skript ungültig und wie kann ich gültige Paare aus öffentlichem Schlüssel und digitaler Signatur generieren?

Warum gibt die standardmäßige P2PKH-Transaktion unter http://bitcoin-script-debugger.visvirial.com/ NULL statt wahr zurück? Ich habe noch nicht versucht, die blutigen Details von OP_CHECKSIG zu schlucken, aber alles andere sieht solide aus.

Gibt es eine Möglichkeit, manuell zu überprüfen, ob das Beispielpaar aus digitaler Signatur und öffentlichem Schlüssel übereinstimmt, oder übereinstimmende Paare zu generieren, die meine tatsächlichen Bitcoin-Adressen nicht enthalten oder mit ihnen verknüpft sind, um mit dem Skript-Debugger zu experimentieren?

Antworten (2)

Ich habe einige Stunden mit dem Tool gespielt, konnte aber keine einzige Signatur zum Laufen bringen. Hier ist, was ich für die berühmte PIZZA-Transaktion eingegeben habe :

# <sig>
OP_PUSHDATA1 71 0x30450221009908144CA6539E09512B9295C8A27050D478FBB96F8ADDBC3D075544DC41328702201AA528BE2B907D316D2DA068DD9EB1E23243D97E444D59290D2FDDF25269EE0E
# <pubKey>
OP_PUSHDATA1 65 0x042E930F39BA62C6534EE98ED20CA98959D34AA9E057CDA01CFD422C6BAB3667B76426529382C23F42B9B08D7832D4FEE1D6B437A8526E59667CE9C4E9DCEBCABB

OP_DUP OP_HASH160
# <pubkeyHash>
20 0x46af3fb481837fadbb421727f9959c2d32a36829
OP_EQUALVERIFY OP_CHECKSIG

Der Inhalt des Skripts würde OP_DUP und OP_HASH160 korrekt ausführen, sodass die Ergebnisse auf dem Stapel mit OP_EQUALVERIFY übereinstimmen. Dann gibt OP_CHECKSIG false zurück ... Die Überprüfung mit openssl gibt true zurück.

Gibt es eine Möglichkeit, manuell zu überprüfen, ob das Beispielpaar aus digitaler Signatur und öffentlichem Schlüssel übereinstimmt, oder übereinstimmende Paare zu generieren, die meine tatsächlichen Bitcoin-Adressen nicht enthalten oder mit ihnen verknüpft sind, um mit dem Skript-Debugger zu experimentieren?

Ja, normalerweise habe ich OPENSSL, um mir zu helfen. Aber jede ECDSA-Bibliothek sollte es tun. Ein normaler P2PKH-Tx wird in ein unsigniertes Format konvertiert, und das Eingabeskript wird durch das Ausgabeskript des vorherigen Tx ersetzt (und Längen angepasst). Dieser Roh-Tx wird dann doppelt sha256'd und das Ergebnis signiert. Dieser Hashwert kann einfach mit openssl, der Signatur und dem Pubkey überprüft werden. Ich habe das vor ungefähr 2 Jahren gepostet und Hilfe von Dave bekommen.

Wie man zur unsignierten Transaktion kommt, erklärt die Antwort von @amaclin im ersten Link (--> Wie funktioniert die ECDSA-Verifizierung...). Openssl erfordert zur Überprüfung einen PEM-Schlüssel, daher findet eine gewisse Konvertierung vom Pubkey- in das PEM-Format statt. Und dann arbeitet Bitcoin mit Rohdaten (Hex) und nicht mit Strings. Daher die Bemühungen, mit xxd auf Linux-Systemen oder mit sed und [:xdigit:] auf BSD-Systemen zu konvertieren. Wenn Sie auf unixoiden Systemen arbeiten, kann ich Ihnen ein Skript zur Verfügung stellen.

Wie kann ich gültige Paare aus öffentlichem Schlüssel und digitaler Signatur generieren?

Vielleicht ist "generieren" hier nicht das richtige Wort, aber man kann jedes TX aus der Blockchain nehmen und die Elemente extrahieren (raw tx, sig, pubkey, prev tx pubkey hash) und es durch den oben beschriebenen Prozess schieben.

AFAICT, das Skript ist nicht ungültig. Vielmehr kann die Website das Skript nicht richtig validieren.

OP_CHECKSIG prüft die digitale Signatur (interpretiert als das erste Stack-Element) gegen den öffentlichen Schlüssel (das zweite Stack-Element). Eine digitale Signatur erfordert jedoch eine dritte Komponente: die Nachricht, die signiert wird. Bei Bitcoin ist diese Nachricht die Transaktion selbst (mit einigen Modifikationen).

Das Problem dabei ist, dass der Skriptinterpreter auf der Website keine Stelle hat, an der Sie die zu signierende Transaktion oder Nachricht eingeben können. Daher wird OP_CHECKSIG ohne eine Nachricht für jedes gültige Bitcoin-Skript mit OP_CHECKSIG immer als falsch bestätigt.