前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >区块链的java实现

区块链的java实现

作者头像
xiangzhihong
发布2018-02-06 10:19:03
2.4K0
发布2018-02-06 10:19:03
举报
文章被收录于专栏:向治洪向治洪

原文地址:http://java-lang-programming.com/en/articles/29

概述

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

这里写图片描述
这里写图片描述

Merkle Tree应用举例

  • 比特币
  • Git
  • Amazon’s Dynamo
  • Gassandra

比特币中的应用

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

这里写图片描述
这里写图片描述

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

这里写图片描述
这里写图片描述

Merkle tree 代码实现

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

代码语言:javascript
复制
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中:

代码语言:javascript
复制
List<String> tempTxList = new ArrayList<String>();
tempTxList.add("a");
tempTxList.add("b");
tempTxList.add("c");
tempTxList.add("d");
tempTxList.add("e");

实现过程

  • 准备交易数据
  • 计算出每个数据的hash值,从左到右逐步组成树的左右节点
  • 执行循环知道最后只剩下一个数据
这里写图片描述
这里写图片描述
代码语言:javascript
复制
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++;
  }

测试

代码语言:javascript
复制
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());
      }
    }

执行结果

这里写图片描述
这里写图片描述

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-12-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
    • Merkle Tree应用举例
    • 比特币中的应用
    • Merkle tree 代码实现
      • 数据准备
        • 实现过程
          • 测试
          相关产品与服务
          区块链
          云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档