Tendermint之P2P

P2P在区块链中是最基础的角色,它负责把节点带入网络、消息传递,驱动整个网络正常运转。

之前有介绍比特币和以太坊的P2P模块,那么Tendermint的P2P是怎样的呢


P2P连入网络需要seed,比特币和以太网坊是写在代码里的,tendermint需要参数传递,可能从官网或者什么地方可以拿到。

节点连接分为inbound和outbound

inbound的意思是别的节点连入自己

outbound的意思是自己主动连接别的节点

outbound的连接有两种:

1 节点启动的时候指定seeds,启动的时候会尝试连接所有的seed

2 初始化的时候有pex reactor(peer exchange),会启动goroutine定期检测outbound的数量,如果少于10个,就从本地保存的节点连接

那么本地保存的节点是哪里来的呢

outbound节点连接成功后,pex reactor发现本地保存的节点小于1000个会向对端节点获取节点,然后保存在本地

inbound的连接只有一种:

节点启动的时候监听connection,有连接连入的时候会判断目前是否有50个连接,如果够了就忽略新的连接

所以一般情况下节点的outbound数量至少为10,总的连接数量为50个(可能会有多于50个的情况,比如刚开始指定过多的seeds)

消息通讯

P2P模块初始化的时候,也会初始化mempool reactor、blockchain reactor、consensus reactor、evidence reactor(还有上面讲述的pex reactor),然后add到p2p模块,不同的reactor带不同的channel id

当mempool、blockchain、consensus、evidence模块发送消息的时候,调用p2p模块的send,参数有channel id

对端节点p2p模块收到消息后,会根据channel id把消息转发给对应的模块


你可能感兴趣的:(区块链)