哈希指针(Hash Pointers)

对于一个结构体而言,指向它的指针存储的是它在内存中的首地址;而指向它的哈希指针,不仅保存这它的首地址,还保存着该结构体内容的哈希值。通过哈希指针,不仅可以找到该结构体,还能查验该结构内容是否被篡改过。

区块链

比特币中存储数据用的是区块链。所谓区块链,可以理解为链表。不过与链表不同的是,区块链使用哈希指针代替了普通指针。下图为区块链简单结构:

区块结构

哈希指针包含在该区块的区块头中,它是对前一个区块的整体进行哈希运算得到的。

Merkle tree

MerkleTree

如上图所示,与Binary tree不同,Merkle tree中各节点保存的都是子节点的Hash值。

在Merkle Tree中,每个叶子存储的都是一笔交易的Hash,父节点存储的是对子节点取Hash后的值。所以如果有交易内容内容被修改,那么最终都会辐射到Merkle Tree的根节点。

比特币中的应用

在比特币网络中,所有的交易信息都是存储在区块中,通过Hash指针组织成区块链;每个区块都可以分为两部分:block header和block body。block body中存储该区块包含的所有交易,block header中包含有前一个区块的Hash(只是对前一个区块的Block header进行Hash,并非对整个区块进行Hash),本区块中所有交易组成的Merkle tree的根Hash以及其它信息(包括区块版本、挖矿难度、时间戳、Nonce)。

在比特币网络中,存在两种类型的节点:

  • 全节点,存储有整个比特币网络中的所有block。
  • 轻节点,只存储block header。比特币钱包就是轻节点的一种。轻节点并不参与比特币网络的构建,只能算是比特币网络的一个应用。

在使用比特币钱包交易时,需要向收款方证明该交易已经被写入区块。此时,可以使用 Merkle Proof来证明该交易已被写入区块。

提供Merkle Proof时,钱包会向附近的全节点发出请求,全节点会将Merkle tree中与该交易相关路径上的节点返回给请求方,之后钱包再将收到的信息发送给收款方进行验证。如下图所示,全节点只需将红框选中的Hash返回给钱包即可,其它节点的Hash因为不参与计算,所以无需返回。

MerkleProof


声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin92
Github: mengbin92
cnblogs: 恋水无意