為什麼我的 p2sh 原始事務沒有被探勘或出錯 ERROR: 64: NON-MANDATORY-SCRIPT-VERIFY-FLAG (EXTRA ITEMS LEFT ON STACK AFTER EXECUTION?
我按照程式比特幣一書中的說明為測試網創建了這個 2-of-2 多重簽名地址。我嘗試按照標準表格(OP_HASH160 1060f2fd6058cd100fe4e485455badf453bd63e1 OP_EQUAL)將資金花在此地址中,一切都通過了程式碼中的驗證測試,但是當我嘗試廣播我的交易時,它永遠不會被探勘或被拒絕並顯示錯誤:64:NON- MANDATORY-SCRIPT-VERIFY-FLAG(執行後堆棧中剩餘的額外項目)。
這是我的原始交易:
01000000011af3ab90a1c274ecb1f5e6e499ed2d0b5b2ebc6bbcbab751836ea70c90656e9f00000000dc00483045022100e9a2b73ff95e3395034e910d5d69dd3e18e12a28e9dacfd5f3b2894afd5fbf3f022035b50d48506932020fcea1781a0c58e9011918bd2a9cbbb5693027035ca9502b01483045022100f7621bb014d53d8a97c0b5605317dd4a92b53e03dd22e71b1db85c12e92218ff02204b77ff2a5bc9f7921d8a17d36d04ca29cbe25b2061f7c2f5e227e449ba614ee5014847522103e07f96e5ba598431c0c994493a4ae988c9854c171d5d4bb140db0a27a4c853e421031b63f964d8c65d1d1136dcfe5033dedea88c2d411934ea48c9708410be84e5ee52aeffffffff0140f60e00000000001976a91452903efc1004de01883ba3687be2a8ea4f6b1b1988ac00000000
我只有一個輸入,我都花光了。此輸入的腳本簽名命令是按照標準(OP_0、Sig1、Sig2、Redeem_script)建構的:
0, 3045022100e9a2b73ff95e3395034e910d5d69dd3e18e12a28e9dacfd5f3b2894afd5fbf3f022035b50d48506932020fcea1781a0c58e9011918bd2a9cbbb5693027035ca9502b01, 3045022100f7621bb014d53d8a97c0b5605317dd4a92b53e03dd22e71b1db85c12e92218ff02204b77ff2a5bc9f7921d8a17d36d04ca29cbe25b2061f7c2f5e227e449ba614ee501, 47522103e07f96e5ba598431c0c994493a4ae988c9854c171d5d4bb140db0a27a4c853e421031b63f964d8c65d1d1136dcfe5033dedea88c2d411934ea48c9708410be84e5ee52ae
在交易中編碼為:
dc00483045022100e9a2b73ff95e3395034e910d5d69dd3e18e12a28e9dacfd5f3b2894afd5fbf3f022035b50d48506932020fcea1781a0c58e9011918bd2a9cbbb5693027035ca9502b01483045022100f7621bb014d53d8a97c0b5605317dd4a92b53e03dd22e71b1db85c12e92218ff02204b77ff2a5bc9f7921d8a17d36d04ca29cbe25b2061f7c2f5e227e449ba614ee5014847522103e07f96e5ba598431c0c994493a4ae988c9854c171d5d4bb140db0a27a4c853e421031b63f964d8c65d1d1136dcfe5033dedea88c2d411934ea48c9708410be84e5ee52ae
我的兌換腳本遵循標準(OP_M、pubkey1、pubkey2、OP_N、OP_CHECKMULTISIG):
OP_2 03e07f96e5ba598431c0c994493a4ae988c9854c171d5d4bb140db0a27a4c853e4 031b63f964d8c65d1d1136dcfe5033dedea88c2d411934ea48c9708410be84e5ee OP_2 OP_CHECKMULTISIG
我試圖花費的輸入是在交易下:
9f6e65900ca76e8351b7babc6bbc2e5b0b2ded99e4e6f5b1ec74c2a190abf31a
通過查看錯誤,似乎我的 public_key_script 和我的redeem_script 沒有消耗堆棧中的所有數據,但是我檢查了所有內容,但找不到它是什麼。幫助!
Ps:我不認為這是一個相關的細節,但交易的輸入是由生成多重簽名地址的兩個公鑰之一發送的。只是想徹底。
您的redeemScript 包含它的長度字節。贖回腳本實際上只是一個沒有任何前置長度字節的腳本。所以對於你的腳本,它是
522103e07f96e5ba598431c0c994493a4ae988c9854c171d5d4bb140db0a27a4c853e421031b63f964d8c65d1d1136dcfe5033dedea88c2d411934ea48c9708410be84e5ee52ae
請注意它是如何以
52
和 not開頭的47
。P2SH 的工作原理是它獲取頂部堆棧元素並將其作為腳本執行。由於您以 開始您的redeemScript
47
,因此該腳本只是將下一個0x47
字節推入堆棧,而不是執行您想要的多重簽名。這樣做是完全有效的,即使那不是你想要的。非空且非錯誤的堆棧意味著腳本成功,因此您的交易是共識有效的並且可以包含在一個塊中。這不是標準的,因為在腳本執行後堆棧中留下了多個堆棧元素,這就是為什麼這不會中繼。
您的交易的正確版本是
01000000011af3ab90a1c274ecb1f5e6e499ed2d0b5b2ebc6bbcbab751836ea70c90656e9f00000000db00483045022100f7621bb014d53d8a97c0b5605317dd4a92b53e03dd22e71b1db85c12e92218ff02204b77ff2a5bc9f7921d8a17d36d04ca29cbe25b2061f7c2f5e227e449ba614ee501483045022100e9a2b73ff95e3395034e910d5d69dd3e18e12a28e9dacfd5f3b2894afd5fbf3f022035b50d48506932020fcea1781a0c58e9011918bd2a9cbbb5693027035ca9502b0147522103e07f96e5ba598431c0c994493a4ae988c9854c171d5d4bb140db0a27a4c853e421031b63f964d8c65d1d1136dcfe5033dedea88c2d411934ea48c9708410be84e5ee52aeffffffff0140f60e00000000001976a91452903efc1004de01883ba3687be2a8ea4f6b1b1988ac00000000
但這無效。贖回腳本不再與正在使用的輸出的 scriptPubKey 匹配(腳本執行在此處停止)。但簽名也將無效,因為他們簽署了不同的redeemScript。
因為您的交易不需要任何簽名,只需推送與您的 scriptPubKey 中的雜湊匹配的腳本(什麼都不做),
01000000011af3ab90a1c274ecb1f5e6e499ed2d0b5b2ebc6bbcbab751836ea70c90656e9f00000000494847522103e07f96e5ba598431c0c994493a4ae988c9854c171d5d4bb140db0a27a4c853e421031b63f964d8c65d1d1136dcfe5033dedea88c2d411934ea48c9708410be84e5ee52aeffffffff0140f60e00000000001976a91452903efc1004de01883ba3687be2a8ea4f6b1b1988ac00000000
是一個有效的、可中繼的、花費你的輸出的交易。