Merkle树的实现
简介
本篇文章是对Merkle tree的解释。Merkle tree是一种应用在比特币中的技术。本文的目标是通过代码来理解它的实现过程。
环境
Jdk 1.8.0_66
Idea
Merkle树
Merkle tree(哈希树)是一种数据结构,用于验证任何类型的数据存储、处理和传输。
目前,Merkle树的主要用途是确保在对等网络中从其他对等网络接收到的数据块未被损坏和修改,甚至检查其他对等网络是否存在并发送假块。
Merkle树应用范围:git, Amazon的Dynamo, Cassandra和 比特币
比特币区块链中的每一个区块都包含了区块中所有交易的摘要,使用的是Merkle树。
Merkle树被用在比特币中,用来汇总一个区块的所有交易,生成整个交易集的整体数字指纹,提供一个非常有效的过程来验证一个交易是否被包含在一个块中。
重要的是检查是否包含块中的特定事务。为了这个,使用Merkle根。
Merkle树是通过递归的散列成对的节点来构建的,直到只有一个散列。这个创建的哈希被称为根,或merkle根。Merkle树可以通过log2(N)计算查看树中是否包含任何数据元素。
实现过程
准备交易数据
创建合并左事务和右事务的散列数据
执行循环直到只有一个散列
算法和实现
package com.goroom.merkle;import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;/*** Created by andyfeng on 2017/12/20.*/
public class MerkleTrees {// transaction ListList<String> txList;// Merkle RootString 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);//执行循环,直到只剩下一个hash值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()) {// leftString left = tempTxList.get(index);index++;// rightString right = "";if (index != tempTxList.size()) {right = tempTxList.get(index);}// sha2 hex valueString 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;}
}
测试执行
package com.goroom.merkle;import java.util.ArrayList;
import java.util.List;/*** Created by andyfeng on 2017/12/20.*/
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());}
}
Merkle树的实现相关推荐
- Merkle 树——空间换时间,分而治之的hash表,通过根节点是由它的两个子节点内容的哈希值组成来校验数据完整性,定位篡改的数据位置...
Merkle 树 图 1.5.6.1 - Merkle 树示例 默克尔树(又叫哈希树)是一种二叉树,由一个根节点.一组中间节点和一组叶节点组成.最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的 ...
- 经常在比特币中看到的merkle树是什么?
区块基础-merkle树 Merkle tree中文叫做梅克尔树,这当然不是一棵真正的植物树,merkle tree是计算机数据结构中的一种树,是由计算机科学家 Ralph Merkle 提出的 ...
- 比特币Merkle树和SPV机制
参考链接 比特币Merkle树和SPV机制 | 登链社区 | 深入浅出区块链技术 Merkle树是什么 1.比特币中的Merkle树 在讲Merkle树之前,我们来看下比特币上某一个区块它的结构组成, ...
- 同时多次调用存储规程_本体技术视点 | 神奇的Merkle树是如何实现存储层优化的?...
一颗小树苗,由树根长出树干,树干长出树枝,树枝又长出叶子,最后就这样长成了参天大树.计算机界也有棵树,名叫 Merkle,由一个根节点.一组中间节点和一组叶子节点组成.根节点表示是最终的那个节点,且只 ...
- [区块链] 密码学——Merkle 树
在计算机领域,Merkle树大多用来进行完整性验证处理.在处理完整性验证的应用场景中,特别是在分布式环境下进行这样的验证时,Merkle树会大大减少数据的传输量以及计算的复杂度. Merkle哈希树是 ...
- 烤仔TVのCCW | 区块链中的 Merkle 树
大家好,欢迎收看 Conflux Chain Webinar. 今天,烤仔来跟大家聊一聊在每一个账本模型的区块链系统中,例如比特币.以太坊,用来维护账本状态都需要使用的 Merkle 树 . Merk ...
- 区块链学习笔记(2)难度整定,区块形成,区块体,Merkle树,Merkle Proof默克尔证明
难度的调整 是在每个完整节点中独立自动发生的.每2016个区块,所有节点都会按统的公式自动调整难度,这个公式是由最新2016个区块的花要时长与期望时长(期望时长为20160分钟,即两周,是按每10分钟 ...
- 默克尔树 Merkle树之Go语言实现
关于merkle树有很多实现.这里参考了一个纯内存实现,有助于理解. 项目地址 https://github.com/cbergoon/merkletree 核心分析 一.结构体 type Conte ...
- 区块链中的Merkle树
区块体中包含了由区块链系统产生的一系列交易数据, 并以Merkle根的形式保存在区块头中, 与前一区块的哈希值.时间戳和版本号等组成一个完整的区块. 上图表示的是比特币的区块结构, 其区块头中还包含了 ...
最新文章
- 中国研制量子计算机成功,中国宣布研发量子计算机,这次很可能真的要领先世界!速度太快!...
- linux shell 产生随机数
- Linux 系统调用(一)
- 代码练习 用户注册登陆与密码加密
- 【Java】6.7 内部类
- 如何在Windows 10的地图应用程序中获取离线地图
- 信息学奥赛一本通 1981:【18NOIP普及组】对称二叉树 | 洛谷 P5018【NOIP2018 普及组】 对称二叉树
- 5-13自定义sink到MySQL.
- windows api 每日一练(5)基本内存操作
- vue项目做本地代理
- 【VS开发】MFC修改Opencv namedWindow的风格
- 2018计算机一级证件照,2018下半年软考报名照片要几寸的呢?是要白底照片吗?...
- Safari Web Extension 开发(1)
- SpringBoot系列之(二):1.使用SpringBoot
- 中山マミ - 咲く未来
- C#通过TCP实现 HL7医疗系统传输的协议,并使用MLLP协议接收HL7消息并解析
- temp--文件夹中的文件处理
- requireJS常用用法
- c盘是不是越大越好_Windows系统磁盘分区,C盘划分多大最合适?不是越大越好!...
- 科学计算机 百分号,普通计算器上百分号(%)有什么用?