Transactions

為什麼要簽署比特幣交易的輸入?

  • December 8, 2018

這是我對交易的理解:

inputs: 
 input0: 
   txid: <funding tx0 TXID>
   outputID: <output ID of UTXO in the funding tx0>
   scriptSig: <pkhash_redeemer> <sig0_redeemer>
 input1: 
   txid: <funding tx1 TXID>
   outputID: <output ID of UTXO in the funding tx1>
   scriptSig: <pkhash_redeemer> <sig1_redeemer>
 ...
outputs: 
 output0: 
   scriptPK: <scriptPK for new UTXO>
   amount: <amount for new UTXO> 

簽名<sig_redeemer0>結束的地方:

  • <funding tx0 TXID>
  • <output ID of UTXO in the funding tx0>
  • 資金交易的公鑰腳本
  • <scriptPK for new UTXO>
  • <amount for new UTXO>

我讀過很多關於以下內容的陳述:“簽名在整個交易中”或“簽名對所有輸入和輸出進行簽名”。但是,我有幾點困惑:

  1. 多個輸入是否需要多個簽名?還是我的例子錯了?
  2. 為什麼我們需要對交易的輸入進行簽名?

如果輸入未簽名,則意味著以下內容未簽名:

  • txid資金交易
  • <output ID of UTXO in the funding tx>
  • 序列號 (?)

如果所有輸出都已簽名,則來自資金交易的所有 UTXO 的金額和 scriptPubKey 都是固定的。攻擊者可能能夠更改兌換交易的輸入,但只有在輸入保持不變時才能解鎖,因此攻擊者不能使用任意輸入。

任何幫助,將不勝感激!謝謝

同一個腳本可能會解鎖多個 utxos。最常見的例子是兩個支付相同地址的交易。如果輸入沒有簽名,攻擊者可以用支付相同地址的不同 utxo 替換一個輸入 utxo,這將是糟糕的。

考慮以下場景。Alice 收到了兩筆付款到她的地址 1Alice,金額均為 1 BTC:一筆 txid 為 234abc,金額為 1 BTC,另一筆 txid 為 567def。她希望向 Bob 支付 0.5 BTC,因此她使用 234abc utxo 作為輸入創建並簽署了一筆交易,輸出如下:0.5 BTC 到地址 1Bob,0.4999 BTC 到某個“更改”地址 1AliceChange。(這會產生 0.0001 BTC 的交易費用。)

在此交易被廣播並確認後,Bob 修改交易,使輸入改為 567def。scriptSig 對支付 1Alice 的每筆交易同樣有效(它們都有相同的 scriptPubKey),因此這個新交易也是有效的。Bob 廣播它並有效地從 Alice 那裡偷走了額外的 0.5 BTC,而她從未打算給他。

這只適用於 567def 的值與 234abc 相同或更大的情況,但這並沒有太大的限制。(如果 567def 有更大的價值,比如 10 BTC,那麼 Bob 的新交易仍然只返回 BTC 0.4999 給 1AliceChange,因此它實際上有 BTC 9.0001 的交易費用。任何礦工都會非常樂意確認這筆交易;實際上,也許即使 Bob 不關心,礦工也會執行此攻擊。)

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