💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 前言 本节对前面内容做一个总结,以便更加清晰地看到区块链的实现方式,包含技术、设计思路、类的组织等。 # 类图 ![](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通信,所以每次请求-回答的数据都很小:在区块链中,每次请求只会请求一个区块的数据或者一个交易的数据,这将最大限度保证通信的可靠性。