阶段小结

undefined前言

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

undefined类图

阶段小结 - 图1

在Go语言里面的类的function和field的访问控制包括private和public两种,他们的区别是:大写字母命名的均为public,小写字母命名的都是private。

undefined三个核心类

Block、Blockchain、Transaction是三个核心类。

(1)Block类:区块

阶段小结 - 图2

Block是区块链进行扩展最重要的地方。

接下来,我们将在区块链里面增加Data字段,以将更多的信息保存到区块链上。

(2)Transaction类:交易

阶段小结 - 图3

一个交易,包含输入输出,它体现了区块链的核心设计:在匿名情况下,如何保证交易的可靠进行,将交易发送人以前未花费的输出纳入到本次交易的输入,交易完成后,零钱发回到交易发送人。此外,对输入的签名和上链前的校验(输入包含自校验所需的所有信息),也是保证匿名交易达成的重要设计。

交易的输入和输出,我们将在后面进行扩展成脚本语言,解决多重签名需求,并实现真正的智能合约。

(3)Blockchain:区块链

阶段小结 - 图4

区块链是分布式数据库。

我们把Block、UTXO、UTXOBlock保存到数据库中。其中最关键的是Block数据库表,为了提高效率,我们将UTXO、UTXOBlock也存入到数据库中。

undefined区块链的主要应用场景

在区块链的主要交易场景中,交易是P2PKH(Pay To Public Hash),涉及三个节点:

(1)中心节点

(2)钱包节点

(3)矿工节点

  • 中心节点创建一个区块链。
  • 一个其他(钱包)节点连接到中心节点并下载区块链。
  • 另一个(矿工)节点连接到中心节点并下载区块链。
  • 钱包节点创建一笔交易。
  • 矿工节点接收交易,并将交易保存到内存池中。
  • 当内存池中有足够的交易时,矿工开始挖一个新块。
  • 当挖出一个新块后,将其发送到中心节点。
  • 钱包节点与中心节点进行同步。
  • 钱包节点的用户检查他们的支付是否成功。

    用例图:

阶段小结 - 图5

请求区块同步时序图:

阶段小结 - 图6

交易处理时序图:

阶段小结 - 图7

undefined区块链的网络通信主要功能

1)区块同步。通过网络请求,下载本地缺失的区块;

2)发送交易。

3)接收交易,通过挖矿将交易上链。

undefined区块链应用层通信协议设计

阶段小结 - 图8

惯常的做法,我们会用command+payload的方式设计应用层协议,其中要注意到是,command的长度一般需要固定,在解析传送来的数据时候,先解析命令,再在不同命名的处理函数中,解析该命令的payload。

Go很适合网络开发,struct是网络进行payload传输很适合的定义方式。

undefined区块链网络通信特点

1、区块链是P2P网络,因此加入区块链的每一个节点,既是服务器,也是客户端。

所以,一般在sendData时候,都会将发送者的addr作为payload的一部分,发送给对方。

2、P2P通信,是点对点的强通信方式,多次请求-回答完成交互,从发送“麻烦告诉我你版本是什么”开始,发现本地版本比对方低,于是接着发送“麻烦告诉我你有什么”,对方将回复区块或交易的概要(哈希列表),再紧接着向对方要具体的数据(如某个区块或者某个交易)。

3、由于是P2P通信,所以每次请求-回答的数据都很小:在区块链中,每次请求只会请求一个区块的数据或者一个交易的数据,这将最大限度保证通信的可靠性。