如何使用java代码实现区块链

发布时间:2021-08-06 11:08:50 作者:小新
来源:亿速云 阅读:121

小编给大家分享一下如何使用java代码实现区块链,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

概述

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代码实现区块链

以上是“如何使用java代码实现区块链”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. java区块链有哪些技术
  2. 如何用Java代码实现最近最少使用缓存

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Anaconda如何配置各版本Pytorch

下一篇:如何解决某些HTML字符打不出来的问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》