Multi-Signature

如何驗證 P2SH 簽名

  • April 3, 2020

我正在嘗試調試一個問題,我認為我可能有一個錯誤的簽名,但我正試圖弄清楚如何解決它。

  1. 這是什麼簽名。私鑰 + 什麼(兌換腳本?整個原始十六進制?)
  2. 我如何驗證這是一個正確的部分簽名(N 2 of 3)P2SH 交易。

我有3個簽名。我想分別測試每個簽名,看看哪些是壞的或好的。一種方法是如何處理的?我在這裡閱讀了很多文章,但我沒有找到任何解決方案。

要回答您的第一個問題:

P2SH 交易啟動比特幣節點中的特殊規則。當 Script_Publick_Key 帶有這種模式時: OP_HASH_160, <HASH>, <OP_EQUAL> 然後節點以不同的方式執行資訊。

首先,它像往常一樣執行。它將 ScriptSig 置於 Script_Public_Key 之上。ScriptSig 必須遵循以下形式:

OP_0
<Signature 1>
<Signature 2>
...
<Signature (m)>
<SerializedRedeemScript>

由於評估的腳本規則,要評估的第一個項目將是<SerializedRedeemScript>. 如果此序列化腳本的 hash160 與 Script_Publick_Key 中的雜湊匹配,則第一輪有效,舊節點將在此處停止。但是,符合 BIP0016 的節點稍後會將贖回腳本的序列化<SerializedRedeemScript>版本<SerializedRedeemScript>(驗證。那麼,讓我們來談談這個redeem_script。

贖回腳本必須指定多少個私鑰可以對交易進行簽名(n),需要多少個簽名才能合法地對交易進行簽名(m),以及與可以簽署交易的私鑰對應的所有公鑰。贖回腳本的形式如下:

<OP_m>
<PublicKey 1>
<PublicKey 2>
...
< PublicKey (n)>
<OP_n>
<OP_CHECKMULTISIG>

由於我們只<SerializedRedeemScript>在第一輪驗證中消耗了 OP_0 和簽名,最終的命令堆棧,即兌換腳本和 ScripSig 剩餘內容的組合,將如下所示:

OP_0
<Signature 1>
<Signature 2>
...
<Signature (m)>
<OP_m>
<PublicKey 1>
<PublicKey 2>
...
< PublicKey (n)>
<OP_n>
<OP_CHECKMULTISIG>

第一個 OP_0 是必要的,儘管它根本沒有任何意義。這是必要的,因為一個名為 Off-By-One 的錯誤。這是中本聰偶然完成的。

簽名和公鑰將由<OP_CHECKMULTISIG>.

How can i verify that this is a correct partial signature (N 2 of 3) P2SH transaction.

如果您想逐個簽名檢查簽名,那麼您可以嘗試通過首先計算交易雜湊 (z),然後通過 OP_CHECKSIG 而不是 OP_CHECKMULTISIG 使用兌換腳本中的每個公鑰檢查您的單個簽名。如果您的簽名對特定的公鑰有效,那麼您的簽名是有效的。如果您的簽名對任何公鑰均無效,則該簽名無效。

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