EOS系列 - 源码解读心得 - P2P网络模块

EOS P2P 网络模块

P2P - Gossip

Gossip算法又被称为反熵(Anti-Entropy),熵是物理学上的一个概念,代表杂乱无章,而反熵就是在杂乱无章中寻求一致,这充分说明了Gossip的特点:在一个有界网络中,每个节点都随机地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致。每个节点可能知道所有其他节点,也可能仅知道几个邻居节点,只要这些节点可以通过网络连通,最终它们的状态就都是一致的,当然这也是疫情传播的特点。

如何发现节点

  1. 节点会记住它最近成功连接的网络节点,当重新启动后它可以迅速与先前的对等节点网络重新建立连接。
  2. 节点会在失去已有连接时尝试发现新节点。
  3. 当建立一个或多个连接后,节点将一条包含自身 IP 地址消息发送给其相邻节点。相邻节点再将此消息依次转发给它们各自的相邻节点,从而保证节点信息被多个节点所接收、保证连接更稳定。
  4. 新接入的节点可以向它的相邻节点发送获取地址 getaddr 消息,要求它们返回其已知对等节点的 IP 地址列表。节点可以找到需连接到的对等节点。
  5. 在节点启动时,可以给节点指定一个正活跃节点 IP, 如果没有,客户端也维持一个列表,列出了那些长期稳定运行的节点。这样的节点也被称为种子节点(其实和 BT 下载的种子文件道理是一样的),就可以通过种子节点来快速发现网络中的其他节点。

Gossip邻居交换协议:

  • 节点会周期性剔除长时间未更新的邻居
  • 随着系统规模变得越来越大,节点收到的同步信息也越来越多,以至于系统的吞吐率会随着节点数目的增加而降低

EOS 的P2P没有采用Gossip算法

通过配置文件或者命令行增加 P2P 结点列表

节点通信

节点通常采用 TCP 协议、使用指定端口与相邻节点建立连接,建立连接时也会有认证 “握手” 的通信过程(handshake_message)。握手包内容包括:网络版本、chain_id、node_id、p2p_address、节点名称等配置信息,以及链的状态(当前节点的不可逆区块数、不可逆区块id、最新区块id、最新区块数)。

当节点收到相邻节点的handshake_message,接着就开始对比区块信息。如果其自身的本地区块链比其他节点的区块链更长,并告诉其他节点需要补充区块(notice_message),其他节点发送 sync_request_message 消息来请求区块,其他节点收到区块数据后并验证后更新到本地区块链中。如果自身的本地区块链比其他节点的短,则向其他节点发送 sync_request_message 去请求区块。


从另一个节点同步区块

在这里插入图片描述

同步时的状态比较

区块同步的更详细的说明:

发布了61 篇原创文章 · 获赞 70 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wcc19840827/article/details/104122659
今日推荐