当前位置:   article > 正文

Merkle树的实现_merkletree实现

merkletree实现

 

简介

本篇文章是对Merkle tree的解释。Merkle tree是一种应用在比特币中的技术。本文的目标是通过代码来理解它的实现过程。

环境

Jdk 1.8.0_66

Idea

Merkle树

Merkle tree(哈希树)是一种数据结构,用于验证任何类型的数据存储、处理和传输。

目前,Merkle树的主要用途是确保在对等网络中从其他对等网络接收到的数据块未被损坏和修改,甚至检查其他对等网络是否存在并发送假块。

Merkle树应用范围:git, Amazon的Dynamo, Cassandra和 比特币

比特币区块链中的每一个区块都包含了区块中所有交易的摘要,使用的是Merkle树。

20142337_dSFR.png

Merkle树被用在比特币中,用来汇总一个区块的所有交易,生成整个交易集的整体数字指纹,提供一个非常有效的过程来验证一个交易是否被包含在一个块中。

重要的是检查是否包含块中的特定事务。为了这个,使用Merkle根。

Merkle树是通过递归的散列成对的节点来构建的,直到只有一个散列。这个创建的哈希被称为根,或merkle根。Merkle树可以通过log2(N)计算查看树中是否包含任何数据元素。

实现过程

准备交易数据

141557_FfOh_204117.png

创建合并左事务和右事务的散列数据

141602_LLGC_204117.png

执行循环直到只有一个散列

141618_aGiN_204117.png

算法和实现 

 

  1. package com.goroom.merkle;
  2. import java.security.MessageDigest;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. /**
  6. * Created by andyfeng on 2017/12/20.
  7. */
  8. public class MerkleTrees {
  9. // transaction List
  10. List<String> txList;
  11. // Merkle Root
  12. String root;
  13. /**
  14. * constructor
  15. * @param txList transaction List 交易List
  16. */
  17. public MerkleTrees(List<String> txList) {
  18. this.txList = txList;
  19. root = "";
  20. }
  21. /**
  22. * execute merkle_tree and set root.
  23. */
  24. public void merkle_tree() {
  25. List<String> tempTxList = new ArrayList<String>();
  26. for (int i = 0; i < this.txList.size(); i++) {
  27. tempTxList.add(this.txList.get(i));
  28. }
  29. List<String> newTxList = getNewTxList(tempTxList);
  30. //执行循环,直到只剩下一个hash值
  31. while (newTxList.size() != 1) {
  32. newTxList = getNewTxList(newTxList);
  33. }
  34. this.root = newTxList.get(0);
  35. }
  36. /**
  37. * return Node Hash List.
  38. * @param tempTxList
  39. * @return
  40. */
  41. private List<String> getNewTxList(List<String> tempTxList) {
  42. List<String> newTxList = new ArrayList<String>();
  43. int index = 0;
  44. while (index < tempTxList.size()) {
  45. // left
  46. String left = tempTxList.get(index);
  47. index++;
  48. // right
  49. String right = "";
  50. if (index != tempTxList.size()) {
  51. right = tempTxList.get(index);
  52. }
  53. // sha2 hex value
  54. String sha2HexValue = getSHA2HexValue(left + right);
  55. newTxList.add(sha2HexValue);
  56. index++;
  57. }
  58. return newTxList;
  59. }
  60. /**
  61. * Return hex string
  62. * @param str
  63. * @return
  64. */
  65. public String getSHA2HexValue(String str) {
  66. byte[] cipher_byte;
  67. try{
  68. MessageDigest md = MessageDigest.getInstance("SHA-256");
  69. md.update(str.getBytes());
  70. cipher_byte = md.digest();
  71. StringBuilder sb = new StringBuilder(2 * cipher_byte.length);
  72. for(byte b: cipher_byte) {
  73. sb.append(String.format("%02x", b&0xff) );
  74. }
  75. return sb.toString();
  76. } catch (Exception e) {
  77. e.printStackTrace();
  78. }
  79. return "";
  80. }
  81. /**
  82. * Get Root
  83. * @return
  84. */
  85. public String getRoot() {
  86. return this.root;
  87. }
  88. }

 

测试执行

  1. package com.goroom.merkle;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. /**
  5. * Created by andyfeng on 2017/12/20.
  6. */
  7. public class App {
  8. public static void main(String [] args) {
  9. List<String> tempTxList = new ArrayList<String>();
  10. tempTxList.add("a");
  11. tempTxList.add("b");
  12. tempTxList.add("c");
  13. tempTxList.add("d");
  14. tempTxList.add("e");
  15. MerkleTrees merkleTrees = new MerkleTrees(tempTxList);
  16. merkleTrees.merkle_tree();
  17. System.out.println("root : " + merkleTrees.getRoot());
  18. }
  19. }

141852_TB8W_204117.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/687290
推荐阅读
相关标签
  

闽ICP备14008679号