So signieren Sie eine Rohtransaktion mit einem privaten Schlüssel und einem SHA-Hash (in Java)

Ich habe die Anweisungen hier befolgt, um meine eigene Bitcoin-Transaktion zu erstellen.

Schritt-für-Schritt-Beispiel zum Einlösen einer Rohtransaktion erforderlich

Derzeit kann mein Code eine Transaktion erstellen und den SHA-Hash berechnen, aber ich habe Probleme, ihn mit ECDSA zu signieren.

Ich habe so Code geschrieben, um es mit Bitcoinj zu tun, aber es funktioniert nicht. Ich brauche Hilfe beim Signieren einer Transaktion mit einer Java-Bibliothek oder einer API.

Hier ist, was ich bisher habe. Jede Hilfe, die Sie benötigen, wird sehr geschätzt :).

import org.apache.commons.codec.binary.Hex;
import org.bitcoinj.core.*;
import org.bitcoinj.core.ECKey.*;

public class Test3 {
    public static void main(String[] args) {

        //Given private key and SHA 256 Hash, sign a transaction

        String shaHash = "15953935a135031bfec37d36a9d662aea43e1deb0ea463d6932ac6e537cb3e81";
        String privateKey = "private key for the address";      

        byte[] priv = Base58.decode(privateKey);
        // Generate ecsda key    
        ECKey ecdsa = ECKey.fromPrivate(priv);      
        Sha256Hash hash = new Sha256Hash(shaHash);
        // Sign the transaction
        ECDSASignature sig = ecdsa.sign(hash);
        byte[] res = sig.encodeToDER();
        String res2 = Hex.encodeHexString(res);

        System.out.println(res2);



    }
}
Ich denke also, dass das Problem darin bestehen könnte, dass der private Schlüssel in einem WIF-Format vorliegt, das ich in einen privaten ECDSA-Schlüssel konvertieren muss, bin mir aber nicht sicher, wie das geht.

Antworten (1)

Diese Antwort versucht nicht, eine Transaktion zu signieren, sondern konzentriert sich einfach darauf, die signMethode der ECKeyKlasse erfolgreich aufzurufen, dh Ihren Code zum Laufen zu bringen . TransactionIch bin mit der API von noch nicht vertraut , bitcoinjdaher kann ich nicht weiter gehen. Ihr Beitrag deutet darauf hin, dass Ihr privater Schlüssel als angegeben ist, WiFdaher habe ich dies als Annahme angenommen. Die Hauptschwierigkeit besteht darin, ein ECKeyObjekt aus dem zu instanziieren, WiFdas ich Ihrem Code hinzugefügt habe. Ich habe auch die veraltete new Sha256Hash(...)durch die wrapMethode ersetzt. Ich verwende eine andere Funktion, um als hexadezimale Zeichenfolge zu codieren, aber Sie können das leicht ändern. Der Code wird bei Ausführungen erfolgreich kompiliert.

import org.bitcoinj.core.ECKey;
import org.bitcoinj.core.Base58;
import org.bitcoinj.core.Sha256Hash;
import org.bitcoinj.core.DumpedPrivateKey;
import org.bitcoinj.params.MainNetParams;
import org.bitcoinj.core.NetworkParameters;
import org.bitcoinj.core.ECKey.ECDSASignature;
import javax.xml.bind.DatatypeConverter;

public class Test {

  public static void main(String[] args){

    // message (hash) to be signed with private key
    String msg = "15953935a135031bfec37d36a9d662aea43e1deb0ea463d6932ac6e537cb3e81";

    // an example of WiF for private key (taken from 'Mastering Bitcoin')
    String wif ="KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ";      

    // creating a key object from WiF
    DumpedPrivateKey dpk = DumpedPrivateKey.fromBase58(null, wif);
    ECKey key = dpk.getKey();

    // checking our key object
    NetworkParameters main =  MainNetParams.get();
    String check = key.getPrivateKeyAsWiF(main);
    System.out.println(wif.equals(check));  // true

    // creating Sha object from string
    Sha256Hash hash = Sha256Hash.wrap(msg);

    // creating signature
    ECDSASignature sig = key.sign(hash);

    // encoding
    byte[] res = sig.encodeToDER();

    // converting to hex
    String hex = DatatypeConverter.printHexBinary(res); 

    System.out.println(hex);  // 304502210081B528....

  }
}
Perfekt, vielen Dank für deine Hilfe! Mein Code funktioniert jetzt.