当我遇到“区块链”这个术语时,首先让我感兴趣的是:“区块链为什么能提供数据的安全性和不变性?”因此,最好的办法就是做一些研究。
当我浏览不同的文章时,每次出现的术语都是Merkle tree,以及它如何利用密码学和“树”数据结构为区块链提供不变性。但是在理解Merkle如何工作之前,我们首先需要熟悉哈希值指针。在学习c语言指针的时候,就足以让我们绞尽脑汁了。这里的指针是指存储其他变量地址的简单变量。
指针P1存储值8000的地址,即5000(地址8000)
那么,什么是哈希值指针呢?
哈希值指针是一个带有加密哈希值附加属性的指针。哈希值指针由两部分组成:· 指向某些数据存储位置的指针。· 数据块的加密哈希值(由数据和哈希值指针组成)。
哈希指针
哈希值指针能给我们带来什么?。哈希值指针有助于检测数据篡改。让我们来看看:
用例:用于检测数据篡改的哈希指针
术语
· H( ):哈希值指针,包含第一个块(即最右边的块)的地址和存储在其中的整个块的加密哈希值(数据+哈希指针)。· H1, H2, H3:存储在从右到左的块中的哈希值指针。· 块1,块2,块3:数据块,从右向左移动。现在假设我们改变块3中的一些数据。· 因为H2是存储在块3的加密哈希值中。因此H2的值也会随之块3的值的改变而改变,其他哈希值指针的值也会随之改变。· 现在,我们如何检查数据是否被篡改了呢?我们需要验证的是头指针的哈希指针值(在本例中,最右边的H()指向块1)。如果值不匹配,则表示数据被篡改。
Merkle树
现在,我们装备了了解Merkle Tree的工具。那么,merkle树是什么呢?让我们来看看:根据维基百科的解释:在密码学和计算机科学中,Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储哈希值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的哈希值。非叶节点是其对应子节点串联字符串的哈希值。简单的树数据结构使用指针指向它的子节点,但是对于Merkle树,我们使用哈希值指针来存储它的子节点的地址以及子节点的哈希值。
区块链使用merkle树来存储交易
区块链使用merkle树存储事务。Merkle如何提供不变性?
· 假设我更改了叶子节点中的任何事务。哈希值指针在它的父节点也需要改变,随后哈希值根节点的指针需要大量的计算,我们需要做的就是检测区块链中的任何篡改是通过验证起源的哈希指针块(区块链中的第一个块)。· Merkle树还用于通过检查某个特定块中事务的加密哈希值是否存在来验证某个块中事务的成员关系。优势:· 树包含许多项,但是您只需要记住根节点的加密哈希值即可。· 可以在0(log n)时间/空间复杂度中验证事务的成员关系。· 能在0(log n)时间内在排序的merkle树中验证非成员资格(检查缺失项之前和之后的项目)。