[ethereum源码分析](2) ethereum基础知识
前言
上一章我们介绍了如何搭建ethereum的debug环境。为了更深入的了解ethereum,我们需要了解一些ethereum的相关的知识,本章我们将介绍这些知识。
ethereum相关知识
在学习ethereum的过程中,我们可能会遇到下面的一些知识:
- hash
- merkle tree
- merkle patricia tree
- rlp
Hash(散列函数)
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。(本段来自百度百科>._<)
下面让我们来看看hash的一些特性(想了解更多关于hash的知识请自行百度):
- 可以将输入映射成定长的输出(例如:有两段文本A[长度=100]和B[长度=300],那么他们被hash过后都会生成长度为n的文本)
- 很难找出不同的输入会有相同的输出,也就是说映射成的输出就像指纹一样可以标识该输入。
hash主要是应用在数据的验证、区块的标识、钱包地址中,下面让我们来看看ethereum使用的是什么hash函数:
func rlpHash(x interface{}) (h common.Hash) { hw := sha3.NewKeccak256() rlp.Encode(hw, x) hw.Sum(h[:0]) return h }
通过上面的代码我们可以看到 sha3.NewKeccak256() 这段代码,那么ethereum中就是用的是 Keccak256 这种hash算法。对于算法我们没有必要深入去研究,我们只需要知道算法的特性是什么就可以了。
Merkle Tree(梅克尔树)
Merkle Tree,是一棵hash树。它的叶子结点是数据,而根节点和子节点都是hash值(关于Merkle Tree的学习,请点击这里)。
Merkle Tree特性:
- 除了叶子节点所有的节点都是hash值
- 知道hash路径,就可以知道数据是否在这颗树上
通过应用Merkle Tree,解决了区块链轻节点上数据验证的问题。
Merkle Patricia Tree(梅克尔帕特里夏树)
Merkle Patricia Tree,对于Merkle Patricia Tree的介绍请点击这里,这篇文章已经说明的相当好了,这里就不再赘述。
Recursive Length Prefix(RLP,递归长度前缀)
Recursive Length Prefix,是一种编码规则。个人觉得数据经过它的编码,实现了一部分的数据压缩,可以减少网络传输数据的大小。对于RLP的介绍,请点击这里。