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);
}
}
Diese Antwort versucht nicht, eine Transaktion zu signieren, sondern konzentriert sich einfach darauf, die sign
Methode der ECKey
Klasse erfolgreich aufzurufen, dh Ihren Code zum Laufen zu bringen . Transaction
Ich bin mit der API von noch nicht vertraut , bitcoinj
daher kann ich nicht weiter gehen. Ihr Beitrag deutet darauf hin, dass Ihr privater Schlüssel als angegeben ist, WiF
daher habe ich dies als Annahme angenommen. Die Hauptschwierigkeit besteht darin, ein ECKey
Objekt aus dem zu instanziieren, WiF
das ich Ihrem Code hinzugefügt habe. Ich habe auch die veraltete new Sha256Hash(...)
durch die wrap
Methode 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....
}
}
alex676