Bitcoin-Core
為什麼我得到不同的merkleroot?
我正在使用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(和其他雜湊)與雜湊函式的輸出順序相同。但是為了向使用者顯示,它們總是被字節交換。