Bitcoin-Core

為什麼我得到不同的merkleroot?

  • November 14, 2019

我正在使用Mastering Bitcoin book 中的merkle.cpp程式碼(它使用libbitcoin庫來實現一些輔助功能)。

我試圖為包含 4 個交易的比特幣塊 #100000重新創建Merkleroot雜湊:

"tx": [
   "8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87",
   "fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4",
   "6359f0868171b1d194cbee1af2f16ea598ae8fad666d9b012c8ed2b79a236ec4",
   "e9a66845e05d5abc0ad04ec80f774a7e585c6e8db975962d069a522137b80c1d"
 ].

因此,我main()通過添加所有四個 txs 的雜湊來修改函式:

int main()
{
   // Replace these hashes with ones from a block to reproduce the same merkle root.
   bc::hash_list tx_hashes{{
       bc::hash_literal("8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87"),
       bc::hash_literal("fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4"),
       bc::hash_literal("6359f0868171b1d194cbee1af2f16ea598ae8fad666d9b012c8ed2b79a236ec4"),
       bc::hash_literal("e9a66845e05d5abc0ad04ec80f774a7e585c6e8db975962d069a522137b80c1d"),

   }};
   const bc::hash_digest merkle_root = create_merkle(tx_hashes);
   std::cout << "Result: " << bc::encode_base16(merkle_root) << std::endl;
   return 0;
}

編譯並執行它給了我:

Current merkle hash list:
 15b88c5107195bf09eb9da89b83d95b3d070079a3c5c5d3d17d0dcd873fbdacc
 49aef42d78e3e9999c9e6ec9e1dddd6cb880bf3b076a03be1318ca789089308e

Current merkle hash list:
 6657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f3

Result: 6657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f3

而實際的 merkleroot 則不同:

"merkleroot": "f3e94742aca4b5ef85488dc37c06c3282295ffec960994b2c0d5ac2a25a95766",

我做錯了什麼?

你實際上確實得到了相同的雜湊值。只是每個比特幣軟體都顯示雜湊字節交換。如果仔細觀察,您會發現結果的第一個字節 ( 66) 與顯示的 merkleroot 的最後一個字節匹配。第二個字節匹配倒數第二個字節,依此類推。

在內部,merkleroot(和其他雜湊)與雜湊函式的輸出順序相同。但是為了向使用者顯示,它們總是被字節交換。

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