如何判斷我需要對前一個 tx 的哪一部分進行雜湊來簽署舊的給定 tx?
我最近被教導(在這裡)如何創建散列來為現有交易的給定“輸入腳本”簽名。然後,我試圖測試我的能力,並找到了一個難以理解的交易。好吧,我確實找到了它,它證明了我的理解嚴重不足以處理具有多個輸入腳本事務和/或具有多個腳本的先前事務的任何事情。
我發現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 為空。最簡單的方法是獲取原始交易並為交易
hex
中scriptSig
的每個輸入查找 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" ] } }
我們從這個輸出中唯一需要的是
hex
的scriptPubKey
,也就是76a9142c418ec354a1ab688a656d86b16c02abe8f592e988ac
我們需要在數字前面加上
hex
以字節為單位的長度(字元串中字元數的一半)。數字必須是十六進制的,並且是19
. 所以scriptPubKey
我們將使用的是1976a9142c418ec354a1ab688a656d86b16c02abe8f592e988ac
現在製作我們之前創建的未簽名交易的副本,我們不會修改原始交易,我們將需要稍後輸入。現在獲取複製的未簽名交易,並將游標移動到
00
我們替換第一個輸入的那個scriptSig
。00
用scriptPubKey
我們剛剛修改的替換它。所以現在我們複製的未簽名交易看起來像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" ] } },
像第一個輸入一樣,我們只需要這個輸出
hex
的scriptPubKey
of 加上它的長度,所以我們將下面作為我們的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
。將其替換00
為scriptPubKey
. 所以現在我們有一個複制的未簽名交易,如下所示: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