学习区块链技术,首先应该了解最经典的 比特币。比特币做为最早的分布式去中心化的区块链应用,其经典设计值得学习。

比特币架构

比特币通过将各项技术进行结合,创造出来的这个产品,其本质的功能是记账,副做用是炒。
比特币的设计是为了保证所有数据是分布式的、去中心化的保存数据,防止数据在中心的节点中保存。

架构图

自上而下,共分6层

  1. 应用层
  2. RPC 层
  3. 网络层
  4. 共识层
  5. 数据层
  6. 存储层

1.应用层

包括比特币钱包、客户端等种上层的应用,一般是比特币程序本身的外部应用。
以比特币钱包为例,比特币钱包有很多种,可以上官网上下载不同钱包,比如最简单的钱包,早期这个钱包还保留有CPU挖矿功能。现在版本已不支持,可以参考官方 Github 文档:

https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.13.0.md
PC钱包

2.RPC 层

RPC 层的作用是进行RPC 通信。测试可以使用 BitCore 这个工具来进行测试。

测试一个 RPC 命令,查看区块信息: getblockchaininfo
命令行
钱包

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
37
38
39
40
41
42
43
44
{
"chain": "main",
"blocks": 680816,
"headers": 680816,
"bestblockhash": "0000000000000000000133b07fdf287ddca3cca80162b4a06a05d6904190cd37",
"difficulty": 23581981443663.85,
"mediantime": 1619518237,
"verificationprogress": 0.999995596389184,
"initialblockdownload": false,
"chainwork": "00000000000000000000000000000000000000001c943902d1cf6cdd1387c75c",
"size_on_disk": 1904190175,
"pruned": true,
"pruneheight": 679647,
"automatic_pruning": true,
"prune_target_size": 1999634432,
"softforks": {
"bip34": {
"type": "buried",
"active": true,
"height": 227931
},
"bip66": {
"type": "buried",
"active": true,
"height": 363725
},
"bip65": {
"type": "buried",
"active": true,
"height": 388381
},
"csv": {
"type": "buried",
"active": true,
"height": 419328
},
"segwit": {
"type": "buried",
"active": true,
"height": 481824
}
},
"warnings": ""
}

3.网络层

网络层使用 Peer-to-Peer,即点对点通信。每个BTC网络当中的节点中的通信,没有中心化的节点进行转发,需要通过节点发现,进行通信。
这也体现出BTC网络中当,每个节点都是平等的节点,没有哪个节点可以控制其他节点。

这种去中心化的好处就是可以做到节点之间的平等,但是也存在几个问题。

  1. 网络延迟
  2. 联合作敝

3.1 网络延迟很好理解,由于节点之间是平等的,每个节点都会呈现为网状的连接,当一个区块被生产出来后,会同步到相邻的网络节点当中,进行相邻转发。并不是通过中心节点订阅或转发的,一个区块到达所有的节点会有网络延迟。

3.2 联合作敝,去中心化的通信,节点间的数据只能依赖于依赖于各个节点间的验证,那就给做敝留下了空间。

4.共识层

什么是共识,这个非常重要,非常重要。
因为在平等的网络当中,每个节点都是分散的,该如何保证每个节点的验证、转发是一致?
这就需要每个节点与节点之间达成共识。以此来保证所有节点的行为一致。

什么是共识
共识就是,共识即认可,比特币中有很多节点,要让这些节点达成一致性,比特币采用的是:POW 工作量证明。
比特币共识:说白点就是大家通过计算一个随机生成的Hash值的方式,来决定谁先打包。是不是感觉没什么,计算这个Hash并不是一件马上就可以算出来的事情。
大概流程:

  1. 所有比特币中的交易会向所有节点广播,所有节点接收到交易后,放于交易队列当中
  2. 全世界所有节点通过计算 Hash 来决定谁交这些交易打包,先算出者,打包交易成一个区块并广播区块
  3. 打包者,将一个随机数加处块头中,使得计算的哈希结果小于或等于块头中目标值
  4. 其他节点收到区块后,验证区块和区块内的交易,验证正确保留该区块

为什么要给一个随机Hash数来给节点计算
为了证明这个块的正确性。比特币的区块链当中,第一个节点产生的第一个块叫做:创世块,这个块是比特币运行时产生的第一个块,这个块会产生一个随机Hash数,打包进第一个块的块头中,然后广播。
其他节点收到区块后,对这个创世块进行验证。先验出者,证明了这个块是正确的,然后根据这个创建块,将收到的交易进行打包,并链接到这个创世块后面,就成了第二个块,并且这个节点也根据收到的交易产生了个随机Hash,广播给其它节点。
其他节点收到后,重复这个流程,证明这个块的正确性,并进行上链。这个就是 POW 的义意。

5.数据层

数据层是指比特币的数据结构。比特币的数据结构比较典型,很多后来的区块链都借鉴这些数据模型。

  1. 区块
  2. 区块链
  3. Merkle树,也称,默克尔树
  4. Hash
  5. 时间戳

区块

是指将交易进行打构的区块数据结构,包含:区块头、区块体、哈希、时间戳 等。

区块链

是指由区块构成的链条,就是指区块链,比较直白。

Merkle树,也称,默克尔树

Merkle树的作用:防窜改。
这里仅需要知道即可,这些点每一个展开都是一个大点,后续会做很详细的讲解。
Merkle树的构成是通过将每一笔交易的哈希,自上而下,相邻两个节点向上构建出一个新的父哈希值,由此来构建一棵哈希树。

6.存储层

存储主要使用的是 LevelDB,进行存储,LevelDB 是基于 SSTable 进行设计实现的一个数据引擎。很多数据库都是基 LevelDB 进开发。
LevelDB 本身具体高性能读写,通过在内存缓存 和 多层级文件存储而取名 LevelDB。