← 返回文章

比特币学习之区块

介绍

上一节,我们学习完了交易的相关知识,在区块链中,交易是要放在区块体中去,然后区块进过共识上链,就成为了区块链中的一部分。

这节我们开始学习区块的相关知识

区块整体结构

| 字节长度 | 字段 | 说明 | | -------- | ---------- | -------------------------------------- | | 4 | 区块大小 | 用字节表示的该字段之后的区块大小 | | 80 | 区块头 | 组成区块头的几个字段 | | 1-9 | 交易计数器 | 该区块包含的交易数量,包含coinbase交易 | | 不定 | 交易列表 | 记录在区块里的交易信息 |

**注:**我们创建的所有交易都会打包到表格最后一列的交易列表中

coinbase交易,之前我们没有学习过,它是一种特殊的交易,没有输入,不消耗UTXO,只有一个输出,地址是这个矿工的比特币地址。

区块头结构

区块的主要信息都在区块头中,它是整个区块数据的摘要,它为整个区块提供了唯一的摘要。

| 字节长度 | 字段 | 说明 | | -------- | ------------------- | ------------------------------------------ | | 4 | Version | 区块版本号 | | 32 | Previous Block Hash | 前一个区块头的哈希值 | | 32 | Merkle Root | 交易列表生成的默克尔树根哈希 | | 4 | Time | 该区块产生的近似时间,精确到秒的UNIX时间戳 | | 4 | Bits | 难度目标,挖矿难度值 | | 4 | Nonce | 挖矿过程中使用的随机值 |

Merkle Root

Merkle Root 用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验区块是否存在某交易的高效途径。

一个 Merkle 根是通过将成对的 txid 进过哈希后形成的。而 txid 我们之前学过它是通过将整个交易进行两次 SHA-256 哈希得到的。

所以,merkle根就为块中的所有交易提供了一个简短而唯一的指纹。

Merkle Root 的作用

假如我们不使用Merkle Root这种方法创建指纹,但又想为所有交易创建一个唯一的指纹,最笨的方法就是将所有的 txid 放在一起进过哈希函数得到哈希值。但是如果我们想要查询某一个 txid 是不是组成这个哈希值的一部分,那我们就需要知道所有其他的 txid 才行:

但是,如果我们使用 merkle root 这种方法,果我们想要查询某一个 txid 是不是组成这个 merkle 根的一部分,我们只需要知道沿着树的路径的一些哈希:

因此,将 merkle 根作为指纹放在区块头,当我们想要查询一个交易是否在这个区块上时,就不需要知道这个区块的所有交易。

Block Hash

Block Hash 是对整个区块头进行两次 SHA-256 哈希后得到的。

Block Hash 在区块链上代表着这个区块,也就是说,通过 Block Hash 可以唯一指向一个区块

END