2021年最新以太坊源码导读-p2p架构

  前面部分的内容都是源码导读,可能有的朋友没有耐心把所有代码看完。这里我采用尽可能简单的方式来介绍p2p这部分的代码究竟做了什么。

一、概念篇

p2p是peer-to-peer的缩写,以太坊网络是一个去中心的对等网络,因此需要有一个机制来实现网络间节点的相互发现,即当一个新的节点运行起来后,究竟如何加入网络?加入网络之后,节点之间如何通信?p2p部分采用了UDP协议做网络发现,采用了TCP协议用于节点间通信。下面简单介绍两个协议的基本流程。

二、TCP连接

此部分的流程如下图

1.打开TCP端口监听,这是一个可选项,因为有的节点可能只希望从其他的节点同步数据,并不希望监听端口,监听端口意味着有其他节点连入服务器,这会消耗节点的性能及网络的流量。

2.插槽。插槽是一个抽象的概念,默认有50个插槽,只有当插槽有空闲的时候,服务器才会处理新到来的连接。这个设计保证了服务器的安全,设定了服务器最多同时处理新到来的连接的上限,使得服务器不会因为大量连接同时到来而性能骤降。

3.ip白名单。这也是一个关于安全的设计,只有符合网络策略的节点才能与服务器建立连接。

4.握手协议。握手会有两次,第一次是p2p网络通用的RLPx协议(关于此协议,大家请自行百度,我就不赘述了)握手,这个协议实现了加密的通信;第二次是节点支持的协议的握手,可能存在节点间版本不一致的情况,因此,节点间沟通自身支持的协议名称及对应版本,确保双方至少有一个协议相同,否则无法通信。

5.一切完成之后,服务器与对等节点建立了连接,并持续处理节点消息的收发。

三、UDP连接

这部分的内容涉及kademlia算法,如果不明白请先搜索学习。大致的逻辑也很简单,如下图。

1.启动UDP端口监听

2.根据配置的bootstrap node初始化table,此处的table是一个kademlia算法中桶的实现

3.启动一个独立的goroutine,定期更新桶中的节点,并持久化节点到本地DB

4.启动一个独立的goroutine,响应来自其他节点的消息

猜你喜欢

转载自blog.csdn.net/HardRedStone/article/details/118391184