Bitcoinj
如何在給定私鑰和 SHA 雜湊的情況下簽署原始交易(在 java 中)
我已按照此處的說明建立自己的比特幣交易。
目前我的程式碼可以創建交易併計算 SHA 雜湊,但我正在努力使用 ECDSA 對其進行簽名。
我已經編寫了使用 bitcoinj 的程式碼,但它不起作用。我需要一些幫助,使用 java 庫或 API 簽署交易。
這是我到目前為止所擁有的。非常感謝您的任何幫助:)。
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); } }
這個答案不會嘗試簽署交易,而只是專注於成功呼叫類的
sign
方法ECKey
,即讓你的程式碼工作。我還不熟悉的Transaction
API,bitcoinj
所以我不能走得更遠。您的文章表明您的私鑰是作為 a 給出的,WiF
所以我將此作為假設。主要困難是從我添加到您的程式碼中的對像中實例化一個ECKey
對象。WiF
我也用new Sha256Hash(...)
該wrap
方法替換了已棄用的。我正在使用不同的函式將其編碼為十六進製字元串,但您可以輕鬆更改它。程式碼在執行時成功編譯。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.... } }