Bitcoinj

如何在給定私鑰和 SHA 雜湊的情況下簽署原始交易(在 java 中)

  • March 22, 2019

我已按照此處的說明建立自己的比特幣交易。

需要逐步兌換原始交易範例

目前我的程式碼可以創建交易併計算 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,即讓你的程式碼工作。我還不熟悉的TransactionAPI,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....

 }
}

引用自:https://bitcoin.stackexchange.com/questions/50562