区块结构

区块链开发之前,先了解比特币的区块结构,有利于了解后续比特币的各种数据结构的做用。

本文要介结几个重要概念:

  1. 区块结构
  2. 区块头
  3. 区块体
  4. 区块查看工具

区块

区块是比特币的核心。
当前比特币网络,每10分产一个块。
区块的作用: 比特币最核心的数据结构,包含了交易的重要标识,包括:区块头、区块体、区块大小等数据。

一个完整的区块结构

数据项 字节 字段 说明
Magic NO 4 魔数 常数0xD9B4BEF9
Blocksize 4 区块大小 用字节表示的该字段之后的区块大小
Blockheader 80 区块头 组成区块头的几个字段
Transaction counter 1-9 交易计数器 该区块包含的交易数量,包含coinbase交易
Transactions 不定 交易 记录在区块里的交易信息,使用原生的交易信息格式,并且交易在数据流中的位置必须与Merkle树的叶子节点顺序一致

区块

这里最典型的要数 区块头区块体 了,因为它们通常在学习区块链的时候,比较能说明区块链的重要特性。

另外区块链不看不见摸不着的东西,人往往需要可视化的模型会更有助于理解抽象的概念。

这里介绍一个工具,区块链浏览器:
https://blockchain.info/

通过这个浏览器,可以查看区块内的信息。
为什么这个站点可以查看区块信息?
因为区块链的服务,也就是个服务,提供了查询接口,机构或个人,只需要运行区块链服务,在本地运行就可以访问区块链信息,前提是要同步好区块数据。
之前的文章就强调过,鼓励大家运行区块链服务是区块链的特点,币是奖励,算是一种副产物,是被金融机构炒起来的。

区块头

查看区块信息

getblock 00000000000000000000bca6ccc2ef309fd814f80a55b3e08a4212326137d7d2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
"hash": "00000000000000000000bca6ccc2ef309fd814f80a55b3e08a4212326137d7d2",
"confirmations": 30,
"strippedsize": 884103,
"size": 1345977,
"weight": 3998286,
"height": 681181,
"version": 536870912,
"versionHex": "20000000",
"merkleroot": "574dfd1961a53bb1fd307d7345b2aff6a196cce29a824b9029d454e1f61cfb35",
"tx": [
"1a44cb6551af919652eac49d953c50ab2acb1ebdfe7d2b20ed3c1944bd37ac96",
"3e06d35f7f550068a72991d62dd32281a13e1492867b1c8531a4aa12f591cff8",
"9d66b3a4b6b683aa4d03d8186d31d33e41e73bd96692cbf33a152b99100b326a",
"ae6fdde3a16e91d587a5d3c1500d5828a01e69c02b6832cde132111fd90c4760",
"91a5aa20c0582695a90cfdf4dab5540406c9b78fba4a20f6cd6cb96445d31be5",
"471ce26f56eb1c164315704b923a1095145256c0e43a77ccd72254265c950b0f",
"fb56a184da1cff5e8c0cc65c13392c68517713754338f87047bef07c1a43b032",
"8be8b938eff96313ee9e61c287fdffea2779c0537d2f0ccd7fc1e973693fd12b",
"d12faee60ec1f46f2bdd6a490b1c92c2e804955786a014b56d8fb9e6d2a35eef",
"819f0fb4a16a3f88079bf35f6f03c0b032879a75f56b412baedfe525e19708f4",
"dcc9e980cd345e9a6e136d76a4cd36a36bb7e3217b3685ad9ca577acc8019bf8",
"6a1a122610ff86d6037d46e57c49183960bcefad04ea233a387fc3d8a0db997b",
"23dab800d04d100b2748b2addec5237b75ad6da992de80984f95d8decd546859"
//省略部份交易
],
"time": 1619758979,
"mediantime": 1619755004,
"nonce": 32721792,
"bits": "170bef93",
"difficulty": 23581981443663.85,
"chainwork": "00000000000000000000000000000000000000001cb2cd894a35651ba07be168",
"nTx": 2158,
"previousblockhash": "00000000000000000004cabf7ba2626c0da40182c19324ea12c13b2aac8ade98",
"nextblockhash": "000000000000000000058960a47748b02e4b659ba529a0e9c6fb9e1991158f6f"
}

包含以下数据:

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

区块头中的数据分成三不同的意义:

  1. 区块元数据
  2. 打包相关元数据
  3. 交易树据根

1.区块元数据

  1. 父哈希(前一个块)
  2. 版本号
    即前区块的上一个区块,就是父区块(前一个块)的哈希值,父哈希值用来将该区块与它的前一区块相连接;

2.打包相关元数据

  1. 难度
  2. 时间戳
  3. Nonce(随机数)

3.交易树据根

这个根在区块头中就是根哈希值,即区块体中的默克尔树的根。

区块体

区块体包括当前区块经过验证的、 区块创建过程中生成的所有交易记录。这些记录通过默克尔(Merkle)树的哈希过程生成唯一的默克尔,根并记入区块头。
区块体,包含交易数据。
比特币中的交易比较简单,就是转账,A -> B 转账,这笔交易从比特币客户端发起后,就会进行广播。
比特币的节点收到交易后,会将交易存储到交易队列当中,直到进行打包时才会将交易队列中的交易,打包其实是构建一个数据结构,包括:

默克尔树
当前区块的交易集合而生成的一颗树,目的是通过每一笔交易,从下往上生成一树哈希树。
自下往上看:
默克尔树

区块链

就是字面意思,由一个个区块组成的链条。
创世块:比特币网络中的第一个块。几乎所有的区块链服务,都有创有块。
学习区块链,就必须了解区块的本质,区块链的是由一个一个区块组成的链条。

区块链是逻辑上的链条,每一个区块之间通过确认父哈希的形式,来确定自己的父块。
区块链结构

那么这样就会产生几个问题?

  1. 区块链网络中有很多的节点同时产块,该确认谁才是下一个节点?
  2. 如果 A 先产块,B 后产块,但是 A 的网速有延迟,传输比 B 后到达,其他节点怎么处理 A 的区块?
  3. 如何保证传输过来的块一定是合法块,不是一个恶意节点广播过来的块 或者 没有被恶意修过过的块?

比特币是如何解决上述这些问题的。

综上,比特币的区块头 和 区块体 是紧密相连的数据结构,缺一不可。

bitcore 区块链钱包

比特币的工具有很多,PC端常用的工具就是比特币钱包。钱包的种类也有不少,可以查看比特币官网,这里用的是 bitcore。
通过命令行窗口,可以执行一些命令来看查看比特币相关的数据。
查看区块信息

getblock 00000000000000000000bca6ccc2ef309fd814f80a55b3e08a4212326137d7d2

钱包工具