Я пытаюсь написать очень простую реализацию дерева меркле в Java.
Я использую значения txids в блоке 170 в биткойнахблокчейн для справки, так что я могу видеть, каким должен быть правильный результат.
txids, соответствующие этому блоку, выглядят следующим образом:
b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082
f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16
Насколько я понимаю, этот биткойн merkleРеализация -дерева работает следующим образом:
- разбивает транзакции в блоке на пары
- байт-своп txids
- объединяет txids
- двойной хэш составных пар
С предупреждением:
If there's no additional pairs of txids, concatenate the result of the first pair after double hashing with itself and repeat
Мой код находится в операторе switch, который выглядит следующим образом:
case "test merkle root": {
// txid A
String A = "b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082";
// txid A byte-swapped
String A_little = MainChain.swapEndianness(A);
// txid B
String B = "f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16";
// txid B byte-swapped
String B_little = MainChain.swapEndianness(B);
// txid A + B concatenated
String AB_little = A_little + B_little;
// double hash of byte-swapped concatenated A+B
String ABdoubleHash = SHA256.generateSHA256Hash(SHA256.generateSHA256Hash(AB_little));
// double hash concatenated with itself
String ABAB_little = ABdoubleHash + ABdoubleHash;
// double hash of self-concatenated double-hashed txid
String merkleRootLittleEndian = SHA256.generateSHA256Hash(SHA256.generateSHA256Hash(ABAB_little));
// print result byte-swapped back to big-endian
System.out.println("Merkle root: " + MainChain.swapEndianness(merkleRootLittleEndian));
}
Метод 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();
}
Ожидаемый результат для корня merkle этих двухtxid это:
7dac2c5666815c17a3b36427de37bb9d2e2c5ccec3f8633eb91a4205cb4c10ff
Какрезультат, который я получаю в итоге:
3b40cab1157838cc41b08e27641f65d245957ab07b3504d94bc2d355abaed06c
Не получаю ли я ожидаемого результата, потому что я обманываю, когда делаю байт-своп, потому что я пропускаю шаг или потому что яесть ошибка в моем коде (или какая-то их комбинация)?Любая помощь будет оценена!