Bitcoinj
使用公鑰針對散列驗證給定的 R/S 對(簽名)
根據這個函式:
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 簽名,您以某種方式獲得r
併s
啟動了簽名對象。要實現您所需的功能,請使用
doSign(Sha256Hash input, BigInteger privateKeyForSigning)
您的方法,ECKey
輸出將是您想要的ECDSASignature
對象。on 的輸入
doSign
應該與 on 的輸入相同verify
,它始終是要簽名的消息的 SHA256。如果你想花費 P2PKH 輸出,你必須簽署公鑰,查看這篇文章了解更多資訊。