Signature

驗證比特幣簽名以及簽名的交易數據是什麼?

  • September 9, 2019

給定一個比特幣交易,它能夠贖回它的 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中定義。

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