# BTC--数据结构

By [slashboy.eth](https://paragraph.com/@slashboy) · 2022-10-03

---

哈希指针（Hash Pointer）
------------------

BTC中使用的指针并非是寻常链表中的指针，而是哈希指针。指针存储的是数据的地址，而哈希指针存储着**地址和哈希值**。由于保存哈希值，因此可以查看改数据是否被篡改。

![区块](https://storage.googleapis.com/papyrus_images/0bfbbdb3f38ff49fca475a835ede13a46f77c682ea9e0df29ec24f66b6975f4b.jpg)

区块

区块链（Block Chain）
----------------

一个一个区块相连形成区块链，与链表类似，区别是将指针改为哈希指针。系统中会产生第一个区块称为创世区块（genesis block） 最后一个区块为最近产生的区块，系统中存着最后一个区块的哈希值。

![区块链](https://storage.googleapis.com/papyrus_images/3070199c21b16fe32e5479206f2379557ab112d8c3edc085377956a96599c413.jpg)

区块链

后一个区块中的哈希值是对前一个区块的所有内容取哈希，包括前一个区块中的H（）。如果其中一个区块的数据被改动，其后面的所有区块中保存的H（）都会改变，系统中的H（）也会改变，因此，可以利用系统中存储的最后一个区块的哈希值判断数据是否被篡改。这个性质可以让节点不必存储所有的区块，只需存储最近的区块，当需要其他区块时，可以向其它节点要，根据自己保存区块的哈希值来判断其它节点提供的区块是否正确。

Merkle Tree
-----------

底层为Date Block，其中存储着交易，中间为Hash Pointers，最上一层为根节点。每个数据区块的哈希值存储在上一层，根节点的哈希值被保存起来，该哈希值可以验证交易是否被篡改。

![Merkle Tree](https://storage.googleapis.com/papyrus_images/7e07c8d0a3946ee0307db0e7303703f0705482078757775dbb6b178582959820.png)

Merkle Tree

每个区块分为块头和块身。

*   Block Header
    
    存储着MerkleTree的根哈希值，没有交易的具体内容，只有根哈希值。
    
*   Block Body
    
    含有交易列表。
    

Mekle Proof
-----------

全节点存储了交易的Mekle Tree， 轻节点只存储着根节点的哈希值。轻节点想知道黄色交易是否已经被写入区块链中，它需要向全节点请求获得**H（）**`红色`而轻节点可以计算出**H（）**`绿色`，两者组合可以计算出上一级的H（），最终可以算出根哈希值，与轻节点存储的根哈希值比较，即可验证交易是否在此Mekle Tree中。

![Mekle Proof 示意图](https://storage.googleapis.com/papyrus_images/b7b3afbcc1f83a61160ded6989c4293e8b96a6d7e5b2e5a1605214cbe5ecc6d8.png)

Mekle Proof 示意图

---

*Originally published on [slashboy.eth](https://paragraph.com/@slashboy/btc-2)*
