Script

為什麼 OP_CHECKSIGADD 中的無效簽名不推入堆棧?

  • July 13, 2022

我一直在研究比特幣核心提供的靜態測試向量來實現解釋器。

我發現的一些令人驚訝的行為是,在 的情況下OP_CHECKSIGADD,如果發現無效簽名,解釋器將無法執行而不是繼續執行。為什麼會這樣?

在我(可能是幼稚的)心理模型中,似乎不正確的簽名不應增加堆棧上的計數器並繼續執行。

https://github.com/bitcoin/bitcoin/blob/c92eb6cda0f402b83263c9a9ee129d5d0763fd3f/src/script/interpreter.cpp#L1096

這是觸發我正在談論的行為的測試案例

 {
   "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。但如果您提供實際簽名,則它必須是有效的。

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