Bitcoin-Core

反序列化 merkleblock 消息

  • February 14, 2018

過去幾天我一直在努力反序列化 merkleblock 消息。我正在編寫一個使用比特幣 rpc 客戶端呼叫 gettxoutproof 的 go 應用程序,但只需要給定交易的 merkle 證明(散列 merkle 根所需的 tx 雜湊數組)(想要驗證乙太坊智能合約中的交易) .

因此,我查看了 merkleblock.h 中如何定義序列化,這看起來非常簡單。我遇到的問題是弄清楚 CDataStream 如何序列化 CMerkleBlock 對象,並在十六進製字元串中找到事務雜湊。

範例:這是我正在查看的塊:Testnet Block

它只包含一個 tx:8148740e33df53073f55089f195c327f40e2a9c374dcc05643c60671243cc4a8

當我執行 gettxoutproof 命令時,我得到以下輸出:

0000002024ea1b7676f6ae9f2a3b639ec43e15c509a661d33d123deb3d00000000000000a8c43c247106c64356c0dc74c3a9e2407f325c199f08553f0753df330e744881f4d6715affff001d00cecafd0100000001a8c43c247106c64356c0dc74c3a9e2407f325c199f08553f0753df330e7448810101

最初,我希望在該十六進製字元串中的某處找到 tx 雜湊,因為它是塊中唯一的 tx 並且必須包含在內,但找不到它的位置。由於文件說 gettxoutproof 返回一個序列化的十六進制編碼字元串,我認為可能 tx 雜湊已被十六進制編碼,但事實並非如此。我試過用其他塊來解決這個問題,例如包含 2 個交易但沒有運氣。我查看了 CDataStream 如何序列化數據但無法理解。

如果有人可以幫助我,將非常高興!

似乎交易雜湊和默克爾根都在 gettxoutproof 中序列化,但按字節反轉。正如比特幣開發者參考中所述,

比特幣核心 RPC 接受並返回計算的 SHA-256 雜湊值的字節反轉。

所以關於你的例子,雜湊(按字節)

81 48 74 0e ... 24 3c c4 a8

在 gettxoutproof 中反向包含兩次:

a8 c4 3c 24 ... 0e 74 48 81

當然,在這種特殊情況下,它包含兩次,因為只有一個交易,默克爾根等於相應的交易雜湊。

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