Transactions

需要逐步兌換原始交易範例

  • February 19, 2017

具體來說,我正在尋找使用實際交易的發送比特幣的分步範例交易(幾年前,如何兌換基本 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 創建提供了令人難以置信的好參考

分步說明:

我們開始創建一個我們散列和簽名的新交易。

  1. 添加四字節版本欄位:01000000
  2. 指定輸入數量的一字節 varint:01
  3. 我們要從中贖回輸出的交易的 32 字節雜湊(逆序):be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396
  4. 四字節欄位,表示我們要使用上述雜湊從交易中贖回的輸出索引(從零開始計數):00000000
  5. 現在是 scriptSig。出於簽署交易的目的,這裡臨時填充了我們要兌換的輸出的 scriptPubKey。首先,我們編寫一個單字節的 varint,它表示 scriptSig 的長度(0x19 = 25 字節):19
  6. 然後我們編寫實際的 scriptSig(這是我們要兌換的輸出的 scriptPubKey):(查看<https://blockchain.info/tx/96534da2f213367a6d589f18d7d6d1689748cd911f8c33a9aee754a80de166be?show_adv=true>76 a9 14 dd6cce9f255a8cc17bda8ba0373df8e861cb866e 88 ac上的底線行)
  7. 然後我們寫一個四字節的欄位來表示這個序列。目前始終設置為 0xffffffff:ffffffff
  8. 接下來是一個單字節的 varint,其中包含我們新交易中的輸出數量。在本例中,我們將其設置為 1:01
  9. 然後,我們編寫一個 8 字節欄位(64 位整數,小端序),其中包含我們要從指定輸出中贖回的金額。我將其設置為輸出中可用的總金額減去 0.0001 BTC (128307 - 10000) 的費用:23ce010000000000
  10. 然後我們開始編寫交易的輸出。我們從一個單字節的 varint 開始,表示輸出腳本的長度(0x19 或 25 字節):19
  11. 然後是實際的輸出腳本:(76 a9 14 a2fd2e039a86dbcf0e1a664729e09e8007f89510 88 ac這是將資金轉回地址 1FromKBPAS8MWsk1Yv1Yiu8rJbjfVioBHc )
  12. 然後我們寫入四字節的“鎖定時間”欄位:00000000
  13. 最後,我們編寫了一個四字節的“雜湊碼類型”(在我們的例子中為 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
  1. 現在我們對整個結構進行雙重 SHA256 雜湊處理,得到雜湊1cde0239b55717cca8003104abc2ec2673d4f6fabea0b74351940e382e88486f
  2. 現在我們應該創建ECDSA簽名…… 1MBngSqZbMydscpzSoehjP8kznMaHAzh9y是*“mrbubbymrbubbymrbubby!”的腦錢包!,它恰好對以“MB”*開頭的地址進行編碼(使連結 2 變得非常容易;有關片語來源,請參見下面的 @WizardOfAussie 評論)。WIF中的私鑰:5HvofFG7K1e2aeWESm5pbCzRHtCSiZNbfLYXBvxyA57DhKHV4U3

在十六進制中,私鑰是0ecd20654c2e2be708495853e8da35c664247040c00bd10b9b13e5e86e6a808d. 每個加密庫中都有一個符號(密鑰,摘要)方法。它將返回一個字節數組。該數組將不超過 72 個字節,並以十六進制程式碼 30 開頭。讓我們假設簽名是3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 對於此簽名,我們附加一個字節的雜湊碼類型:01。1MBngSqZbMydscpzSoehjP8kznMaHAzh9y 的公鑰是:042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9

  1. 我們通過連接構造最終的 scriptSig: <包含 DER 編碼簽名長度加上一字節雜湊碼類型的一字節腳本 OPCODE>|< 實際 DER 編碼簽名加上一字節雜湊碼類型>| <包含公鑰長度的一字節腳本OPCODE>|<實際公鑰>

scriptSig 將是

49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01
41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9

第一行是’push signature concatenated with 01’,第二行是’push pubkey’。scriptSig 的長度為 140 字節(十六進制的 0x8c)

  1. 然後,我們將步驟 5 中的單字節 varint 長度欄位替換為步驟 16 中的數據長度。長度為 140 字節,或 0x8C 字節:8c
  2. 我們將實際的 scriptSig 替換為第 16 步中建構的資料結構。
  3. 我們通過刪除我們在第 13 步中添加的四字節雜湊碼類型來結束,我們最終得到以下字節流,這是最終交易:

01000000 01 00000000 be66e10da854e7aea9338c1f91cd489768d1d6d7189f586d7a3613f2a24d5396 8C 49 3046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a715cf7c938e238afde90207e9d103dd9018e12cb7180e 01 41 042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9 FFFFFFFF 01 23ce010000000000 19 76 A9 14 88 a2fd2e039a86dbcf0e1a664729e09e8007f89510交流00000000

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