Script

試圖理解比特幣測試中的非標準交易

  • February 3, 2022

我正在嘗試實現一個比特幣腳本解釋器,今天我偶然發現了一個非標準交易,tx_valid.json這讓我很頭疼。有問題的交易具有以下 prevout 腳本公鑰:

DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1 0x47 0x3044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a01

並設置了 CLEANSTACK 標誌。

如果我們忽略腳本中存在的非標準簽名,則腳本是成功的(它是前面的測試tx_valid.json

現在,如果我們的簽名添加到該腳本,在執行結束會有堆棧上的兩個值,1和0x3044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a01。由於 CLEANSTACK 標誌只需要堆棧上的一個值,我認為腳本應該失敗。

我的一個想法是 FindAndDelete 刪除腳本公鑰中的所有其他簽名,所以現在堆棧中只有 1 個。但是我不確定這一點,因為從我讀過的內容來看,FindAndDelete 僅在驗證 OP_CHECKSIG 和 OP_CHECKMULTISIG 時刪除下標中的值,並且不會修改實際腳本。

那麼我錯在哪裡?

文件中列出的標誌是倒置的:它給出了在哪些標誌下驗證預計不會成功(或者換句話說:在除那裡列出的標誌之外的所有標誌下,預計會成功)。

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