如何驗證 P2SH 簽名
我正在嘗試調試一個問題,我認為我可能有一個錯誤的簽名,但我正試圖弄清楚如何解決它。
- 這是什麼簽名。私鑰 + 什麼(兌換腳本?整個原始十六進制?)
- 我如何驗證這是一個正確的部分簽名(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 使用兌換腳本中的每個公鑰檢查您的單個簽名。如果您的簽名對特定的公鑰有效,那麼您的簽名是有效的。如果您的簽名對任何公鑰均無效,則該簽名無效。