首页 > 解决方案 > 从 2 笔交易计算默克尔根

问题描述

我想证明比特币的默克尔根的计算,但我无法获得与区块浏览器上显示的相同的根。

来自区块浏览器的数据 ( https://blockchair.com/bitcoin/block/80000 )

tx1 hash = "c06fbab289f723c6261d3030ddb6be121f7d2508d77862bb1e484f5cd7f92b25"
tx2 hash = "5a4ebf66822b0b2d56bd9dc64ece0bc38ee7844a23ff1d7320a88c5fdb2ad3e2"
Merkle Root = "8fb300e3fdb6f30a4c67233b997f99fdd518b968b9a3fd65857bfe78b2600719"

现在我要做的是,首先我将 TX1 和 TX2 的顺序颠倒成为

tx1 hash reverse = "252BF9D75C4F481EBB6278D708257D1F12BEB6DD30301D26C623F789B2BA6FC0"
tx2 hash reverse = "E2D32ADB5F8CA820731DFF234A84E78EC30BCE4EC69DBD562D0B2B8266BF4E5A"

然后我使用来自网络的 sha256 组合字符串和哈希它(https://xorbin.com/tools/sha256-hash-calculator

so first hash i got answer = "9a5c2897b8d01cb7996867e01b70bb1a4c84190982bd71d55d1efe5320feee22"

second hash = Merkle root = "437b30772522751ee150eb4b0a9c246d28557036cd720f75aecbba32ea59d174"

but answer from block hash is = "8fb300e3fdb6f30a4c67233b997f99fdd518b968b9a3fd65857bfe78b2600719"

我也尝试使用 hashlib++ 库在 C++ 中执行此操作,答案与上面相同,但不等于块资源管理器中显示的根。

那么我的理解错在哪里呢?我需要帮助来确定我的更正。

标签: c++rootsha256

解决方案


我尝试了您的示例并得到了确切的正确答案,不确定您是否正确执行此操作,请参阅下面用 Python 编写的代码,以便您更轻松地计算:

X1a = binascii.unhexlify("c06fbab289f723c6261d3030ddb6be121f7d2508d77862bb1e484f5cd7f92b25")[::-1]
X1b = binascii.unhexlify("5a4ebf66822b0b2d56bd9dc64ece0bc38ee7844a23ff1d7320a88c5fdb2ad3e2")[::-1]
Y = hashlib.sha256(hashlib.sha256(X1a + X1b).digest()).digest()[::-1]
Z = binascii.hexlify(Y)
print Z

解释我的代码:

  1. 第 (1 和 2) 行获取您的字符串并将其转换为字节数组,然后在该行末尾使用 [::-1] 反转它,因此,您的 11223344 将变为 44,33,22,11

  2. 第 3 行对连接的字节数组执行 Double-SHA256,然后还反转字节顺序

  3. 第 4 行将字节数组转换为十六进制字符串,用于打印或发送到某处。

  4. 第 5 行是打印/输出。

这有效并返回“8fb300e3fdb6f30a4c67233b997f99fdd518b968b9a3fd65857bfe78b2600719”的输出,这是您最初提交的正确答案,也与您引用的块匹配。


推荐阅读