Transactions

如何判斷我需要對前一個 tx 的哪一部分進行雜湊來簽署舊的給定 tx?

  • August 11, 2017

我最近被教導(在這裡)如何創建散列來為現有交易的給定“輸入腳本”簽名。然後,我試圖測試我的能力,並找到了一個難以理解的交易。好吧,我確實找到了它,它證明了我的理解嚴重不足以處理具有多個輸入腳本事務和/或具有多個腳本的先前事務的任何事情。

我發現d1cdb8c3828ee74c22677e705539937d039e6acef19e5f2ac0a2779846e4b6c1 可以在這裡找到“原始” 。這些是字面上幾十個的前三個“輸入腳本”:

1

3044022062025a634a2144462cca4b8b0e7b09188b214abb44c8738401bbe03b5df74a59022040fc2c48dc4b940b917c55de3d33861f3d0f21f0807039d725cb613caf6d

02f32fbdcc91934c8ea17cbe3b1ce8bb34cba9f33b959eb5d2d676181466c849ca

2

3044022079b93499324572f031e873c62d12d0207248d2e3d042781db2e6c009325ff6b6022059f81d40a65933bc8ad5f5125432cb5c156d3f64b152ee13f849c376

02f32fbdcc91934c8ea17cbe3b1ce8bb34cba9f33b959eb5d2d676181466c849ca

3

3045022100a9c5705ee0427f976fe6f62bb5ab9e1f08a5550149021ef3f275e3f015326786022052e23f2931b7c6697918149cdb34d39884adf321305f087e0a0928e

02f32fbdcc91934c8ea17cbe3b1ce8bb34cba9f33b959eb5d2d676181466c849ca

許多“輸入腳本”,每一個似乎都來自多輸入事務(我認為這就是你所說的)。我能做的最好的事情是點擊給定網站上顯示的每個金額的“輸出”連結,以確認它來自哪筆交易,但要辨別我應該使用前一筆交易的原始數據的哪一部分來製作雜湊為該交易中的特定輸入腳本簽名?我會更有效率地將頭撞在牆上。相比之下,把我的頭撞在牆上也會更愉快。而且這甚至沒有考慮我必須更改哪些其他內容以適應該數據段(例如,在我對它進行兩次散列之前,我是否必須更改它在整體事物中的哪個輸入?)。

有人可以指導我完成有關如何創建雜湊以簽署此交易的前 2-3 個輸入腳本的步驟(用相對外行的術語)嗎?請向我展示這項工作,並向我展示在對它進行兩次雜湊之前我應該得到的全部內容以及在我對它進行兩次雜湊之後我應該得到的內容(對於前 2-3 個輸入腳本)。即使是最壞的情況,如果你只給我前 2-3 個腳本的完整內容(只需複制和粘貼即可進行雙重雜湊),並為前 2-3 個腳本簽名生成的雜湊,我會贊成您的答案,將其確定為正確答案(假設您的數字是正確的)。

我經常發現我在這裡得到的答案是……嗯……超出了我能理解和遵循的範圍。儘管我可能會嘗試,但在一堆原始交易數據(尤其是諸如此交易及其之前的交易之類的交易)中,我很難區分“輸入”、“sighash”、“腳本 sig”、 “輸出”、“丁果”甚至“小點”,對我來說都是一大串數字,我可以注意到模式,但無法解開。

為了證明我至少嘗試過,我得到6fa4c7db52edfd1b20f11185283b600e4015d0ef0da7a6f7ffeae53f53a54d42了第一個輸入腳本的雜湊簽名,我得到4d76fae4618eb086688f50faa2dcfeb5ed7071030cb87be6905c5910a9901ed3了第二個輸入腳本,我懷疑我是否接近正確答案,因為前一個 tx 的原始交易數據是如此復雜和很長,有很多部分,我不知道我應該得到什麼。

至少,請告訴我前 2-3 個輸入我應該得到什麼雜湊來簽名。至少這樣我可以檢查我的工作並嘗試自己弄清楚,即使我不理解給定的解釋,如果我有這些雜湊。

這個問題可能被認為與其他問題相似,但是,相比之下,我要求一步一步的例子,這個交易的前幾個輸入,關於如何知道我應該查看前一個交易的哪些部分真正展示它,以便我可以通過比較我採取這些步驟的結果與您採取相同步驟獲得的結果來確認我對您的步驟的理解。

如果您只是說,關於特定的輸入腳本或其他東西,“嗯,來自上一個交易的輸入 4,請看那個”,我不知道該輸入在前一個 tx 的原始數據中的位置!我也不知道怎麼弄明白。如果你給我看,那將幫助我辨識它,以便我能夠辨別其中的一些細微差別並開始理解如何理解它。如果您不告訴我它是什麼,那麼我無法確認我理解了您的指示。

如果您說“請記住在這部分中註明”。記下什麼,我不知道我應該記什麼,或者即使我知道,如果你不給我看,我會怎麼記(或者,請假設我不知道,你可能不能在您對我的步驟的描述中“過於基本”,因為我充其量是一名業餘程序員,遠非任何程度的電腦工程師)。

我知道我對具體性的要求超出了對步驟描述的規範,但我認為這可能會幫助那些不那麼熟悉的人尋求這樣的答案,這也是我也只要求複製和粘貼的原因結果我應該得到我需要雜湊兩次的前 2-3 個腳本,以及它們產生的雜湊值;這樣我就可以獲取您的資訊並嘗試自己弄清楚,這樣我就不會用 16 條評論來困擾你們,試圖找出答案,等待數小時的回复(其中一些永遠不會來)徒勞地嘗試理解你試圖用我不完全理解的方式告訴我的是什麼。相反,你會用工具幫助我自己解決問題。

謝謝您的幫助。

免責聲明:我將假設您並非完全一無所知,並且您知道數組是什麼,如何從 0 開始計數,以及如何匹配括號、引號和冒號,以便您可以讀取 JSON 格式的數據。如果你不知道如何做這些事情,那麼請在閱讀這篇文章之前先用Google搜尋它們。

此外,這篇文章會很長,而且非常技術性。根本沒有外行的術語來解釋這一點,但是假設您知道我上面所說的內容,可以將其解釋為非常容易理解。加粗的東西是你應該記住的東西,因為我將在後面的文章中使用這些術語。

最後,這些說明適用於從以 . 開頭的比特幣地址“支出”的交易1。“從”其他比特幣地址類型“支出”使這個過程更加複雜。


交易

我將使用與您問題中的交易不同的交易,因為該交易太大而無法輕鬆解釋。相反,我將使用更小的ff8766ec873ff55cc0ac17dee7b379a4efa2a5c83dabdd9a30287c7761ad55d5 。

Blockchain.info 沒有提供足夠的資訊來輕鬆建構散列。相反,我將使用來自 Bitcoin Core 的命令輸出,它以JSON 格式getrawtransaction分解交易:

{
 "hex": "0100000003b0c03779c38ddabc044947b164adbcffde8e0ddb3678494f4e8b83f13b37629d010000006b483045022100f3c0f555cd39198caf77f6756256801fc57bcabe4892601b9def52259698f40a0220230262841bff151eb617f7d4cdda6bf06d6fa791230c152e47f68bcdd0e6f64a01210204b3506d8903ca601c97a4abab6548e91004c535a5a45e21299a494b146859caffffffff060eeae54b70d12caddcc15f8897ebc2b6c3011c9a600aba74d49b969991cab3000000006b4830450221009dbeb64ddd4646e1118503c87feaa95c531b5178c6e543be782f6ecb05e8fbe602203945570f8dc56c145617f0283fa4032e0b7895a9cf2a81c7b65665b8ac608cb00121026602a5dc59c30f485b2c457ac8e2f617e27b10a1d2ae76f3231f9b01dff08964ffffffff7f715ba408db0289118f9b8578e54e721f1aee10d09844510793b8b20c87903e010000006b48304502210095e300886ec4df78e39d6d0cf5e5e531ded8f42f00e5730c371d8951867dad5b02203c55f9403f6c2aac444213161a93a86661e7367d4007be74ffb3981387cc1c790121023f0aadfeb71a4964c5087fec8b052c8236051dae838d4747543330c6b266ce6effffffff02d5781100000000001976a914342ab422c9e3ef285efe9882ae54269ed9713dd688ac20a10700000000001976a91488d924f51033b74a895863a5fb57fd545529df7d88ac00000000",
 "txid": "ff8766ec873ff55cc0ac17dee7b379a4efa2a5c83dabdd9a30287c7761ad55d5",
 "hash": "ff8766ec873ff55cc0ac17dee7b379a4efa2a5c83dabdd9a30287c7761ad55d5",
 "version": 1,
 "size": 522,
 "vsize": 522,
 "locktime": 0,
 "vin": [
   {
     "txid": "9d62373bf1838b4e4f497836db0d8edeffbcad64b1474904bcda8dc37937c0b0",
     "vout": 1,
     "scriptSig": {
       "asm": "3045022100f3c0f555cd39198caf77f6756256801fc57bcabe4892601b9def52259698f40a0220230262841bff151eb617f7d4cdda6bf06d6fa791230c152e47f68bcdd0e6f64a[ALL] 0204b3506d8903ca601c97a4abab6548e91004c535a5a45e21299a494b146859ca",
       "hex": "483045022100f3c0f555cd39198caf77f6756256801fc57bcabe4892601b9def52259698f40a0220230262841bff151eb617f7d4cdda6bf06d6fa791230c152e47f68bcdd0e6f64a01210204b3506d8903ca601c97a4abab6548e91004c535a5a45e21299a494b146859ca"
     },
     "sequence": 4294967295
   },
   {
     "txid": "b3ca9199969bd474ba0a609a1c01c3b6c2eb97885fc1dcad2cd1704be5ea0e06",
     "vout": 0,
     "scriptSig": {
       "asm": "30450221009dbeb64ddd4646e1118503c87feaa95c531b5178c6e543be782f6ecb05e8fbe602203945570f8dc56c145617f0283fa4032e0b7895a9cf2a81c7b65665b8ac608cb0[ALL] 026602a5dc59c30f485b2c457ac8e2f617e27b10a1d2ae76f3231f9b01dff08964",
       "hex": "4830450221009dbeb64ddd4646e1118503c87feaa95c531b5178c6e543be782f6ecb05e8fbe602203945570f8dc56c145617f0283fa4032e0b7895a9cf2a81c7b65665b8ac608cb00121026602a5dc59c30f485b2c457ac8e2f617e27b10a1d2ae76f3231f9b01dff08964"
     },
     "sequence": 4294967295
   },
   {
     "txid": "3e90870cb2b89307514498d010ee1a1f724ee578859b8f118902db08a45b717f",
     "vout": 1,
     "scriptSig": {
       "asm": "304502210095e300886ec4df78e39d6d0cf5e5e531ded8f42f00e5730c371d8951867dad5b02203c55f9403f6c2aac444213161a93a86661e7367d4007be74ffb3981387cc1c79[ALL] 023f0aadfeb71a4964c5087fec8b052c8236051dae838d4747543330c6b266ce6e",
       "hex": "48304502210095e300886ec4df78e39d6d0cf5e5e531ded8f42f00e5730c371d8951867dad5b02203c55f9403f6c2aac444213161a93a86661e7367d4007be74ffb3981387cc1c790121023f0aadfeb71a4964c5087fec8b052c8236051dae838d4747543330c6b266ce6e"
     },
     "sequence": 4294967295
   }
 ],
 "vout": [
   {
     "value": 0.01145045,
     "n": 0,
     "scriptPubKey": {
       "asm": "OP_DUP OP_HASH160 342ab422c9e3ef285efe9882ae54269ed9713dd6 OP_EQUALVERIFY OP_CHECKSIG",
       "hex": "76a914342ab422c9e3ef285efe9882ae54269ed9713dd688ac",
       "reqSigs": 1,
       "type": "pubkeyhash",
       "addresses": [
         "15kqJ5UinhstuG1KVCSJDagaUcFJLvhyNx"
       ]
     }
   },
   {
     "value": 0.005,
     "n": 1,
     "scriptPubKey": {
       "asm": "OP_DUP OP_HASH160 88d924f51033b74a895863a5fb57fd545529df7d OP_EQUALVERIFY OP_CHECKSIG",
       "hex": "76a91488d924f51033b74a895863a5fb57fd545529df7d88ac",
       "reqSigs": 1,
       "type": "pubkeyhash",
       "addresses": [
         "1DUb2YYbQA1jjaNYzVXLZ7ZioEhLXtbUru"
       ]
     }
   }
 ],
 "blockhash": "000000000000000000c93a1c73452d4221f8c88a1721072966c38d590b1b34af",
 "confirmations": 1,
 "time": 1502353841,
 "blocktime": 1502353841
}

完整的原始交易本身就是 field hex。我們要簽名的輸入vin在欄位中的一個數組中(該數組用方括號括起來[ ])。每個輸入都用大括號 ( { }) 括起來。

一般雜湊原像

散列原像是實際散列的數據。產生此原像的算法稱為sighashing 算法。每個輸入的 sighashing 算法是這樣的:接受交易並使所有scriptSigs 為空。然後對於我們正在簽名的輸入,放置正在使用的輸出的scriptPubKey,附加sighash 類型,並使用 sha256d 對整個內容進行雜湊處理。

簽署輸入

在這裡,我將進入細節。

我們要做的第一件事是讓交易的所有 scriptSigs 為空。最簡單的方法是獲取原始交易並為交易hexscriptSig的每個輸入查找 s 並將其替換為00。然後刪除你剛剛替換的東西之前的兩個字元

對於第一個輸入,scriptSig 是

483045022100f3c0f555cd39198caf77f6756256801fc57bcabe4892601b9def52259698f40a0220230262841bff151eb617f7d4cdda6bf06d6fa791230c152e47f68bcdd0e6f64a01210204b3506d8903ca601c97a4abab6548e91004c535a5a45e21299a494b146859ca

對於第二個輸入,scriptSig 是

4830450221009dbeb64ddd4646e1118503c87feaa95c531b5178c6e543be782f6ecb05e8fbe602203945570f8dc56c145617f0283fa4032e0b7895a9cf2a81c7b65665b8ac608cb00121026602a5dc59c30f485b2c457ac8e2f617e27b10a1d2ae76f3231f9b01dff08964

對於第三個輸入,scriptSig 是

48304502210095e300886ec4df78e39d6d0cf5e5e531ded8f42f00e5730c371d8951867dad5b02203c55f9403f6c2aac444213161a93a86661e7367d4007be74ffb3981387cc1c790121023f0aadfeb71a4964c5087fec8b052c8236051dae838d4747543330c6b266ce6e

執行查找和替換後,未簽名的交易

0100000003b0c03779c38ddabc044947b164adbcffde8e0ddb3678494f4e8b83f13b37629d0100000000ffffffff060eeae54b70d12caddcc15f8897ebc2b6c3011c9a600aba74d49b969991cab30000000000ffffffff7f715ba408db0289118f9b8578e54e721f1aee10d09844510793b8b20c87903e0100000000ffffffff02d5781100000000001976a914342ab422c9e3ef285efe9882ae54269ed9713dd688ac20a10700000000001976a91488d924f51033b74a895863a5fb57fd545529df7d88ac00000000

您還應該在心裡記下每個替代品的位置;稍後您將需要這些職位。

現在追加01000000到未簽名的交易,這樣我們現在有:

0100000003b0c03779c38ddabc044947b164adbcffde8e0ddb3678494f4e8b83f13b37629d0100000000ffffffff060eeae54b70d12caddcc15f8897ebc2b6c3011c9a600aba74d49b969991cab30000000000ffffffff7f715ba408db0289118f9b8578e54e721f1aee10d09844510793b8b20c87903e0100000000ffffffff02d5781100000000001976a914342ab422c9e3ef285efe9882ae54269ed9713dd688ac20a10700000000001976a91488d924f51033b74a895863a5fb57fd545529df7d88ac0000000001000000

將這個原始的、未修改的未簽名交易保存在某處,我們稍後會用到它。

第一個輸入

第一個輸入是vin交易 JSON 輸出數組中的第一個元素:

   {
     "txid": "9d62373bf1838b4e4f497836db0d8edeffbcad64b1474904bcda8dc37937c0b0",
     "vout": 1,
     "scriptSig": {
       "asm": "3045022100f3c0f555cd39198caf77f6756256801fc57bcabe4892601b9def52259698f40a0220230262841bff151eb617f7d4cdda6bf06d6fa791230c152e47f68bcdd0e6f64a[ALL] 0204b3506d8903ca601c97a4abab6548e91004c535a5a45e21299a494b146859ca",
       "hex": "483045022100f3c0f555cd39198caf77f6756256801fc57bcabe4892601b9def52259698f40a0220230262841bff151eb617f7d4cdda6bf06d6fa791230c152e47f68bcdd0e6f64a01210204b3506d8903ca601c97a4abab6548e91004c535a5a45e21299a494b146859ca"
     },
     "sequence": 4294967295
   },

現在我們需要從之前的交易輸出中獲取一些數據。因此,我們查找此輸入使用的 txid 9d62373bf1838b4e4f497836db0d8edeffbcad64b1474904bcda8dc37937c0b0,並獲取其 JSON 格式分解:

{
 "hex": "[removed for space]",
 "txid": "9d62373bf1838b4e4f497836db0d8edeffbcad64b1474904bcda8dc37937c0b0",
 "hash": "9d62373bf1838b4e4f497836db0d8edeffbcad64b1474904bcda8dc37937c0b0",
 "version": 1,
 "size": 373,
 "vsize": 373,
 "locktime": 0,
 "vin": [
   {
     "txid": "86efe44adc45a486c51a641cc83612159dc18f31a14da140a24fb4c5623e511a",
     "vout": 1,
     "scriptSig": {
       "asm": "3045022100cf76ad139adc38ae90fd14e6d29ff9bde62e7b3c3ef9880bc41098775100a1d502205a7dfb6aeacd9c58481f317334d5a6edaf2e734053555409550f6d463d9bf5f0[ALL] 030888863fcb4cdf5b7d33b40e613af35df8f39d576e7972238b0d396cd3fcc3f2",
       "hex": "483045022100cf76ad139adc38ae90fd14e6d29ff9bde62e7b3c3ef9880bc41098775100a1d502205a7dfb6aeacd9c58481f317334d5a6edaf2e734053555409550f6d463d9bf5f00121030888863fcb4cdf5b7d33b40e613af35df8f39d576e7972238b0d396cd3fcc3f2"
     },
     "sequence": 4294967295
   },
   {
     "txid": "897817de401d7245912e7add2da98e6d885a50104e147b785116b3a2a295f386",
     "vout": 0,
     "scriptSig": {
       "asm": "30440220633666024ceb08c4e6d076bc158a0dd013be14238afd8157f2b73b5a00aece6d02202a1da4a6def17cba4ae835c07af2b1ebff87bce0c56d21d6d2458cd234d766f6[ALL] 0395aa52bfe17fa8a06cc6b3216210c7ff3254a2095db322250bd2d9148e5b44cd",
       "hex": "4730440220633666024ceb08c4e6d076bc158a0dd013be14238afd8157f2b73b5a00aece6d02202a1da4a6def17cba4ae835c07af2b1ebff87bce0c56d21d6d2458cd234d766f601210395aa52bfe17fa8a06cc6b3216210c7ff3254a2095db322250bd2d9148e5b44cd"
     },
     "sequence": 4294967295
   }
 ],
 "vout": [
   {
     "value": 0.005,
     "n": 0,
     "scriptPubKey": {
       "asm": "OP_DUP OP_HASH160 52fbbe93faca2c57c6d7ccad877e0da4876ce0c8 OP_EQUALVERIFY OP_CHECKSIG",
       "hex": "76a91452fbbe93faca2c57c6d7ccad877e0da4876ce0c888ac",
       "reqSigs": 1,
       "type": "pubkeyhash",
       "addresses": [
         "18ZmzEy6fzx9afy2LjWhNjttoh2VBpRq84"
       ]
     }
   },
   {
     "value": 0.01001452,
     "n": 1,
     "scriptPubKey": {
       "asm": "OP_DUP OP_HASH160 2c418ec354a1ab688a656d86b16c02abe8f592e9 OP_EQUALVERIFY OP_CHECKSIG",
       "hex": "76a9142c418ec354a1ab688a656d86b16c02abe8f592e988ac",
       "reqSigs": 1,
       "type": "pubkeyhash",
       "addresses": [
         "1531GU6Ypf66HJ8c9ZyF2rwHyRWUxKSXhb"
       ]
     }
   }
 ],
 "blockhash": "00000000000000000083cb57936842737b6b9da889fed3d9beb9661fe9ad458e",
 "confirmations": 8,
 "time": 1502353082,
 "blocktime": 1502353082
}

此輸入的vout欄位指定我們需要上一個交易的輸出數組中索引 1 處的輸出。重要的是要記住數組元素索引從 0 開始。第一個元素的索引為(編號)0,第二個元素的索引為 1,依此類推。因此,輸出索引為 1,我們需要此的第二個輸出之前的交易,即:

{
 "value": 0.01001452,
 "n": 1,
 "scriptPubKey": {
   "asm": "OP_DUP OP_HASH160 2c418ec354a1ab688a656d86b16c02abe8f592e9 OP_EQUALVERIFY OP_CHECKSIG",
   "hex": "76a9142c418ec354a1ab688a656d86b16c02abe8f592e988ac",
   "reqSigs": 1,
   "type": "pubkeyhash",
   "addresses": [
     "1531GU6Ypf66HJ8c9ZyF2rwHyRWUxKSXhb"
   ]
 }
}

我們從這個輸出中唯一需要的是hexscriptPubKey,也就是

76a9142c418ec354a1ab688a656d86b16c02abe8f592e988ac

我們需要在數字前面加上hex以字節為單位的長度(字元串中字元數的一半)。數字必須是十六進制的,並且是19. 所以scriptPubKey我們將使用的是

1976a9142c418ec354a1ab688a656d86b16c02abe8f592e988ac

現在製作我們之前創建的未簽名交易的副本,我們不會修改原始交易,我們將需要稍後輸入。現在獲取複製的未簽名交易,並將游標移動到00我們替換第一個輸入的那個scriptSig00scriptPubKey我們剛剛修改的替換它。所以現在我們複製的未簽名交易看起來像

0100000003b0c03779c38ddabc044947b164adbcffde8e0ddb3678494f4e8b83f13b37629d010000001976a9142c418ec354a1ab688a656d86b16c02abe8f592e988acffffffff060eeae54b70d12caddcc15f8897ebc2b6c3011c9a600aba74d49b969991cab30000000000ffffffff7f715ba408db0289118f9b8578e54e721f1aee10d09844510793b8b20c87903e0100000000ffffffff02d5781100000000001976a914342ab422c9e3ef285efe9882ae54269ed9713dd688ac20a10700000000001976a91488d924f51033b74a895863a5fb57fd545529df7d88ac0000000001000000

這是我們的雜湊原像。現在我們需要將其雜湊為字節。我用來線上散列這些的工具是<http://www.fileformat.info/tool/hash.htm>。將雜湊原像複製並粘貼到Binary Hash標記為 的文本框中Hex bytes。點擊Hash並向下滾動。複製標籤旁邊的字元串SHA-256並將其粘貼到同一文本框中,然後Hash再次點擊。再次向下滾動,旁邊的字元串SHA-256是為我們交易的第一個輸入簽名的雜湊值。這個雜湊是:

0ca51b9a67de27aa35aba665cedea31025f8d40c85669953952b8dcde4242960

第二個輸入

第二個輸入是vin數組的第二個元素。用於此的 JSON 是:

   {
     "txid": "b3ca9199969bd474ba0a609a1c01c3b6c2eb97885fc1dcad2cd1704be5ea0e06",
     "vout": 0,
     "scriptSig": {
       "asm": "30450221009dbeb64ddd4646e1118503c87feaa95c531b5178c6e543be782f6ecb05e8fbe602203945570f8dc56c145617f0283fa4032e0b7895a9cf2a81c7b65665b8ac608cb0[ALL] 026602a5dc59c30f485b2c457ac8e2f617e27b10a1d2ae76f3231f9b01dff08964",
       "hex": "4830450221009dbeb64ddd4646e1118503c87feaa95c531b5178c6e543be782f6ecb05e8fbe602203945570f8dc56c145617f0283fa4032e0b7895a9cf2a81c7b65665b8ac608cb00121026602a5dc59c30f485b2c457ac8e2f617e27b10a1d2ae76f3231f9b01dff08964"
     },
     "sequence": 4294967295
   },

我們將需要前一個交易輸出的資訊,即交易索引 0 處的輸出b3ca9199969bd474ba0a609a1c01c3b6c2eb97885fc1dcad2cd1704be5ea0e06。該交易的 JSON 輸出為:

{
 "hex": "[removed for space]",
 "txid": "b3ca9199969bd474ba0a609a1c01c3b6c2eb97885fc1dcad2cd1704be5ea0e06",
 "hash": "b3ca9199969bd474ba0a609a1c01c3b6c2eb97885fc1dcad2cd1704be5ea0e06",
 "version": 1,
 "size": 404,
 "vsize": 404,
 "locktime": 0,
 "vin": [
   {
     "txid": "7195945cfe7d0d5b7e49b35dba8a844ee0ce1fd3b2afdc3e5bf0e3be409080ce",
     "vout": 1,
     "scriptSig": {
       "asm": "30440220234ec20a17fced74c34b94b2c34e77bb1cc824a34916661fa164f4dd47ce4992022078176fe355ccee3675684af148d340c6bc5c039d9e60630b71f789f72edce327[ALL] 026602a5dc59c30f485b2c457ac8e2f617e27b10a1d2ae76f3231f9b01dff08964",
       "hex": "4730440220234ec20a17fced74c34b94b2c34e77bb1cc824a34916661fa164f4dd47ce4992022078176fe355ccee3675684af148d340c6bc5c039d9e60630b71f789f72edce3270121026602a5dc59c30f485b2c457ac8e2f617e27b10a1d2ae76f3231f9b01dff08964"
     },
     "sequence": 4294967295
   },
   {
     "txid": "9dfbb913f9e80d99ec162adce1f61662e99c7a864eb38943135f41b56693a17a",
     "vout": 1,
     "scriptSig": {
       "asm": "3045022100d966ddb0d0ef2f5e09fe88f7a9629409e576f929b10cd33b11d5c2da0fd2bcae022014517f6b43b3c12da786bca5d96de39ab804cd134940815b40bfbf5df336880e[ALL] 026602a5dc59c30f485b2c457ac8e2f617e27b10a1d2ae76f3231f9b01dff08964",
       "hex": "483045022100d966ddb0d0ef2f5e09fe88f7a9629409e576f929b10cd33b11d5c2da0fd2bcae022014517f6b43b3c12da786bca5d96de39ab804cd134940815b40bfbf5df336880e0121026602a5dc59c30f485b2c457ac8e2f617e27b10a1d2ae76f3231f9b01dff08964"
     },
     "sequence": 4294967295
   }
 ],
 "vout": [
   {
     "value": 0.00439481,
     "n": 0,
     "scriptPubKey": {
       "asm": "OP_DUP OP_HASH160 58be4e12275e895c797c9bf7533452c5a41e4551 OP_EQUALVERIFY OP_CHECKSIG",
       "hex": "76a91458be4e12275e895c797c9bf7533452c5a41e455188ac",
       "reqSigs": 1,
       "type": "pubkeyhash",
       "addresses": [
         "196ESW77sq7iHzLfJub7KDgTGwvJMZwLs6"
       ]
     }
   },
   {
     "value": 0.00,
     "n": 1,
     "scriptPubKey": {
       "asm": "OP_RETURN 6f6d6e6900000000000000010000000011848ee0",
       "hex": "6a146f6d6e6900000000000000010000000011848ee0",
       "type": "nulldata"
     }
   },
   {
     "value": 0.0000273,
     "n": 2,
     "scriptPubKey": {
       "asm": "OP_DUP OP_HASH160 88d924f51033b74a895863a5fb57fd545529df7d OP_EQUALVERIFY OP_CHECKSIG",
       "hex": "76a91488d924f51033b74a895863a5fb57fd545529df7d88ac",
       "reqSigs": 1,
       "type": "pubkeyhash",
       "addresses": [
         "1DUb2YYbQA1jjaNYzVXLZ7ZioEhLXtbUru"
       ]
     }
   }
 ],
 "blockhash": "000000000000000000c0fd6a8fee9df17e59c7243c9fce359324ee0fffc70be3",
 "confirmations": 8,
 "time": 1502353358,
 "blocktime": 1502353358
}

我們想要vout數組中的第一個輸出,所以我們的輸出是:

   {
     "value": 0.00439481,
     "n": 0,
     "scriptPubKey": {
       "asm": "OP_DUP OP_HASH160 58be4e12275e895c797c9bf7533452c5a41e4551 OP_EQUALVERIFY OP_CHECKSIG",
       "hex": "76a91458be4e12275e895c797c9bf7533452c5a41e455188ac",
       "reqSigs": 1,
       "type": "pubkeyhash",
       "addresses": [
         "196ESW77sq7iHzLfJub7KDgTGwvJMZwLs6"
       ]
     }
   },

像第一個輸入一樣,我們只需要這個輸出hexscriptPubKeyof 加上它的長度,所以我們將下面作為我們的scriptPubKey

1976a91458be4e12275e895c797c9bf7533452c5a41e455188ac

現在我們獲取原始的、未修改的未簽名交易,並複制它。現在轉到我們刪除scriptSig第二個輸入的位置。將00我們放在那裡的 替換為scriptPubKey. 我們複製的未簽名交易應如下所示:

0100000003b0c03779c38ddabc044947b164adbcffde8e0ddb3678494f4e8b83f13b37629d0100000000ffffffff060eeae54b70d12caddcc15f8897ebc2b6c3011c9a600aba74d49b969991cab3000000001976a91458be4e12275e895c797c9bf7533452c5a41e455188acffffffff7f715ba408db0289118f9b8578e54e721f1aee10d09844510793b8b20c87903e0100000000ffffffff02d5781100000000001976a914342ab422c9e3ef285efe9882ae54269ed9713dd688ac20a10700000000001976a91488d924f51033b74a895863a5fb57fd545529df7d88ac0000000001000000

這是我們的雜湊原像。獲取雜湊原像並像我們對第一個輸入所做的那樣對其進行雜湊處理。你得到的雜湊應該是

46016caa2997dc453420a9af5090cd90c5109a93d525bbc3e9e12f8ec0112d58

第三個輸入

我們交易的第三個輸入是vin數組的第三個元素。這是它的 JSON 格式分解:

   {
     "txid": "3e90870cb2b89307514498d010ee1a1f724ee578859b8f118902db08a45b717f",
     "vout": 1,
     "scriptSig": {
       "asm": "304502210095e300886ec4df78e39d6d0cf5e5e531ded8f42f00e5730c371d8951867dad5b02203c55f9403f6c2aac444213161a93a86661e7367d4007be74ffb3981387cc1c79[ALL] 023f0aadfeb71a4964c5087fec8b052c8236051dae838d4747543330c6b266ce6e",
       "hex": "48304502210095e300886ec4df78e39d6d0cf5e5e531ded8f42f00e5730c371d8951867dad5b02203c55f9403f6c2aac444213161a93a86661e7367d4007be74ffb3981387cc1c790121023f0aadfeb71a4964c5087fec8b052c8236051dae838d4747543330c6b266ce6e"
     },
     "sequence": 4294967295
   }

現在我們需要索引 1 處的輸出3e90870cb2b89307514498d010ee1a1f724ee578859b8f118902db08a45b717f。這是 的第二個輸出3e90870cb2b89307514498d010ee1a1f724ee578859b8f118902db08a45b717f。該交易的 JSON 格式分解是:

{
 "hex": "[removed for space]",
 "txid": "3e90870cb2b89307514498d010ee1a1f724ee578859b8f118902db08a45b717f",
 "hash": "3e90870cb2b89307514498d010ee1a1f724ee578859b8f118902db08a45b717f",
 "version": 1,
 "size": 257,
 "vsize": 257,
 "locktime": 0,
 "vin": [
   {
     "txid": "1037821442fe684bd87ad790b4f9fd6a07c3f56ac85478e98e6b06c665eda281",
     "vout": 1,
     "scriptSig": {
       "asm": "3045022100ec9ab3692830627c4f76687d9f2e0fde9fba6f11b6a6025cc7f3c3708be8d8e1022076769507eeb04e867e98e543d54ec8a3c91e17eb4560ff7ab1dd2f40ca7b3d3d[ALL] 023f0aadfeb71a4964c5087fec8b052c8236051dae838d4747543330c6b266ce6e",
       "hex": "483045022100ec9ab3692830627c4f76687d9f2e0fde9fba6f11b6a6025cc7f3c3708be8d8e1022076769507eeb04e867e98e543d54ec8a3c91e17eb4560ff7ab1dd2f40ca7b3d3d0121023f0aadfeb71a4964c5087fec8b052c8236051dae838d4747543330c6b266ce6e"
     },
     "sequence": 4294967295
   }
 ],
 "vout": [
   {
     "value": 0.00,
     "n": 0,
     "scriptPubKey": {
       "asm": "OP_RETURN 6f6d6e6900000000000000030000000000004066",
       "hex": "6a146f6d6e6900000000000000030000000000004066",
       "type": "nulldata"
     }
   },
   {
     "value": 0.00458772,
     "n": 1,
     "scriptPubKey": {
       "asm": "OP_DUP OP_HASH160 a4c3d2d77c214b4e212cdcc0331d21b2fbd6f328 OP_EQUALVERIFY OP_CHECKSIG",
       "hex": "76a914a4c3d2d77c214b4e212cdcc0331d21b2fbd6f32888ac",
       "reqSigs": 1,
       "type": "pubkeyhash",
       "addresses": [
         "1G2CQXJdzzyyUaStUGcsaKLnN5GjD8TeQe"
       ]
     }
   },
   {
     "value": 0.0000273,
     "n": 2,
     "scriptPubKey": {
       "asm": "OP_DUP OP_HASH160 88d924f51033b74a895863a5fb57fd545529df7d OP_EQUALVERIFY OP_CHECKSIG",
       "hex": "76a91488d924f51033b74a895863a5fb57fd545529df7d88ac",
       "reqSigs": 1,
       "type": "pubkeyhash",
       "addresses": [
         "1DUb2YYbQA1jjaNYzVXLZ7ZioEhLXtbUru"
       ]
     }
   }
 ],
 "blockhash": "000000000000000000c0fd6a8fee9df17e59c7243c9fce359324ee0fffc70be3",
 "confirmations": 9,
 "time": 1502353358,
 "blocktime": 1502353358
}

該交易的第二個輸出是:

   {
     "value": 0.00458772,
     "n": 1,
     "scriptPubKey": {
       "asm": "OP_DUP OP_HASH160 a4c3d2d77c214b4e212cdcc0331d21b2fbd6f328 OP_EQUALVERIFY OP_CHECKSIG",
       "hex": "76a914a4c3d2d77c214b4e212cdcc0331d21b2fbd6f32888ac",
       "reqSigs": 1,
       "type": "pubkeyhash",
       "addresses": [
         "1G2CQXJdzzyyUaStUGcsaKLnN5GjD8TeQe"
       ]
     }
   },

像前面的輸入一樣,我們需要 的hex加上scriptPubKey它的長度,所以我們scriptPubKey

1976a914a4c3d2d77c214b4e212cdcc0331d21b2fbd6f32888ac

現在複製原始的、未修改的未簽名交易。轉到您scriptSig將此輸入的 替換為的位置00。將其替換00scriptPubKey. 所以現在我們有一個複制的未簽名交易,如下所示:

0100000003b0c03779c38ddabc044947b164adbcffde8e0ddb3678494f4e8b83f13b37629d0100000000ffffffff060eeae54b70d12caddcc15f8897ebc2b6c3011c9a600aba74d49b969991cab30000000000ffffffff7f715ba408db0289118f9b8578e54e721f1aee10d09844510793b8b20c87903e010000001976a914a4c3d2d77c214b4e212cdcc0331d21b2fbd6f32888acffffffff02d5781100000000001976a914342ab422c9e3ef285efe9882ae54269ed9713dd688ac20a10700000000001976a91488d924f51033b74a895863a5fb57fd545529df7d88ac0000000001000000

像對輸入 1 和 2 一樣對原像進行散列。你應該得到的散列是

b85c3c3b91362e3c8047120152d5d9640a850e1db6d867393ada2e13a6ec079a

結論

為每個輸入簽名的雜湊值如下:

  • 第一個輸入:0ca51b9a67de27aa35aba665cedea31025f8d40c85669953952b8dcde4242960
  • 第二個輸入:46016caa2997dc453420a9af5090cd90c5109a93d525bbc3e9e12f8ec0112d58
  • 第三個輸入:b85c3c3b91362e3c8047120152d5d9640a850e1db6d867393ada2e13a6ec079a

我通過修改後的比特幣核心版本執行了這兩項交易,這讓我感到嘆為觀止。

對於 d1cdb8c3828ee74c22677e705539937d039e6acef19e5f2ac0a2779846e4b6c1,每個輸入的 sighashes 依次為:

36537e9335b00b9627dd067515b85b2dddb3334e946677f5ca01cf07a8de4945
3b10e1e264162eb8fe3011196a756bfea8798775ee5e6c70a107282f74bfd599
fe269a8d6cc3cd801d5c0e0e41c44a32f6fecc0bb7e4909a905e85da43104cf0
166223356d627392d52cd7def6c45a9b7a18bb6cbc628cc1db0db7a1a6c51b19
b42809cd2075ad304fae2205648384b6ac8558dfb17bafc5e2de838af3f5e3bb
d311ba5115ffdce2c73a0e5007b28baa08885cad1a02e719938469fa0e497ccb
43d0509b98408323f6b7ea4ca07d66ad109c647cb9eee413f88464c400371733
6e22e0963dd860525602ad69ab0c9002054588d05c057f51349414ba11f185ab
07f08a0b60a5ebbbe4220e21d912af8c9cbe20f85cfae1cb21171fed8a4b9870
901832f68d7e10e72b57cc029ef161a4044c6fa2633cccf792eccfe34886f075
c5feb7830c2b2f7bd4a604ea3e7497fc8e3e122955c0bf8bd90b7683dc05eee6
f2e29915224de6eec85d7c5fb21e6333dd289b0bb7d07094f0846ca15cab62a1
6ae401edb4c25f7083e59cb0d6145c65d92e749ef93784214aef5e0eba4b38de
2aefa9852164cf75f7a89fd8b0466bb0f49ef2a3bb49243e951611deeafe556d
90698f761a0c6af1de93990e853cf05d760f2c4afce7bf8dc3fa52e8e5ccfa55
f2637c7489c901ce23e133ed252c8084131b8fbeeb604001fda3b2219ed30adc
8430eb0e3576e3a5e376083e7be45725c8a8f6ca3a5d39d97ab13298f82309cf
8da03f6b4f06fb5da308adbad2678f7c6b6ca1bd15bff9accf5dcb404084b214
a2c96c50371204843d9e97848a4afee884f26f3965940db1092bf860736edc11
7f341abb178bac950acd389ce9aa22c8b7bc9982402002f31a5fdbe10db2acff
a6c81aba4d4e08d19f12d02b2651622e5a288f9fac76cb57b930d990a5c18014
d2363eb97fa94ade230a725576a6af91df6c7da516c568195b54d6e3ab7ac97e
570ab2dbb4b4054162617c8c7f95f747a944f39959dc461ce5efce715cac782e
38f638c00eb4f044568ee4d116ebfa9f355cf81ee77237d909d9b0b519edf736
4861a778ad55393bc670e2b73461eedd52d7370b5f86dca2ff319be44bfcb9ea
ea75ff70f64e2a9b2f184c2408c7e28921ddd3c6952f99d193c56134d714839e
ddf948089894409dab74badfcd64055c79b4ba6511b1863eb42bad35bf22d82c
68d4fc82898fae0b41e26affff0fbf37d8c01ecdd416dad299d4fd6837bdddc5
6d5239c61aec375fcf3a13f6ff36660460ebbe49e1372b99cf0ca001381170c8
75bed4705d44d763b9ba59c4a843ba88cc2c58eca1f1c80a683cb02a45052b98
86a6c9a2f5da74825d930d1bf818a9d8bd3f871bc2cb0d71da27940d1d2130cc
9d9537ebb060d5c1bc6c36fd0695833085d753b2860ee3ba9ff65f977b5ab226
f397fea726ddc5a938544283e1dd265aac5ebb8b6856543df48e285f009b4375
120447a585f30f7bb9411f7888b6fcd96862d1cae34ddaadda6291bc46fa36ed
3760ddfd61b0e5f8902195e2b7285da42400446dfd4fcec1ea979ea78c4b32de
271a878980c9087f7004ed21330cd101dd19706513a629eea4cebae9e5e80a56
33c17e7530d3c184acb222165b49155c2a8283032a7ee96ede30546ee571966a
81de851b46bc42b419cdc9905609cc9a4fda206424cbba12626555bf788ba31a
ee864623021df5a2369174f3b8c90f20b6f3021d33f8c9a1ea75698168005626

對於 ff8766ec873ff55cc0ac17dee7b379a4efa2a5c83dabdd9a30287c7761ad55d5,嘆息是:

0ca51b9a67de27aa35aba665cedea31025f8d40c85669953952b8dcde4242960
46016caa2997dc453420a9af5090cd90c5109a93d525bbc3e9e12f8ec0112d58
b85c3c3b91362e3c8047120152d5d9640a850e1db6d867393ada2e13a6ec079a

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