区块链java代码实现

作者:code_xzh 时间:2023-02-04 04:00:24 

概述

MerkleTree被广泛的应用在比特币技术中,本文旨在通过代码实现一个简单的MerkleTree,并计算出Merkle tree的 TreeRoot。
Merkle Tree 是一种数据结构,用于验证在计算机之间和之间存储,处理和传输的任何类型的数据。
目前,Merkle树的主要用途是确保从对等网络中接收的数据块未受损和未改变,和检查其他对等网络没有撒谎发送假数据块。

区块链java代码实现

Merkle Tree应用举例

比特币

GitA

mazon's Dynamo

Gassandra

比特币中的应用

比特币中每个块中都包含了所有交易的集合签名,这个签名就是用Merkle tree实现的,Merkle树用于比特币以汇总块中的所有事务,产生整个事务集合的整体数字指纹,提供非常有效的过程来验证事务是否包括在块中。

区块链java代码实现 

Merkle树一个很重要的用处是检查块中是否包含指定的交易,Merkle树是通过递归哈希节点对来构造的,直到只有一个哈希。

区块链java代码实现

Merkle tree 代码实现

哈希树的跟节点称为Merkle根,Merkle树可以仅用log2(N)的时间复杂度检查任何一个数据元素是否包含在树中:


package test;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
public class MerkleTrees {
 // transaction List
 List<String> txList;
 // Merkle Root
 String root;

/**
 * constructor
 * @param txList transaction List 交易List
 */
 public MerkleTrees(List<String> txList) {
 this.txList = txList;
 root = "";
 }

/**
 * execute merkle_tree and set root.
 */
 public void merkle_tree() {

List<String> tempTxList = new ArrayList<String>();

for (int i = 0; i < this.txList.size(); i++) {
  tempTxList.add(this.txList.get(i));
 }

List<String> newTxList = getNewTxList(tempTxList);

while (newTxList.size() != 1) {
  newTxList = getNewTxList(newTxList);
 }

this.root = newTxList.get(0);
 }

/**
 * return Node Hash List.
 * @param tempTxList
 * @return
 */
 private List<String> getNewTxList(List<String> tempTxList) {

List<String> newTxList = new ArrayList<String>();
 int index = 0;
 while (index < tempTxList.size()) {
  // left
  String left = tempTxList.get(index);
  index++;
  // right
  String right = "";
  if (index != tempTxList.size()) {
  right = tempTxList.get(index);
  }
  // sha2 hex value
  String sha2HexValue = getSHA2HexValue(left + right);
  newTxList.add(sha2HexValue);
  index++;

}

return newTxList;
 }

/**
 * Return hex string
 * @param str
 * @return
 */
 public String getSHA2HexValue(String str) {
  byte[] cipher_byte;
  try{
   MessageDigest md = MessageDigest.getInstance("SHA-256");
   md.update(str.getBytes());
   cipher_byte = md.digest();
   StringBuilder sb = new StringBuilder(2 * cipher_byte.length);
   for(byte b: cipher_byte) {
    sb.append(String.format("%02x", b&0xff) );
   }
   return sb.toString();
  } catch (Exception e) {
    e.printStackTrace();
  }

return "";
 }

/**
 * Get Root
 * @return
 */
 public String getRoot() {
 return this.root;
 }

}

数据准备

我们将交易的数据,放入到List中:


List<String> tempTxList = new ArrayList<String>();
tempTxList.add("a");
tempTxList.add("b");
tempTxList.add("c");
tempTxList.add("d");
tempTxList.add("e");

实现过程

准备交易数据
计算出每个数据的hash值,从左到右逐步组成树的左右节点
执行循环知道最后只剩下一个数据

区块链java代码实现


private List<String> getNewTxList(List<String> tempTxList) {
List<String> newTxList = new ArrayList<String>();
int index = 0;
while (index < tempTxList.size()) {
 // left
 String left = tempTxList.get(index);
 index++;
 // right
 String right = "";
 if (index != tempTxList.size()) {
  right = tempTxList.get(index);
 }
 // sha2 hex value
 String sha2HexValue = getSHA2HexValue(left + right);
 newTxList.add(sha2HexValue);
 index++;
}

测试


package test;
import java.util.ArrayList;
import java.util.List;
public class App {
  public static void main(String [] args) {
   List<String> tempTxList = new ArrayList<String>();
   tempTxList.add("a");
   tempTxList.add("b");
   tempTxList.add("c");
   tempTxList.add("d");
   tempTxList.add("e");

MerkleTrees merkleTrees = new MerkleTrees(tempTxList);
   merkleTrees.merkle_tree();
   System.out.println("root : " + merkleTrees.getRoot());
  }
 }

执行结果

区块链java代码实现

本文从简单二叉树的形式实现了简单的MerkleTree,计算出TreeRoot,但是实际上的的MerkleTree不拘谨与二叉树还可能是多叉树。

本文90%来着于翻译,原文地址

来源:http://blog.csdn.net/xiangzhihong8/article/details/53931213

标签:java,区块链
0
投稿

猜你喜欢

  • Spring JPA之save方法示例详解

    2023-09-06 15:50:35
  • Android编程之ActionBar Tabs用法实例分析

    2021-11-08 08:49:26
  • Java实现手写线程池实例并测试详解

    2022-03-04 11:23:27
  • C#中decimal保留2位有效小数的实现方法

    2023-01-30 07:35:13
  • SpringBoot应用jar包启动原理详解

    2022-07-08 09:45:48
  • 关于后端如何解决跨域的问题说明

    2023-09-19 00:59:10
  • Android使用CardView作为RecyclerView的Item并实现拖拽和左滑删除

    2022-03-20 00:33:28
  • JavaWeb ServletConfig作用及原理分析讲解

    2021-11-09 05:50:54
  • spring缓存cache的使用详解

    2023-03-28 11:36:14
  • java开发RocketMQ消息中间件原理基础详解

    2023-10-01 21:04:49
  • Java中MultipartFile与File互转的实现

    2022-02-15 15:36:02
  • 详解Java字节码编程之非常好用的javassist

    2021-08-27 04:54:30
  • java实现Dijkstra算法

    2021-09-02 23:14:15
  • java实现监听u盘示例分享

    2023-10-20 02:14:05
  • 详解Java中的实例初始化块(IIB)

    2023-06-08 08:35:46
  • C++实现LeetCode(9.验证回文数字)

    2023-06-21 00:20:38
  • Spring Security实现基于RBAC的权限表达式动态访问控制的操作方法

    2023-11-29 16:03:25
  • java实现合并单元格的同时并导出excel示例

    2022-05-15 04:22:38
  • WPF实现3D翻牌式倒计时特效

    2021-11-11 16:08:21
  • C#实现简单串口通讯实例

    2022-06-18 11:29:42
  • asp之家 软件编程 m.aspxhome.com