ryan

比特币的数据结构

32 次阅读

区块链中的区块包含块头(block header)与区块体(block body).

block header存储的元数据包含以下关键字段:

  • •版本号(Version) 标识区块遵循的协议规则(如比特币的 version: 0x20000000)
  • •前一个区块的哈希值(Previous Block Hash) 链接到父区块,形成链条(若篡改任一区块,后续所有区块失效)
  • •默克尔根(Merkle Root) 本区块所有交易的哈希摘要,由交易数据通过默克尔树(Merkle Tree)计算得出,用于快速验证交易是否存在。
  • •时间戳(Timestamp) 区块生成的大致时间(Unix时间格式)
  • •难度目标(Difficulty Target) 当前区块的工作量证明(PoW)难度,控制挖矿竞争强度。
  • •随机数(Nonce) PoW矿工调整的数值,用于满足哈希难度要求(如比特币要求哈希值前导有多个0)

比特币中用的哈希函数是SHA-256.区块哈希值是通过通过对区块头(而非整个区块)进行双重SHA-256计算得出的: Block Hash = SHA256(SHA256(Version + Prev Hash + Merkle Root + Timestamp + Difficulty + Nonce)) 。

由于每个区块的header里面都包含了前一个区块的哈希值,从而保证了整个区块链不容易被篡改.

用户只需要记住最后一个区块链的哈希地址,就可以检测区块链上内容是否被篡改。

在实际应用中,一整条链可能会被切断分开保存在多个地方。若用户仅仅具有其中一段,当用到前面部分区块数据时,直接问系统中其他节点要即可,当要到之后,仅仅通过计算要到的最后一个哈希值和自己保存哈希值是否一致可以判断所给内容是否确实为区块链上真实的内容。

Merkle tree

Merkle Tree(默克尔树)是一种基于哈希函数的树形数据结构

merkle tree

其特点是:

  • 叶子节点存储的是原始数据的哈希值
  • 非叶子节点存储的是其两个子节点哈希值拼接后再进行哈希的结果

merkle数据结构的优点在于:只需要记住Root Hash(根哈希值),便可以检测出对树中任何部位的修改。

在比特币系统中,在同一个区块中的多个交易(数据块),则通过Markle Tree的形式组织在一起。根哈希(Merkle Root)保存在block header里面,交易列表保存在block body里.

什么是 Merkle Proof?

Merkle Proof 是从某个叶子节点到根节点的一条路径中,必要的兄弟哈希值(Sibling Hashes)的集合.

目标:只通过少量哈希值 + 根哈希,就能验证某条数据是否存在于 Merkle Tree 中。

Merkle Proof 的实际用途

比特币系统中节点的主要分为全节点与轻节点,全节点保存了整个区块链数据,轻节点仅有区块头,没有保存交易列表.

如图,某个轻节点想要知道标黄的tx是否已包含在merkle tree里面,轻节点向某个全节点发出请求,请求一个能够证明tx已包含在merkle tree里面的merkle proof.全节点将图中红色的哈希值发给轻节点,轻节点在本地进行哈希运算,得出一个root hax值,最后将root hax与block header里面保存的merkle root比对,从而判断tx交易是否已包含在merkle tree里面.