学习区块链技术,首先应该了解最经典的 比特币。比特币做为最早的分布式去中心化的区块链应用,其经典设计值得学习。
比特币架构
比特币通过将各项技术进行结合,创造出来的这个产品,其本质的功能是记账,副做用是炒。 比特币的设计是为了保证所有数据是分布式的、去中心化的保存数据,防止数据在中心的节点中保存。
自上而下,共分6层
- 应用层
- RPC 层
- 网络层
- 共识层
- 数据层
- 存储层
1.应用层
包括比特币钱包、客户端等种上层的应用,一般是比特币程序本身的外部应用。 以比特币钱包为例,比特币钱包有很多种,可以上官网上下载不同钱包,比如最简单的钱包,早期这个钱包还保留有CPU挖矿功能。现在版本已不支持,可以参考官方 Github 文档:
https://github.com/bitcoin/bitcoin/blob/master/doc/release-notes/release-notes-0.13.0.md
2.RPC 层
RPC 层的作用是进行RPC 通信。测试可以使用 BitCore 这个工具来进行测试。
测试一个 RPC 命令,查看区块信息: getblockchaininfo 命令行
代码语言:javascript复制{
"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网络中当,每个节点都是平等的节点,没有哪个节点可以控制其他节点。
这种去中心化的好处就是可以做到节点之间的平等,但是也存在几个问题。
- 网络延迟
- 联合作敝
3.1 网络延迟很好理解,由于节点之间是平等的,每个节点都会呈现为网状的连接,当一个区块被生产出来后,会同步到相邻的网络节点当中,进行相邻转发。并不是通过中心节点订阅或转发的,一个区块到达所有的节点会有网络延迟。
3.2 联合作敝,去中心化的通信,节点间的数据只能依赖于依赖于各个节点间的验证,那就给做敝留下了空间。
4.共识层
什么是共识,这个非常重要,非常重要。 因为在平等的网络当中,每个节点都是分散的,该如何保证每个节点的验证、转发是一致? 这就需要每个节点与节点之间达成共识。以此来保证所有节点的行为一致。
什么是共识 共识就是,共识即认可,比特币中有很多节点,要让这些节点达成一致性,比特币采用的是:POW 工作量证明。 比特币共识:说白点就是大家通过计算一个随机生成的Hash值的方式,来决定谁先打包。是不是感觉没什么,计算这个Hash并不是一件马上就可以算出来的事情。 大概流程:
- 所有比特币中的交易会向所有节点广播,所有节点接收到交易后,放于交易队列当中
- 全世界所有节点通过计算 Hash 来决定谁交这些交易打包,先算出者,打包交易成一个区块并广播区块
- 打包者,将一个随机数加处块头中,使得计算的哈希结果小于或等于块头中目标值
- 其他节点收到区块后,验证区块和区块内的交易,验证正确保留该区块
为什么要给一个随机Hash数来给节点计算 为了证明这个块的正确性。比特币的区块链当中,第一个节点产生的第一个块叫做:创世块,这个块是比特币运行时产生的第一个块,这个块会产生一个随机Hash数,打包进第一个块的块头中,然后广播。 其他节点收到区块后,对这个创世块进行验证。先验出者,证明了这个块是正确的,然后根据这个创建块,将收到的交易进行打包,并链接到这个创世块后面,就成了第二个块,并且这个节点也根据收到的交易产生了个随机Hash,广播给其它节点。 其他节点收到后,重复这个流程,证明这个块的正确性,并进行上链。这个就是 POW 的义意。
5.数据层
数据层是指比特币的数据结构。比特币的数据结构比较典型,很多后来的区块链都借鉴这些数据模型。
- 区块
- 区块链
- Merkle树,也称,默克尔树
- Hash
- 时间戳
区块
是指将交易进行打构的区块数据结构,包含:区块头、区块体、哈希、时间戳 等。
区块链
是指由区块构成的链条,就是指区块链,比较直白。
Merkle树,也称,默克尔树
Merkle树的作用:防窜改。 这里仅需要知道即可,这些点每一个展开都是一个大点,后续会做很详细的讲解。 Merkle树的构成是通过将每一笔交易的哈希,自上而下,相邻两个节点向上构建出一个新的父哈希值,由此来构建一棵哈希树。
6.存储层
存储主要使用的是 LevelDB,进行存储,LevelDB 是基于 SSTable 进行设计实现的一个数据引擎。很多数据库都是基 LevelDB 进开发。 LevelDB 本身具体高性能读写,通过在内存缓存 和 多层级文件存储而取名 LevelDB。