Signieren einer Transaktion mit openSSL

Ich habe ein bisschen über das Signieren einer Transaktion mit openSSL gelesen, ich habe versucht, es zu implementieren, aber es scheint, als würden die generierten Signaturen nicht akzeptiert. Ich frage mich also, ob die folgenden Befehle eine gültige Signatur liefern.

Lassen Sie uns einen privaten Schlüssel erstellen: dd1cd59c4de2fa92e363dac282afe790a5193177d413b38e206b2b86b879ffbfUnd eine öffentliche Testnet-Adresse generieren: mhZQtrhzjqkDmm8yp8jR2D84AagCdL4YzMUnd einige Testnet-BTC an sie senden:a05f60a9679a1ad0ef57b092006b6c01886291a2ff696f5e2ac107b349594cf6

Wir werden eine Transaktion erstellen, die die BTC an sendet 2N8hwP1WmJrFF5QWABn38y63uYLhnJYJYTF.

Okay, die unsignierte Rohtransaktion lautet also: 01000000 01 f64c5949b307c12a5e6f69ffa2916288016c6b0092b057efd01a9a67a9605fa0 00000000 19 166749c16df955750990623397be66e965863611 ffffffff 01 70508e0600000000 1976a914a9974100aeee974a20cda9a2f545704a0ab54fdc88ac 00000000 01000000

Wir hashen die Rohtransaktion doppelt: 372f7f092abc73c2bcd357ec2b0dab4a9fdbb956771c676cf92a899feedcda0a. Und erstellen Sie einen PEM-Schlüssel für openSSL (30740201010420 . private_key . a00706052b8104000aa144034200 . public_key und base64 it): -----BEGIN EC PRIVATE KEY----- MHQCAQEEIN0c1ZxN4vqS42PawoKv55ClGTF31BOzjiBrK4a4ef+/oAcGBSuBBAAK oUQDQgAEnQ9w7thTRcpcHARWO+0ZYIViw31kQGF4WoNujxmRVfKBih4mYfntUB2P kGYRiSCZqd5afqn2Qey03XW7tjwtWg== -----END EC PRIVATE KEY-----

Und dann verwende ich den folgenden Befehl, um die DER-Sig zu erstellen: echo "372f7f092abc73c2bcd357ec2b0dab4a9fdbb956771c676cf92a899feedcda0a" | openssl dgst -sha256 -hex -sign key.pem.

Wenn wir das Längenbyte und den öffentlichen Schlüssel hinzufügen, erhalten wir die folgende scriptSig: 46 304402203c8aaa41ae647149f70ce24f73109e99d59d7e54a5d854239943358d581e9f8302206336cb57c00bb78f46c881b3d6bb2ed76dc652eedf36064ae022ea4ae3ba3b100141049d0f70eed85345ca5c1c 04 563bed19608562c37d644061785a836e8f199155f2818a1e2661f9ed501d8f906611892099a9de5a7ea9f641ecb4dd75bbb63c2d5a.

Großartig. Damit bleibt uns die folgende Rohtransaktion: 01000000 01 f64c5949b307c12a5e6f69ffa2916288016c6b0092b057efd01a9a67a9605fa0 00000000 8a 47304402203c8aaa41ae647149f70ce24f73109e99d59d7e54a5d854239943358d581e9f8302206336cb57c00bb78f46c881b3d6bb2ed76dc652eedf36064ae022ea4ae3ba3b100141049d0f70eed85345ca5c1c04563bed19608562c37d644061785a836e8f199155f2818a1e2661f9ed501d8f906611892099a9de5a7ea9f641ecb4dd75bbb63c2d5a ffffffff 01 70508e0600000000 1976a914a9974100aeee974a20cda9a2f545704a0ab54fdc88ac 00000000

Das ist leider keine gültige Transaktion (Fehler erhalten: PUSH TRANSACTION ERROR: 16: MANDATORY-SCRIPT-VERIFY-FLAG-FAILED (OPCODE MISSING OR NOT UNDERSTOOD)).

Mit einem Transaktionstool erhalte ich die folgende (gültige) Rohtransaktion, die ich einlösen konnte: 01000000 01 f64c5949b307c12a5e6f69ffa2916288016c6b0092b057efd01a9a67a9605fa0 00000000 8a 47304402204cdb6499578276106748c4877bf2a3381ba484fb621ce8d3faa2161254bdeec902205e3536aeaa65f8f0f55b3eb31a9bf8959b70e247c0ebd9da485e586370a25b900141 049d0f70eed85345ca5c1c04563bed19608562c37d644061785a836e8f199155f2818a1e2661f9ed501d8f906611892099a9de5a7ea9f641ecb4dd75bbb63c2d5a ffffffff 01 70508e0600000000 1976a914a9974100aeee974a20cda9a2f545704a0ab54fdc88ac 00000000

Bis auf die Signatur sind alle Felder korrekt. Wie kommt es, dass der von mir verwendete openSSL-Signaturbefehl falsch war?

Ist die generierte Signatur gültig? Ist der openSSL-Befehl gültig? Können wir openSSL überhaupt zum Signieren einer Transaktion verwenden?

Antworten (1)

Obwohl ich die Signatur nicht überprüft habe, denke ich, dass ich bei der Überprüfung der Codierung sehen kann, was falsch ist. Lassen Sie uns das scriptSig kurz aufschlüsseln und ich zeige es Ihnen:

8a (total number of bytes to follow)
46 (the signature is 0x46 bytes long *THIS IS WHERE THE ISSUE IS*)
30 (compound DER type)
44 (0x44 bytes following)
02 (integer type)
20 (0x20 bytes long)
3c8aaa41ae647149f70ce24f73109e99d59d7e54a5d854239943358d581e9f83 (R value)
02 (integer type)
20 (0x20 bytes long)
6336cb57c00bb78f46c881b3d6bb2ed76dc652eedf36064ae022ea4ae3ba3b10 (S value)
01 (SIGHASH_ALL sighash type)
41 (length of public key is 0x41 bytes)
049d0f70eed85345ca5c1c04563bed19608562c37d644061785a836e8f199155f2818a1e2661f9ed501d8f906611892099a9de5a7ea9f641ecb4dd75bbb63c2d5a (public key)

Jetzt habe ich die Länge der DER-codierten Signatur als Problem hervorgehoben - 46. Dies sollte sein 47. Der Grund dafür ist, dass diese Länge eigentlich die Länge der Signatur plus ein Byte für den Sighash-Typ sein soll . Im Gegensatz zur normalen DER-Signatur, die von OpenSSL erstellt wird, erfordert Bitcoin, dass der Sighash-Typ angehängt wird, in diesem Fall 01für SIGHASH_ALL. Sie können das 01vorhandene Byte sehen. Aber Sie haben die Länge nicht aktualisiert. In der gültigen Transaktion darunter hingegen sieht man die Länge 47trotz gleicher Feldlänge.

Versuchen Sie also, die 46 auf eine 47 zu aktualisieren, und sehen Sie, ob es funktioniert :)

Sie haben Recht, ich habe die Signaturlänge falsch berechnet (ohne die 01). Ich habe es geändert und versuche, es zu senden, aber die Signatur wird immer noch nicht akzeptiert.
Welchen Fehler hast du jetzt? Ohne weitere Infos kann ich nicht helfen :)
Hallo, ich erhalte einen Fehler bezüglich der Eingaben (was auf ein Problem mit der Signatur hindeutet, denn wenn ich versuche, dieselbe Rohtransaktion erneut zu übermitteln, erhalte ich eine Fehlermeldung, dass die Transaktion bereits gesendet wurde).
Es könnte sein, dass es als doppelte Ausgabe angesehen wird, weil Sie danach bereits eine gültige Transaktion erstellt haben? Stellen Sie sicher, dass die andere Transaktion nicht übertragen wurde, und entfernen Sie sie aus Ihrem Mempool, falls vorhanden
Wenn die Signatur gültig ist, erhalte ich eine Fehlermeldung, dass die Transaktion bereits gesendet wurde (gut), aber wenn sie ungültig ist, erhalte ich eine andere Fehlermeldung. Daher weiß ich, dass wenn meine Signatur noch ungültig ist. Gibt es eine Möglichkeit, meine Unterschrift zu überprüfen (mit einem Online-Tool oder so)?
Ich bin mir nicht sicher, ich habe noch nie einen gesehen, an den ich mich erinnern kann. Welche Fehlermeldung erhalten Sie konkret?