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的最新数据;第三行代码可以返回指定的最新的版本数据
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();
}