Transactions
為什麼多輸入交易中每個輸入的簽名雜湊不同?
在 BIP143 之前的簽名散列中,我知道簽名散列不同,因為您必須為每個輸入替換先前的 scriptPubKey,因此序列化會發生變化。
問題是為什麼?如果 HASH_TYPE 是 SIGHASH_ALL,為什麼每個輸入都需要更改簽名雜湊?為什麼不使用 scriptPubKeys 簽署相同的“空白”交易或相同交易?
改變每個輸入的簽名有助於防止多方交易建構過程中的一些攻擊。
考慮一個涉及 Alice 和 Bob 的硬幣連接。Alice 選擇了她的一個 UTXO 來進行 coinjoin。Bob 為他的輸入選擇了一個 UTXO,但他實際上選擇了 Alice 的其他 UTXO 中的一個,這些 UTXO 重用了與她選擇的地址相同的地址。Alice 沒有註意到 Bob 選擇了她的一個 UTXO 並繼續使用 coinjoin 協議,對她的輸入進行簽名。現在 Bob 複製了她的簽名,如果 SIGHASH_ALL 對於所有輸入都是恆定的,那麼這對於他選擇的 Alice 的 UTXO 是有效的。現在 Bob 已經為自己獲得了 Alice 的資金。
從技術上講,如果 Alice 檢查所有其他對 coinjoin 的輸入以確保它們不受她自己控制,則可以避免這種情況,但這是一個巨大的痛苦,容易出錯,令人驚訝,並且可能意味著安全簽名模組需要了解所有使用相同公鑰的 UTXO。