Transactions

塊以什麼格式儲存交易數據?

  • May 8, 2022

它是否按字面意思儲存原始交易數據(請原諒格式不准確):

0x24134i59435ej3…9 發送 0x9wri03vw3sdfsd…i 26.00000023423 比特幣。

還是儲存方式不同?

比特幣核心以網路格式儲存區塊和​​這些區塊中的交易的數據。


這是一個例子

塊 170 包含除了 coinbase 交易之外的第一筆交易。其中,中本聰支付了 Hal Finney 10 BTC。這是第一次一個人用比特幣支付另一個人。

由於數據是二進制的,我們必須使用它的可列印表示以使其在此網頁中可見。我選擇十六進制:

0100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25
857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f
4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd1290
9d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b0000000043
4104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa2
8414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6c
d84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a
382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b
64f9d4c03f999b8643f656b412a3ac00000000

幾個星期前,我認為用手算出這意味著什麼會很好。這是我在失去興趣之前走了多遠:

十六進制數據意義
01000000版本 1(小端 uint32)
01交易輸入的數量(varint)
第一次輸入
c997a5e56e104102 fa209c6a852dd906 60a20b2d9c352423 edce25857fcd3704引用交易的雜湊(32 個八位字節)
00000000引用事務中的輸出索引 (uint32)
48簽名腳本的長度(varint)。十六進制的 48 是十進制的 72。
47304402204e45e1 6932b8af514961a1 d3a1a25fdf3f4f77 32e9d624c6c61548 ab5fb8cd41022018 1522ec8eca07de48 60a4acdd12909d83 1cc56cbbac462208 2221a8768d1d0901簽名腳本(72 個八位字節)
ffffffff順序
02輸出數量
第一個輸出
00ca9a3b00000000金額 1000000000 satoshi 即 10 BTC (int64)
43腳本長度
4104ae1a62fe09c5 f51b13905f07f06b 99a2f7159b2225f3 74cd378d71302fa2 8414e7aab37397f5 54a7df5f142c21c1 b7303b8a0626f1ba ded5c72a704f7e6c d84cac腳本
第二個輸出
00286bee00000000金額 40 比特幣。這是變化。
43腳本長度
410411db93e1dcdb 8a016b49840f8c53 bc1eb68a382e97b1 482ecad7b148a690 9a5cb2e0eaddfb84 ccf9744464f82e16 0bfa9b8b64f9d4c0 3f999b8643f656b4 12a3ac腳本
00000000鎖定時間 = 解鎖(4 個八位字節)

我可能應該解碼輸出上的鎖定腳本。41是 41個 16字節的 OP_PUSHDATA。然後我們將 41個 16字節的數據壓入堆棧,最後ac是 OP_CHECKSIG,它需要堆棧上的簽名和公鑰,它會從堆棧中取出並檢查。這個腳本只有在花錢時才會真正執行。

您可以通過將它們按字節(一次兩個十六進制數字)反轉為大端表示並在程序員模式下將其輸入 Windows Calculator 來檢查小端數字 - 這是第二個輸出量(00286bee00000000LE -> 00000000ee6b2800BE):

計算器

這就是我們知道的00286bee00000000意思是 40000000000 Satoshi。這是 40 比特幣。

這種早期交易是一種稱為支付公鑰(P2PK)的早期類型。它是最簡單的類型。現在使用的流行類型更複雜。

當然,您可以使用大多數區塊鏈瀏覽器輕鬆獲得此交易的 JSON 表示。我發現這有點令人不滿意,因為它們經常引入一些人為元素(例如腳本的“十六進制”和“asm”表示),因此您永遠無法確定 JSON 項與基礎數據部分的對應程度。因此,上述解碼嘗試。


相關問題

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