【软件工程与实践】(3)数据账户中的Merkle Tree——第一部分

2021SC@SDUSC

一、Merkle Tree

1.作用

1.Merkle Tree的作用是缩短校验数据包时间,使数据包校验达到更高的效率。

2.有些时候我们获取(遍历)所有数据块的在这里hash list代价比较大,只能获取部分节点的哈希。而Merkle Tree可以通过部分hash来检验整个数据包

3.说到根本上Merkle Tree 就是用来做完整性校验的,所谓的完整性校验,就是检查一下数据有没有损坏或者被恶意篡改。Merkle Tree 的最大的应用场合就是在点对点网络上

2.特点

1、数据结构是一个树,可以是二叉树,也可以是多叉树

2、Merkle Tree的叶子节点的value是数据集合的单元数据或者单元数据HASH。

3、Merke Tree非叶子节点value是其所有子节点value的HASH值。

二、代码分析

1.MerkleTree

默克尔树是由“哈希值”作为节点构成的树,把子节点哈希值按顺序组合在一起,对得到的数据进行哈希计算,得到父节点哈希值。因此,默克尔树的“根哈希”能够表示全部的叶子节点的有序状态,包括叶子节点的数值和排列顺序。

下面这行代码可以获取Merkle树的根节点,获取根节点的主要目的是为了方便查询key值

HashDigest getRootHash();

下面的第一行代码可以返回key的总数;第二行代码可以返回指定key的最新数据;第三行代码可以返回指定的最新的版本数据

扫描二维码关注公众号,回复: 14959560 查看本文章
long getTotalKeys();
KVEntry getData(byte[] key);
KVEntry getData(byte[] key, long version);

下面代码可以用来设置key值

void setData(byte[] key, long expectedVersion, byte[] newValue);

下面代码返回指定 key 最新版本的默克尔证明;默克尔证明的根哈希为当前默克尔树的根哈希;默克尔证明的数据哈希为指定 key 的最新版本的值的哈希;默克尔证明至少有 4 个哈希路径,包括:根节点哈希 + (0-N)个路径节点哈希 + 叶子节点哈希 + 数据项哈希(Key, Version,Value) + 数据值哈希;

MerkleProof getProof(byte[] key);

下面代码和上述的代码运作方式类似,不过下面代码是用来返回key指定版本的默克尔证明

MerkleProof getProof(byte[] key, long version);

运用了迭代器遍历所有键并返回最新版本

SkippingIterator<KVEntry> iterator();

运用了迭代器返回指定键的最新版本

SkippingIterator<KVEntry> iterator(byte[] key);

返回指定键的指定版本之前的所有数据(含指定版本

SkippingIterator<KVEntry> iterator(byte[] key, long version);

返回指定 key 的版本; 如果不存在,则返回 -1;

long getVersion(byte[] key);

2.MerkleProofException

默克尔证明异常;表示、在处理数据时数据无法通过校验,潜在的原因可能是数据已被修改或篡改。

public class MerkleProofException extends RuntimeException {
    
    

	private static final long serialVersionUID = 4110511167046780109L;

	public MerkleProofException(String message) {
    
    
		super(message);
	}

	public MerkleProofException(String message, Throwable cause) {
    
    
		super(message, cause);
	}

}

3.MerkleDataProof

使用默克尔树进行数据的校验。

public interface MerkleDataProof {
    
    
	
	DataEntry<Bytes, byte[]> getData();
	
	MerkleProof getProof();
}

猜你喜欢

转载自blog.csdn.net/weixin_45932150/article/details/120812668