Transactions

如何手動簽署具有多個輸入和多個輸出的交易?

  • July 14, 2020

我正在開發事務建構子,但我遇到了幾個問題。對於其中一些我在如何簽署具有多個輸入的交易中找到了答案?,其餘的我將嘗試解釋:

  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': (2) 'value' : 100000 'script' : '76a914' + hash of btc pub key + '88ac' 'value' : 50000 'script' : '76a914' + hash of btc pub key + '88ac' 'locktime': 0

  1. 在輸入的部分腳本中,有“Nothing”,但它的確切字節數是多少 - 1 個字節、4 個字節或其他什麼?
  2. 是否有用於手動交易建構和簽名的分步指南或教程,涵蓋多輸入和多輸出交易。我成功地將交易發送到區塊鏈,但只有一個輸入的交易。

在交易方面,我認為十六進製表示可以比文字更明確地解釋。

這就是為什麼我的答案在簽名的每一步都使用十六進制。

鑑於您的 P2PKH 交易有兩個輸入,這是必須使用對應於第一個outpoint的私鑰簽署的原始交易:

01000000
02
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
00000000
19
76a914<your-first-pkhash(160bit)>88ac
ffffffff
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
01000000
00
ffffffff
02
a086010000000000
19
76a914<hash-of-target-btc-pubkey1(160bit)>88ac
50c3000000000000
19
76a914<hash-of-target-btc-pubkey2(160bit)>88ac
00000000
01000000

這是必須使用對應於第二個outpoint的私鑰簽署的原始交易:

01000000
02
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
00000000
00
ffffffff
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
01000000
19
76a914<your-second-pkhash(160bit)>88ac
ffffffff
02
a086010000000000
19
76a914<hash-of-target-btc-pubkey1(160bit)>88ac
50c3000000000000
19
76a914<hash-of-target-btc-pubkey2(160bit)>88ac
00000000
01000000

這是生成的簽名交易:

01000000
02
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
00000000
6a
47
304<...rest-of-signature>
01
21
<your-first-pk(264bit)>
ffffffff
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
01000000
6a
47
304<...rest-of-signature>
01
21
<your-second-pk(264bit)>
ffffffff
02
a086010000000000
19
76a914<hash-of-target-btc-pubkey1(160bit)>88ac
50c3000000000000
19
76a914<hash-of-target-btc-pubkey2(160bit)>88ac
00000000

假設:(1)您正在使用壓縮的公鑰。(2) 類型為 SIG_ALL

注意:簽名的長度可能不同,因此指示腳本長度的字節可能與上面的範例不同。

回答你的第三個問題,這裡有一個描述

當我們有多個輸入和多個輸出並嘗試簽署每個輸入時,我們為每個輸入填寫什麼輸出值部分:交易輸入的總和或我們簽署的每個輸入具有並且我們分配的相應金額輸出之間?

對於非隔離見證輸入,散列供您簽名的消息幾乎是整個交易本身。您必須按照它們在最終交易中的順序獲得所有輸出。您不會放置一個輸出或將它們聚合 - 您將所有輸出都放在最後一筆交易中。

對於 segwit 輸入,不是將所有輸出都放在消息中,而是首先將它們全部散列在一起。它們被序列化,就好像它們將要進行交易一樣,然後一次全部散列。生成的 SHA256 雜湊是您在消息中使用的。閱讀BIP 143了解更多資訊。該value消息中的欄位僅是該特定輸入所花費的輸出的值。

在輸入的部分腳本中,有“Nothing”,但它的確切字節數是多少 - 1 個字節、4 個字節或其他什麼?

“Nothing”表示有一個長度為 0 的腳本,所以它的意思是單字節00。但是,在交易簽名中,您永遠不會簽署空腳本。如果你是,那是有問題的。

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