# 前言
本节对前面内容做一个总结,以便更加清晰地看到区块链的实现方式,包含技术、设计思路、类的组织等。
# 类图
![](https://img.kancloud.cn/9b/f6/9bf6be8cc155f0614f2dbe95d0a0317f_1701x1437.png)
在Go语言里面的类的function和field的访问控制包括private和public两种,他们的区别是:大写字母命名的均为public,小写字母命名的都是private。
# 三个核心类
Block、Blockchain、Transaction是三个核心类。
(1)Block类:区块
![](https://img.kancloud.cn/4f/ed/4fedaa85226f30d64d6e0d24d543dcac_328x320.png)
Block是区块链进行扩展最重要的地方。
接下来,我们将在区块链里面增加Data字段,以将更多的信息保存到区块链上。
(2)Transaction类:交易
![](https://img.kancloud.cn/0b/18/0b18c3bbef663780562be8f57644a723_632x412.png)
一个交易,包含输入输出,它体现了区块链的核心设计:在匿名情况下,如何保证交易的可靠进行,将交易发送人以前未花费的输出纳入到本次交易的输入,交易完成后,零钱发回到交易发送人。此外,对输入的签名和上链前的校验(输入包含自校验所需的所有信息),也是保证匿名交易达成的重要设计。
交易的输入和输出,我们将在后面进行扩展成脚本语言,解决多重签名需求,并实现真正的智能合约。
(3)Blockchain:区块链
![](https://img.kancloud.cn/2e/0c/2e0cf8405486453c64cd1b767d6d920a_707x510.png)
区块链是分布式数据库。
我们把Block、UTXO、UTXOBlock保存到数据库中。其中最关键的是Block数据库表,为了提高效率,我们将UTXO、UTXOBlock也存入到数据库中。
# 区块链的主要应用场景
在区块链的主要交易场景中,交易是P2PKH(Pay To Public Hash),涉及三个节点:
(1)中心节点
(2)钱包节点
(3)矿工节点
1. 中心节点创建一个区块链。
2. 一个其他(钱包)节点连接到中心节点并下载区块链。
3. 另一个(矿工)节点连接到中心节点并下载区块链。
4. 钱包节点创建一笔交易。
5. 矿工节点接收交易,并将交易保存到内存池中。
6. 当内存池中有足够的交易时,矿工开始挖一个新块。
7. 当挖出一个新块后,将其发送到中心节点。
8. 钱包节点与中心节点进行同步。
9. 钱包节点的用户检查他们的支付是否成功。
用例图:
![](https://img.kancloud.cn/5f/65/5f65d82f41da98d5559fbc8b71a1e5ec_861x1131.png)
请求区块同步时序图:
![](https://img.kancloud.cn/a5/c3/a5c3cd96c52f0fd106bb111c7e81c360_356x231.png)
交易处理时序图:
![](https://img.kancloud.cn/b4/1e/b41e8342df81b18737e3d7b2983a23bb_786x263.png)
# 区块链的网络通信主要功能
1)区块同步。通过网络请求,下载本地缺失的区块;
2)发送交易。
3)接收交易,通过挖矿将交易上链。
# 区块链应用层通信协议设计
![](https://img.kancloud.cn/49/4c/494c7a488e9646b4e189c7947ab33513_447x134.png)
惯常的做法,我们会用command+payload的方式设计应用层协议,其中要注意到是,command的长度一般需要固定,在解析传送来的数据时候,先解析命令,再在不同命名的处理函数中,解析该命令的payload。
Go很适合网络开发,struct是网络进行payload传输很适合的定义方式。
# 区块链网络通信特点
1、区块链是P2P网络,因此加入区块链的每一个节点,既是服务器,也是客户端。
所以,一般在sendData时候,都会将发送者的addr作为payload的一部分,发送给对方。
2、P2P通信,是点对点的强通信方式,多次请求-回答完成交互,从发送“麻烦告诉我你版本是什么”开始,发现本地版本比对方低,于是接着发送“麻烦告诉我你有什么”,对方将回复区块或交易的概要(哈希列表),再紧接着向对方要具体的数据(如某个区块或者某个交易)。
3、由于是P2P通信,所以每次请求-回答的数据都很小:在区块链中,每次请求只会请求一个区块的数据或者一个交易的数据,这将最大限度保证通信的可靠性。
- 重要更新说明
- linechain发布
- linechain新版设计
- 引言一
- 引言二
- 引言三
- vs-code设置及开发环境设置
- BoltDB数据库应用
- 关于Go语言、VS-code的一些Tips
- 区块链的架构
- 网络通信与区块链
- 单元测试
- 比特币脚本语言
- 关于区块链的一些概念
- 区块链组件
- 区块链第一版:基本原型
- 区块链第二版:增加工作量证明
- 区块链第三版:持久化
- 区块链第四版:交易
- 区块链第五版:实现钱包
- 区块链第六版:实现UTXO集
- 区块链第七版:网络
- 阶段小结
- 区块链第八版:P2P
- P2P网络架构
- 区块链网络层
- P2P区块链最简体验
- libp2p建立P2P网络的关键概念
- 区块链结构层设计与实现
- 用户交互层设计与实现
- 网络层设计与实现
- 建立节点发现机制
- 向区块链网络请求区块信息
- 向区块链网络发布消息
- 运行区块链
- LineChain
- 系统运行流程
- Multihash
- 区块链网络的节点发现机制深入探讨
- DHT
- Bootstrap
- 连接到所有引导节点
- Advertise
- 搜索其它peers
- 连接到搜到的其它peers
- 区块链网络的消息订发布-订阅机制深入探讨
- LineChain:适用于智能合约编程的脚本语言支持
- LineChain:解决分叉问题
- LineChain:多重签名
- libp2p升级到v0.22版本
- 以太坊基础
- 重温以太坊的树结构
- 世界状态树
- (智能合约)账户存储树
- 交易树
- 交易收据树
- 小结
- 以太坊的存储结构
- 以太坊状态数据库
- MPT
- 以太坊POW共识算法
- 智能合约存储
- Polygon Edge
- block结构
- transaction数据结构
- 数据结构小结
- 关于本区块链的一些说明
- UML工具-PlantUML
- libp2p介绍
- JSON-RPC
- docker制作:启动多个应用系统
- Dockerfile
- docker-entrypoint.sh
- supervisord.conf
- docker run
- nginx.conf
- docker基础操作整理
- jupyter计算交互环境
- git技巧一
- git技巧二
- 使用github项目的最佳实践
- windows下package管理工具