跳过正文

2. 比特币的数据结构

·51 字·1 分钟
Chuck Chan
作者
Chuck Chan
分享技术、思考与生活

整体结构
#

比特币中的一个最基本的数据结构就是区块链,即一个一个区块组成的链表。其中,每个区块又可以分为headerbody

header里存储这个区块的一些元信息,例如版本、时间戳等。body里则存储区块里包含的具体交易。

全节点跟轻节点
#

节点是指接入比特币网络的计算机(或设备),它们通过运行比特币客户端软件参与网络维护、数据同步和交易处理。(了解P2P的同学应该很容易理解节点)

比特币中的节点又分为全节点和轻节点,全节点指存储了整个区块的节点(包括header与body,一般为矿工节点、交易所节点等)。轻节点指仅存储区块部分数据的节点(仅header,一般为手机钱包)。后续我们会再详细述说全节点与轻节点区别,这里只要有个大致的概念即可。

哈希指针
#

前面说过区块链是由一个个区块组成的,跟普通的链表用普通指针来连接数据不一样的是,区块之间是通过哈希指针来连接区块的。

哈希指针会将前一个区块的哈希值存入当前区块中,并且使用指针指向前一个区块

为什么需要哈希指针
#

  1. 防止区块内容被篡改

    在普通的链表中,指针指向的数据是可以被修改&替换的。而比特币这样一个去中心化的系统中,区块里的数据都是一笔笔已经发生的交易,是不应该被篡改的。哈希指针在通过指针找到前一个区块的时候,会对前一个区块进行hash运算,并且与当前存储的前一个指针的hash值做对比。假如有人恶意篡改了前一个区块的数据,那么与当前存储的hash值会不一致,则证明了前一个区块被篡改。

  2. 通过哈希指针可以找到任意区块

    哈希指针形成的链式结构,使得从任意区块出发,都能通过hash值追溯到前序区块,直至创世区块。

    这里在查找区块的过程中,也从另一个角度验证了比特币系统中的不可篡改性,因为在不断地寻找前一个区块的过程中,需要不断地利用哈希指针进行校验,进而验证了整个区块链是有效的。

merkle tree
#

另外一个常用的数据结构是merkle tree,merkle tree也很好理解,就是使用哈希指针代替普通指针的二叉树。比特币中的区块之间使用哈希指针链接,每个区块中的所有交易则会使用一颗merkle tree来表示。最后整个交易树的merkle root会存储在区块header中

为什么需要merkle tree
#

  1. 防止交易被篡改

    在一颗merkle tree中,叶子节点为一笔笔交易,非叶子节点为子节点的哈希值。在整颗树中任何一个地方被修改,最终都会影响到merkle root。

  2. 验证交易合法性

    假设在一次比特币交易中,A转给B一笔比特币,那么B是如何验证A真的给自己转了一笔钱呢?答案就是使用merkle proof。

    假设A->B的交易是图中的tx4,首先A已知tx4所在区块的merkle root(未知的话可以跟其他节点请求获取)。

    1. 向全球其他全节点获取图中红色的哈希值
    2. A再通过本地计算一直往上计算(计算中图中绿色的哈希值),直到获取到merkle root'
    3. A再跟已知的merkle root做对比,如果 merkle root = merkle root’,则证明tx4交易确实存在

    图中黄色的验证路径即是一次merkle proof,这样做的好处是无需下载整个区块的所有交易,只需少量哈希值,即可验证交易交易的真实性。