需要逐步兌換原始交易範例
具體來說,我正在尋找使用實際交易的發送比特幣的分步範例交易(幾年前,如何兌換基本 Txn,在概述發送原始 txn 的大多數步驟方面做得很好,但確實不使用真實的 TxID)。
我玩過 Python pybitcointools 庫、SX 庫和來自 Bitcoin Core 客戶端(Bitcoin-QT、Bitcoin-cli、Bitcoin daemon)的 JSON 輸出,但還沒有找到使用原始交易輸出的實際分步指南(單輸入/單輸出比特幣 txn,即不是多重簽名)。
希望賞金會帶來一步一步的範例交易(使用發送地址的私鑰)將帶來一個答案,說明它是如何完成的,特別是:
- ScriptPubKey 元素如何適合原始 txn
- ScriptSig 元素如何適應原始 txn
- 如何簽署 txn(使用 DER 編碼)。
編輯:我認為最好的資源是Ken Shirriff 的Bitcoins the hard way:使用原始比特幣協議,但同樣,沒有一個單一的線上資源可以回答我的問題,而無需略過 scriptPubKey、簽名等領域。
當我啟動賞金時,如果您能回答這個問題,請參考此 Tx,因為它可以作為實際範例(即,如果有興趣,我將提供 1 美元的 BTC 和 1From/1MBngSqZbMydscpzSoehjP8kznMaHAzh9y 的私鑰)
編輯 2:RoyalFork 部落格:解構 Txns為互動式Txn 創建提供了令人難以置信的好參考
分步說明:
我們開始創建一個我們散列和簽名的新交易。
- 添加四字節版本欄位:
01000000
- 指定輸入數量的一字節 varint:
01
- 我們要從中贖回輸出的交易的 32 字節雜湊(逆序):
be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
- 四字節欄位,表示我們要使用上述雜湊從交易中贖回的輸出索引(從零開始計數):
00000000
- 現在是 scriptSig。出於簽署交易的目的,這裡臨時填充了我們要兌換的輸出的 scriptPubKey。首先,我們編寫一個單字節的 varint,它表示 scriptSig 的長度(0x19 = 25 字節):
19
- 然後我們編寫實際的 scriptSig(這是我們要兌換的輸出的 scriptPubKey):(查看<https://blockchain.info/tx/96534da2f213367a6d589f18d7d6d1689748cd911f8c33a9aee754a80de166be?show_adv=true>
76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac
上的底線行)- 然後我們寫一個四字節的欄位來表示這個序列。目前始終設置為 0xffffffff:
ffffffff
- 接下來是一個單字節的 varint,其中包含我們新交易中的輸出數量。在本例中,我們將其設置為 1:
01
- 然後,我們編寫一個 8 字節欄位(64 位整數,小端序),其中包含我們要從指定輸出中贖回的金額。我將其設置為輸出中可用的總金額減去 0.0001 BTC (128307 - 10000) 的費用:
23ce010000000000
- 然後我們開始編寫交易的輸出。我們從一個單字節的 varint 開始,表示輸出腳本的長度(0x19 或 25 字節):
19
- 然後是實際的輸出腳本:(
76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac
這是將資金轉回地址 1FromKBPAS8MWsk1Yv1Yiu8rJbjfVioBHc )- 然後我們寫入四字節的“鎖定時間”欄位:
00000000
- 最後,我們編寫了一個四字節的“雜湊碼類型”(在我們的例子中為 1):
01000000
好的,結果是
01000000 01 be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396 00000000 19 76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac ffffffff 01 23ce010000000000 19 76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac 00000000 01000000
- 現在我們對整個結構進行雙重 SHA256 雜湊處理,得到雜湊
1cde0239b55717cca8003104abc2ec2673d4f6fabea0b74351940e382e88486f
- 現在我們應該創建ECDSA簽名……
1MBngSqZbMydscpzSoehjP8kznMaHAzh9y
是*“mrbubbymrbubbymrbubby!”的腦錢包!,它恰好對以“MB”*開頭的地址進行編碼(使連結 2 變得非常容易;有關片語來源,請參見下面的 @WizardOfAussie 評論)。WIF中的私鑰:5HvofFG7K1e2aeWESm5pbCzRHtCSiZNbfLYXBvxyA57DhKHV4U3
在十六進制中,私鑰是
0ecd20654c2e2be708495853e8da35c664247040c00bd10b9b13e5e86e6a808d
. 每個加密庫中都有一個符號(密鑰,摘要)方法。它將返回一個字節數組。該數組將不超過 72 個字節,並以十六進制程式碼 30 開頭。讓我們假設簽名是3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e
對於此簽名,我們附加一個字節的雜湊碼類型:01
。1MBngSqZbMydscpzSoehjP8kznMaHAzh9y 的公鑰是:042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
- 我們通過連接構造最終的 scriptSig: <包含 DER 編碼簽名長度加上一字節雜湊碼類型的一字節腳本 OPCODE>|< 實際 DER 編碼簽名加上一字節雜湊碼類型>| <包含公鑰長度的一字節腳本OPCODE>|<實際公鑰>
scriptSig 將是
49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01 41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9
第一行是’push signature concatenated with 01’,第二行是’push pubkey’。scriptSig 的長度為 140 字節(十六進制的 0x8c)
- 然後,我們將步驟 5 中的單字節 varint 長度欄位替換為步驟 16 中的數據長度。長度為 140 字節,或 0x8C 字節:
8c
- 我們將實際的 scriptSig 替換為第 16 步中建構的資料結構。
- 我們通過刪除我們在第 13 步中添加的四字節雜湊碼類型來結束,我們最終得到以下字節流,這是最終交易:
01000000 01 00000000 be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396 8C 49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01 41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9 FFFFFFFF 01 23ce010000000000 19 76 A9 14 88 a2fd2e039a86dbcf0e1a664729e09e8007f89510交流00000000