阶段小结
undefined前言
本节对前面内容做一个总结,以便更加清晰地看到区块链的实现方式,包含技术、设计思路、类的组织等。
undefined类图

在Go语言里面的类的function和field的访问控制包括private和public两种,他们的区别是:大写字母命名的均为public,小写字母命名的都是private。
undefined三个核心类
Block、Blockchain、Transaction是三个核心类。
(1)Block类:区块

Block是区块链进行扩展最重要的地方。
接下来,我们将在区块链里面增加Data字段,以将更多的信息保存到区块链上。
(2)Transaction类:交易

一个交易,包含输入输出,它体现了区块链的核心设计:在匿名情况下,如何保证交易的可靠进行,将交易发送人以前未花费的输出纳入到本次交易的输入,交易完成后,零钱发回到交易发送人。此外,对输入的签名和上链前的校验(输入包含自校验所需的所有信息),也是保证匿名交易达成的重要设计。
交易的输入和输出,我们将在后面进行扩展成脚本语言,解决多重签名需求,并实现真正的智能合约。
(3)Blockchain:区块链

区块链是分布式数据库。
我们把Block、UTXO、UTXOBlock保存到数据库中。其中最关键的是Block数据库表,为了提高效率,我们将UTXO、UTXOBlock也存入到数据库中。
undefined区块链的主要应用场景
在区块链的主要交易场景中,交易是P2PKH(Pay To Public Hash),涉及三个节点:
(1)中心节点
(2)钱包节点
(3)矿工节点
- 中心节点创建一个区块链。
- 一个其他(钱包)节点连接到中心节点并下载区块链。
- 另一个(矿工)节点连接到中心节点并下载区块链。
- 钱包节点创建一笔交易。
- 矿工节点接收交易,并将交易保存到内存池中。
- 当内存池中有足够的交易时,矿工开始挖一个新块。
- 当挖出一个新块后,将其发送到中心节点。
- 钱包节点与中心节点进行同步。
钱包节点的用户检查他们的支付是否成功。
用例图:

请求区块同步时序图:

交易处理时序图:

undefined区块链的网络通信主要功能
1)区块同步。通过网络请求,下载本地缺失的区块;
2)发送交易。
3)接收交易,通过挖矿将交易上链。
undefined区块链应用层通信协议设计

惯常的做法,我们会用command+payload的方式设计应用层协议,其中要注意到是,command的长度一般需要固定,在解析传送来的数据时候,先解析命令,再在不同命名的处理函数中,解析该命令的payload。
Go很适合网络开发,struct是网络进行payload传输很适合的定义方式。
undefined区块链网络通信特点
1、区块链是P2P网络,因此加入区块链的每一个节点,既是服务器,也是客户端。
所以,一般在sendData时候,都会将发送者的addr作为payload的一部分,发送给对方。
2、P2P通信,是点对点的强通信方式,多次请求-回答完成交互,从发送“麻烦告诉我你版本是什么”开始,发现本地版本比对方低,于是接着发送“麻烦告诉我你有什么”,对方将回复区块或交易的概要(哈希列表),再紧接着向对方要具体的数据(如某个区块或者某个交易)。
3、由于是P2P通信,所以每次请求-回答的数据都很小:在区块链中,每次请求只会请求一个区块的数据或者一个交易的数据,这将最大限度保证通信的可靠性。
