沒有對應輸出的 SIGHASH_SINGLE
事務99fc1e5c753459808bac56435b3d45f2fcf0dd73016ea14460d63e9ddf353714是一個有趣的例子。
該交易有 5 個輸入和 1 個輸出。所有輸入腳本包括 1 個公鑰和 1 個簽名。它們都使用相同的公鑰,並且所有簽名都具有 SIGHASH 字節 03 (SIGHASH_SINGLE)。輸入 1 - 4 都具有完全相同的簽名,這意味著相同的數據用於創建簽名。
所有輸入的公鑰是:
044edfcf9dfe6c0b5c83d1ab3f78d1b39a46ebac6798e08e19761f5ed89ec83c108172c4776865f02047b39cd704135c00c1b00085e0d1b9255405ac7079fa50a2
輸入 1 - 4 的簽名是:
3045022100912f994094193109a9faedf7ef855220638f95ac51c66d4eb46740dd1c0813fa0220100bc99adb8b64fb784173ca8883a78835e156b74f143c02e071dc82695e847203
但是,交易中只有一個輸出,因此輸入 1 - 4 沒有相應的輸出。當此交易添加到區塊鏈時,所有這些輸入都必須經過驗證。為了創建輸入 1 - 4 的簽名,對哪些數據進行了簽名?
該站點底部的解釋說,如果沒有相應的輸出,那麼得到簽名的消息總是
0100000000000000000000000000000000000000000000000000000000000000
. 但是,公鑰無法驗證輸入 1 - 4 的簽名數據。在這種情況下,對哪些數據進行簽名以產生簽名?
該站點底部的解釋說,如果沒有相應的輸出,那麼得到簽名的消息總是
0100000000000000000000000000000000000000000000000000000000000000
. 但是,公鑰無法驗證輸入 1 - 4 的簽名數據。這幾乎是正確的。當遺留(pre-segwit)交易輸入具有 SIGHASH_SINGLE 的簽名,並且在同一索引處沒有相應的輸出時,消息散列被簽名
0x0100000000000000000000000000000000000000000000000000000000000000
。ECDSA 指定在轉換為標量之前對消息進行雜湊處理。在比特幣中,這通常是通過雙 SHA256 雜湊來完成的。但是在這種 SIGHASH_SINGLE 不匹配條件的情況下,簽名的創建就好像它0x0100000000000000000000000000000000000000000000000000000000000000
是雙 SHA256 雜湊的*輸出一樣。*這可以說使它不是真正的 ECDSA 簽名,並且(希望)不了解比特幣特定規則的工具不會認為這是一個有效的簽名。