Ich versuche, den OP_CHECKSIG-Opcode von Bitcoin zu implementieren und zu überprüfen, ob eine Signatur gültig ist oder nicht. Ich habe die Signatur, die ich aus den Transaktionsdaten und dem öffentlichen Schlüssel erhalte (das Hex-Feld einer P2PKH-Transaktion sollte beides enthalten). Ich versuche herauszufinden, was der Message Digest selbst ist, der signiert ist. Soweit ich weiß, sind dies die erforderlichen Elemente -
1. Die Versionsnummer (4 Bytes)
2. Die Anzahl der Eingaben (1 Byte)
3. Transaktions-Hash der einzulösenden Eingabe
4. Index der einzulösenden Ausgabe (4 Bytes)
5. ScriptPubKey der einzulösenden Ausgabe vorangestellt die Länge des Skripts
6.Sequenznummer (4 Byte)
7.Anzahl der Ausgaben, die wir signieren (1 Byte)
8.Gesamtwert der Ausgabe (8 Byte)
9.SkriptSig für die Ausgabe mit vorangestellter Länge
10.Sperrzeit Feld (4 Bytes)
11.Hashcode-Typ (4 Bytes)
Wenn ich also diese Daten im Byte-Format zweimal mit dem SHA256-Algorithmus hash, würde meine Signaturprüfung bestehen? Ich versuche dies mit Java zu implementieren und das ist mein Code -
public static boolean verifyUsingSecp256k1(byte[] pub, byte[] dataForSigning,
BigInteger[] rs) throws Exception {
ECDSASigner signer = new ECDSASigner();
X9ECParameters params = SECNamedCurves.getByName("secp256k1");
ECDomainParameters ecParams = new ECDomainParameters(params.getCurve(),
params.getG(), params.getN(), params.getH());
ECPublicKeyParameters pubKeyParams = new ECPublicKeyParameters(ecParams
.getCurve().decodePoint(pub), ecParams);
signer.init(false, pubKeyParams);
return signer.verifySignature(dataForSigning, rs[0].abs(), rs[1].abs());}
Wenn ich jedoch versuche, meine Signatur zu überprüfen, wird sie als falsch zurückgegeben. Übersehe ich hier etwas?
Alle oben genannten Schritte sind jedoch korrekt. Der einzige Haken hier ist, dass außer den Skripten alles andere im Little-Endian-Format erfasst wird (aus welchen Gründen auch immer). Bis auf Step 5 und Step 9 werden also alle anderen Daten im Little-Endian-Format gespeichert. Ich habe eine Weile gebraucht, um zu dieser Antwort zu kommen! Nur ein kleiner Tipp, den Sie bei der Umsetzung beachten sollten!
Coding-Enthusiast
shubham saxena
Coding-Enthusiast
CompactInt
Könnten Sie das Byte-Array (Schritt 13) posten, bevor Sie in Schritt 14 hashen. Normalerweise ist es leicht, Endianness, Größe von zu übersehen,SignatureScript
nachdem Sie es durch ersetzt habenPubkeyScript
, ... Zur Überprüfung müssen Sie den verwendeten Code überprüfen. nicht sicher, welche Bibliothek das ist.shubham saxena
Coding-Enthusiast
c3b0386c0d990ab628ac505e8fb612f67d052c5f3cd0ac517854c2efc24ab3e7
shubham saxena