Transactions

為什麼解碼的區塊數據與 coinbase 交易輸入不匹配?

  • April 24, 2021

我正在查看高度為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 字節。然後像以前一樣獲得輸入計數、輸入、輸出計數和輸出。最後一個變化是在輸出之後,而不是鎖定時間,有多個數組包含輸入的見證數據。最後,鎖定時間像以前一樣結束事務。

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