一.本章导学
区块链网络节点间的通信相对于传统系统存在较为明显的区别,借助“P2P"通信技术,区块链网络中可实现节点与节点间的数据直传。本章节在此类知识将首先比较不同类别的区块链网络,分析相应优缺点,借用networkx绘制不同类别的区块链网络。接下来,本章节将介绍“P2P”通信,并借用Python相关依赖包实现点对点通信。最后,本章节将介绍Gossip协议,并借助Python相关依赖包实现基于Gossip协议通信的系统。
二.学习目标
1.掌握区块链网络的基本概念,能够使用外置依赖库绘制网络拓扑模型。
2.掌握P2P网络通信的基本概念以及Socket通信的实现方式。
3.掌握基于Socket通信的P2P通信原理,能够使用程序设计语言实现P2P通信。
4.掌握区块链网络通信的基本概念以及Gossip协议的实现方法。
5.掌握基于程序设计编码的定时器工具及实现方法。
三.思维导图
四.使用networkx绘制
第一步:
创建文件
第二步:
安装networkx和 matplotlib
Pip install network
Pip install matplotlib
第三步:
绘制图形,借助matplotlib依赖包实现,在导入matplotlib包之后使用networkx中的draw模块导入图形,完善相应的代码
创建一个简单的网络
五.绘制不同的区块链网络
使用 NetworkX 绘制不同类型的区块链网络,包括私有链网络、联盟链网络以及公有 链网络
第一步:绘制私有链网络
创建空图形,并加入一个中心节点,创建若干节点,并绘制节点与中心节点的边。
代码:
效果图:
-
第二步:绘制联盟链网络
创建空图形,并在其中加入若干中心节点,将中心节点通过相互联结,为每个中心节点创建若干子节点。
代码:
效果图:
-
第三步:绘制公有链网络
加入节点数量参数以及节点连接的复杂度
代码:
效果图:
六. 实现p2p客户端和服务器通信
第一步:
定义p2p的客户端(p2p_client.py)和服务端(p2p_server.py),运行代码实现点对点通信。
1.使用Flask-scoketio创建socket接口需要基于Flask依赖创建app变量,再通过Flask-scoketio基于app创建了my_scoketio变量,在代码最后也是通过这个变量启动程序。通过@my_socket.on()方法实现socket接口定义,然后终端中启动。
代码:
效果图:
第二步:
2.首先通过socketio.Client()创建sio 变量,这一步 的sio 为创建客户端请求的主体,通过sio可实现客户端向服务端发送数据请求。再之后使用sio.connect(方法与建立客户端与服务端连接的通道,这里http://localhost:5000配置内容需要能够指向服务端,最后以循环的方式通过sio.emit0方法向服务端发送请求,其中“message" 配置了Socket 接口的要求项,‘hello, this is client’为向服务端发送的数据。最后,每次循环执行都将通过time.sleep(1)的方式休眠1秒。
代码:
效果图:
七.区块链节点通信
分别使用Flask-apcheduler中的配置文件形式以及装饰器形式实现定时器功能。
(1)配置文件形式
(2)定时器形式
八. Pow共识算法
定义Block对象以及pow算法函数。通过定义一个区块后调用pow算法,实现竞争记账权功能。
第一步:
创建models.py文件模块,在其中加入区块block的信息
第二步:
需要使用区块难度生成目标值,再通过目标值反复生成区块头的哈希值与其比较,最终得到符合条件的区块头,首先
创建区块难度difficult_bits
创建示例区块my_block
定义目标值Target的生成函数generate_target
定义Pow算法,具体为针对示例区块通过反复运算获取符合小于目标值的区块头。
输出结果: