Transactions

如何簽署具有多個輸入的交易?

  • June 10, 2019

我已經能夠在 python 中編寫一個應用程序來發送花費 1 個輸入的有效事務,但我真的無法讓它與 2 個或更多輸入一起工作。

所以我的問題是,必須為每個輸入簽名的雜湊究竟是如何計算的?

到目前為止,我一直在做的是,例如,如果我們有 2 個輸入,我們會生成一個只花費第一個輸入的交易,這就是必須為第一個輸入簽名的雜湊。與第二個輸入相同,我們生成一個只花費第二個輸入的交易。兩筆交易都需要有相同的輸出。

那是對的嗎?例如,我們想花費輸入aaaa:0和輸入bbbb:1,我們想將它們發送到某個地址:

為了計算第一個輸入必須簽名的雜湊,我們需要生成這個交易:

'version': 1,
'inputs': (1)
   'output_tx_hash': 'aaaa',
   'output_position': 0,
   'script': the original script, like: '76a914' + hash + '88ac',
   'sequence': ffffffff,
'outputs': (1)
   'value' : 100000
   'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

併計算第二個輸入必須簽名的雜湊:

'version': 1,
'inputs': (1)
   'output_tx_hash': 'bbbb', # this changes
   'output_position': 1,     # this changes
   'script': the original script, like: '76a914' + hash + '88ac',
   'sequence': ffffffff,
'outputs': (1)
   'value' : 100000
   'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

我們對它們進行序列化,將它們添加 01000000 (SIGHASH_ALL),將其加倍 sha256,對其進行簽名,然後添加 01。這樣我們將分別獲得將在每個輸入上使用的兩個簽名。我的應用程序正是這樣做的,但不起作用。我錯過了什麼?

我找到了這樣做的方法,所以,如果有人有興趣,這裡是如何做到的:

當您有超過 1 個輸入時,您不必刪除不打算簽名的輸入,您只需刪除它們的腳本。因此,如果您想簽署問題中發布的交易,則第一個雜湊將按如下方式計算:

'version': 1,
'inputs': (2)
   {
   'output_tx_hash': 'aaaa',
   'output_position': 0,
   'script': the original script, like: '76a914' + hash + '88ac',
   'sequence': ffffffff,
   }, {
   'output_tx_hash': 'bbbb',
   'output_position': 1,
   'script': '', # Nothing
   'sequence': ffffffff,
   }
'outputs': (1)
   'value' : 100000
   'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

第二個雜湊:

'version': 1,
'inputs': (2)
   {
   'output_tx_hash': 'aaaa',
   'output_position': 0,
   'script': '', # Nothing
   'sequence': ffffffff,
   }, {
   'output_tx_hash': 'bbbb',
   'output_position': 1,
   'script': the original script, like: '76a914' + hash + '88ac',
   'sequence': ffffffff,
   }
'outputs': (1)
   'value' : 100000
   'script' : '76a914' + hash of btc pub key + '88ac'
'locktime': 0

希望它可以幫助任何人。

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