Script
為什麼 OP_CHECKSIGADD 中的無效簽名不推入堆棧?
我一直在研究比特幣核心提供的靜態測試向量來實現解釋器。
我發現的一些令人驚訝的行為是,在 的情況下
OP_CHECKSIGADD
,如果發現無效簽名,解釋器將無法執行而不是繼續執行。為什麼會這樣?在我(可能是幼稚的)心理模型中,似乎不正確的簽名不應增加堆棧上的計數器並繼續執行。
這是觸發我正在談論的行為的測試案例
{ "tx": "020000000342dbdd00df8ddb7968f88bd7c899d66c3007e19d1c71ddba2274f9e900c0cefa82010000006edc7db5db38e3ab6ba99b0b810400a211882152d27173c6a7945a40fe23b7924bff77cf6c0000000092d3c19742dbdd00df8ddb7968f88bd7c899d66c3007e19d1c71ddba2274f9e900c0cefa6101000000a1ea36c301b2d549000000000017a9142177f6af7e86b98028c5e4dd4a82d80f1c6492c7876f818b44", "prevouts": ["69cd3300000000001976a91410fa7d1c37dc119ceef9b79ec2d4abe7445c468188ac", "1d6a7600000000002251203b1c3f3adebc2e153ec7d8063cf0f2bb534171c554c0e969269a2f02dddd03f4", "1f49370000000000225120281511f00d3c3de3d36983e73a04295adb745511db699ce19d0d5331754dadf8"], "index": 2, "flags": "P2SH,DERSIG,CHECKLOCKTIMEVERIFY,CHECKSEQUENCEVERIFY,WITNESS,NULLDUMMY,TAPROOT", "comment": "siglen/invalid_csa_neg", "final": true, //omit success as it isn't necessary "failure": { "scriptSig": "", "witness": [ "ad71936bf8c2bfa761dd70af336e9f3f01f1dc7208f473d548ee025caad1f7fcf020bacfcfbad5b8be77f70655b59824a27fa025b1cefda56a5ca4c5592fafe6", "5220add82ad8000e562efe2b4f7447016e9f9fd3eb73e56e6b0f099c85aedcf34a7cba5287", "c106c3f692377db31176526c691d50a518c745f9aac8c0da21802f7a7652bd9a9d60808dd6363137648795cfbd150458b8cdf5ab35fe9dfd73ca2c2f21059349becc7442164c6ea9ce87a72f0d7197d1c06ae67d7b0f2a864ef793135a35fddbd9" ] } }
由於批量驗證,無效簽名通常會在 BIP342 中中止執行,因為批量驗證沒有確定哪些簽名檢查無效的機制——只有是否所有簽名都有效。批量驗證沒有在任何地方實現 AFAIK,但 BIP340-342 旨在支持它,因此必須拒絕任何無效的東西,以防止一旦推出共識失敗。
如果您希望不計算簽名(無論是通過 OP_CHECKSIG 還是 OP_CHECKSIGADD),則該簽名需要完全等於空字元串。如果提供了一個空字元串作為簽名,則將其視為故意遺漏的簽名,併計為 0。但如果您提供實際簽名,則它必須是有效的。