比特币学习之区块链
介绍 区块链的数据结构是由包含交易信息的区块按照从远及近的顺序有序链接起来的,每个区块都指向前一个区块。
介绍
区块链的数据结构是由包含交易信息的区块按照从远及近的顺序有序链接起来的,每个区块都指向前一个区块。
区块链经常被视为一个垂直的栈,第一个区块作为栈底的首区块,随后每个区块都被放置在之前的区块之上。
例如:“高度”来表示区块与首区块之间的距离;以及“顶部”或“顶端”来表示最新添加的区块。
创世区块
区块链里的第一个区块创建于2009年,被称为创世区块。它是区块链里面所有区块的共同祖先,这意味着我们从任一区块,循链向后回溯,最终都将到达创世区块。
因为创世区块被编入到比特币客户端软件里,所以每一个节点都始于至少包含一个区块的区块链,这能确保创世区块不会被改变。
每一个节点都“知道”创世区块的哈希值、结构、被创建的时间和里面的一个交易。
因此,每个节点都把该区块作为区块链的首区块,从而构建了一个安全的、可信的区块链。
在命令行使用比特币核心客户端:
$ bitcoindgetblock 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
{
"hash":"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
"confirmations":308321,
"size":285,
"height":0,
"version":1,
"merkleroot":"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"tx":["4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"],
"time":1231006505,
"nonce":2083236893,
"bits":"1d00ffff",
"difficulty":1.00000000,
"nextblockhash":"00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"
}
创世区块包含一个隐藏的信息。在其Coinbase交易的输入中包含这样一句话“The Times 03/Jan/2009 Chancellor on brink of second bailout forbanks.”这句话是泰晤士报当天的头版文章标题,引用这句话,既是对该区块产生时间的说明,也可视为半开玩笑地提醒人们一个独立的货币制度的重要性,同时告诉人们随着比特币的发展,一场前所未有的世界性货币革命将要发生。该消息是由比特币的创立者中本聪嵌入创世区块中。
区块链接成为区块链
比特币的全节点在本地保存了区块链从创世区块起的完整副本。随着新的区块的产生,该区块链的本地副本会不断地更新用于扩展这个链条。
当一个节点从网络接收传入的区块时,它会验证这些区块,然后链接到现有的区块链上。为建立一个连接,一个节点将检查传入的区块头并寻找该区块的“父区块哈希值”。

这节我们开始学习区块的相关知识
区块整体结构
| 字节长度 | 字段 | 说明 | | -------- | ---------- | -------------------------------------- | | 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 可以唯一指向一个区块