我正在尝试用 Java 编写一个非常简单的 merkle-tree 实现。
我使用比特币区块链上第170 个区块中的 txid 值作为参考,所以我可以看到正确的结果应该是什么。
该区块对应的txid如下:
b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082
f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16
据我了解,比特币的 merkle-tree 实现方式如下:
将区块中的交易拆分成对
字节交换 txid
连接 txid
对连接的对进行双重哈希
需要注意的是:
If there's no additional pairs of txids, concatenate the result of the first pair after double hashing with itself and repeat
我写的 swapEndianness 方法不是真正的“字节级”交换,而只是改变了字符串的顺序,它看起来像这样:
public static String swapEndianness(String hash) {
char[] hashAsCharArray = hash.toCharArray();
StringBuilder sb = new StringBuilder();
for (int i = hash.length() - 1; i > 0; i-=2) {
sb.append(hashAsCharArray[i - 1]);
sb.append(hashAsCharArray[i]);
}
return sb.toString();
}
这两个 txid 的默克尔根的预期结果是:
7dac2c5666815c17a3b36427de37bb9d2e2c5ccec3f8633eb91a4205cb4c10ff
然而,我最终得到的结果是:
3b40cab1157838cc41b08e27641f65d245957ab07b3504d94bc2d355abaed06c
我没有得到我期望的结果是因为我在进行字节交换时作弊,因为我错过了一个步骤,还是因为我的代码有错误(或这些错误的某种组合)?任何帮助,将不胜感激!
慕容3067478
相关分类