驗證比特幣簽名以及簽名的交易數據是什麼?
給定一個比特幣交易,它能夠贖回它的 UTXO,我如何在 Java 中驗證簽名是否實際上是一個有效的簽名。我試圖使用 Bouncy Castle 庫,在那裡我試圖重新創建私鑰簽名的消息。
據我所知,我需要以下東西 -
1.版本號(4字節)
2.輸入的數量(1字節) 3.
被贖回的輸入的交易雜湊4.被贖回的輸出的索引
(4字節)
5.被贖回的輸出的ScriptPubKey前面加上腳本的長度
6.Sequence Number(4 bytes) 7.No
of outputs we are signed over(1 byte)
8.total value of the output(8 bytes)
9.ScriptSig 用於輸出前面的長度
10.locktime欄位(4 字節)
11.hashcode 類型(4 字節)
我試圖從交易數據中擷取此資訊,但是當我嘗試驗證簽名時,它失敗了。我錯過了什麼嗎?我希望能夠驗證簽名是否正確。謝謝。
根據我的閱讀,第 5 步是一個臨時步驟,ScriptPubkey 被其他值替換,但我無法理解該值應該是什麼。
您所描述的僅適用於具有一個輸入和一個輸出的事務。
通常,您所做的是獲取要驗證的事務,從所有輸入中刪除 scriptSigs,對於您想要的特定輸入,您在 scriptSig 中放置輸出的 scriptPubKey(以它的長度為前綴)該投入花費。如果使用的輸出是 P2SH,那麼您放置了redeemScript 而不是 scriptPubKey。然後將 sighash 類型放在修改後的事務的末尾。
收到該消息後,您需要使用 SHA256 對其進行雜湊處理。大多數加密庫都會接收一條消息並對其進行一次雜湊處理。然而在比特幣中,消息實際上被雜湊了兩次。因此,要使用通用加密庫驗證比特幣中的簽名,您需要先對消息進行雜湊處理,然後在驗證時允許庫再次對其進行雜湊處理。
最後,對於花費 Segwit 輸出的輸入,消息是不同的。該消息在BIP 143中定義。