c++ - 从 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++ 中执行此操作,答案与上面相同,但不等于块资源管理器中显示的根。
那么我的理解错在哪里呢?我需要帮助来确定我的更正。
解决方案
我尝试了您的示例并得到了确切的正确答案,不确定您是否正确执行此操作,请参阅下面用 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 和 2) 行获取您的字符串并将其转换为字节数组,然后在该行末尾使用 [::-1] 反转它,因此,您的 11223344 将变为 44,33,22,11
第 3 行对连接的字节数组执行 Double-SHA256,然后还反转字节顺序
第 4 行将字节数组转换为十六进制字符串,用于打印或发送到某处。
第 5 行是打印/输出。
这有效并返回“8fb300e3fdb6f30a4c67233b997f99fdd518b968b9a3fd65857bfe78b2600719”的输出,这是您最初提交的正确答案,也与您引用的块匹配。
推荐阅读
- c# - 传递给 AES init 的 BouncyCastle 无效参数
- reactjs - 如何使用仪表板和电子商务页面管理 reactjs 中的路由?
- r - 在 R 中制作像 roc.glmnet 这样的 roc 曲线
- sql - 为什么我的组没有按预期对我的值进行分组?
- java - 如何避免混淆 Firebase 模型字段?
- vue.js - 创建构建后。运行构建时显示空白页
- snowflake-cloud-data-platform - 永久更改 JSON SNOWFLAKE 中的列名
- c# - 来自代码后面的 WPF CommandParameter 值
- ios - Swift 的 Dispatchqueue 和 Flutter 的 Future 有什么区别?
- javascript - 如何在 JavaScript 中将对象转换为 text/csv 并下载为 CSV?