Bitcoinj

使用公鑰針對散列驗證給定的 R/S 對(簽名)

  • December 29, 2015

根據這個函式:

public boolean verify(Sha256Hash sigHash, ECDSASignature signature) {
       return ECKey.verify(sigHash.getBytes(), signature, getPubKey());
   }

我不明白哪個必須是變數sighash的內容。

這是我創建簽名的函式:

public ECDSASignature scriptSig(Receiver r) {
       System.out.println("First step :\n");
       System.out
               .println("CREATION OF SCRIPTSIG-----OR----- OUTPUT TRANSACTION");

       r = super.getReceiver();

       Wallet rwallet = r.getReceiverWalletList().get(0);

       BigInteger R = rwallet.getClientKey().getPrivKey();
       System.out
               .println("*******************************************************");
       System.out.println(R);

       BigInteger S = new BigInteger(r.getReceiverWalletList().get(0).getClientKey().getPubKey()); // i
                                                                               // had
                                                                               // .getPubkeyHash()
       System.out
               .println("*******************************************************");
       System.out.println(S);


       // constructs a signature with the given components
       ECDSASignature receiverSig = new ECDSASignature(R, S);

       return receiverSig;
   }

在這裡我正在嘗試驗證我的簽名:

sha256hash = new Sha256Hash(receiver.getReceiverWalletList()
                       .get(0).getClientKey().getPrivKeyBytes());
           redeemerSignature = scriptSig(receiver);


.....


if (receiver.getReceiverWalletList().get(0).getClientKey()
                       .verify(sha256hash, redeemerSignature))
                   System.out.println("The transaction finished SUCCESSFULLY");

               else
                   System.out
                           .println("The transaction finished UNSUCCESSFULLY");

我想我的問題是**sha256hash = new Sha256Hash(…)**實例中的正確輸入。

有什麼幫助嗎?

我想你使用的是 BitCoinJ 庫。

您沒有以正確的方式創建簽名;應使用 ECDSA 簽名參數 (r,s)初始化ECDSASignature對象,而不是實際的私鑰和公鑰。您正在使用的建構子意味著已經計算了 ECDSA 簽名,您以某種方式獲得rs啟動了簽名對象。

要實現您所需的功能,請使用doSign(Sha256Hash input, BigInteger privateKeyForSigning)您的方法,ECKey輸出將是您想要的ECDSASignature對象。

on 的輸入doSign應該與 on 的輸入相同verify,它始終是要簽名的消息的 SHA256。如果你想花費 P2PKH 輸出,你必須簽署公鑰,查看這篇文章了解更多資訊。

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