Transactions
為什麼解碼的區塊數據與 coinbase 交易輸入不匹配?
我正在查看高度為680175的特定塊。
通過
bitcoin-cli getblock 00000000000000000004dbd66fa71fdcd62658bf8c8e2e153521257ad5858c71 0
我獲得了序列化的十六進制編碼的塊數據。根據序列化塊部分,txn_count
從字節 #81 開始。按照CompactSize Unsigned Integers的描述,我得到:In [115]: int.from_bytes(byte_arr[80:81], "little", signed=False) Out[115]: 253 In [116]: tnx_count = byte_arr[81:83] ...: tnx_count = int.from_bytes(tnx_count, "little", signed=False) In [117]: tnx_count Out[117]: 1702
確實有 1702 筆交易可以通過
./bitcoin-cli getblock 00000000000000000004dbd66fa71fdcd62658bf8c8e2e153521257ad5858c71 2
屬性進行驗證nTx
。現在我知道其餘的塊數據是交易的一部分。根據原始事務格式部分,前 4 個字節是版本:
In [118]: tnx_part = byte_arr[83:] In [119]: version = tnx_part[:4] In [120]: int.from_bytes(version, "little", signed=False) Out[120]: 1
這似乎也是正確的。因此,下一個字節確定tx_in count的數量,但我得到 0 這是錯誤的。並且 coinbase 交易的輸入不是以 32 字節的 null 開頭:
In [121]: int.from_bytes(data[4:5], "little", signed=False) Out[121]: 0 In [122]: data[4:10] Out[122]: bytearray(b'\x00\x01\x01\x00\x00\x00')
我錯過了什麼嗎?coinbase 交易的輸入似乎與描述不符。
隔離見證改變了交易格式。這種新格式在BIP 144中指定。這種新格式實際上是對原始交易格式的修改。這些變化只是對它的補充。
具體來說,您缺少的是緊跟版本號的欄位是單個 0 字節(稱為標記字節),而不是輸入計數。這樣做是為了使事務看起來好像沒有遺留事務解析器的輸入。在這個標記字節之後是一個標誌字節,它目前是單個 1 字節。然後像以前一樣獲得輸入計數、輸入、輸出計數和輸出。最後一個變化是在輸出之後,而不是鎖定時間,有多個數組包含輸入的見證數據。最後,鎖定時間像以前一樣結束事務。