0%

《7天以太坊源码解读》 — 3、p2p服务、eth服务介绍

>>> p2p服务介绍

前面的文章指出了,节点启动后会率先配置一个p2p Server然后启动它,那这个服务器是干嘛的呢?

看代码

主要分析p2p/server.go 642行开始的函数(这个函数是前面开启的一个协程运行的)

  1. 初始化一些变量,用来记录p2p的一些信息。比如当前有哪些邻节点等等
  2. 使用for循环以及通道实现了一个拨号任务队列。不停的向邻节点拨号以监控他们的状态,一旦有节点拨号失败,就会更新本节点p2p的信息。并且订阅 添加peer、移除peer 等操作事件。
  3. 每当连接到一个新的节点,都会启动一个新的协程来处理与这个邻节点的信息传输以及交互(ping pong、节点描述信息等等。节点之间的信息传输都是使用的RLP编码)。
  4. 初始化 p2p 服务器时已经将各个service的协议传递过来。这里会使用新的协程启动每个协议,好让节点发过来的数据按照其协议分发到各个服务手里,然后各个服务进行响应的处理。(每个服务都设计了一个应用层协议,比如eth 服务)

总之 p2p 服务主要负责以下:

  1. 维护邻节点的连接
  2. 接收、处理、编码、解码以及发送各类消息

>>> eth服务介绍

eth服务是节点启动时必须启动的一个服务。eth服务的启动入口位于 eth/backend.go 522行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func (s *Ethereum) Start(srvr *p2p.Server) error {
s.startEthEntryUpdate(srvr.LocalNode())

// Start the bloom bits servicing goroutines
s.startBloomHandlers(params.BloomBitsBlocks)

// Start the RPC service
s.netRPCService = ethapi.NewPublicNetAPI(srvr, s.NetVersion())

// Figure out a max peers count based on the server limits
maxPeers := srvr.MaxPeers
if s.config.LightServ > 0 {
if s.config.LightPeers >= srvr.MaxPeers {
return fmt.Errorf("invalid peer config: light peer count (%d) >= total peer count (%d)", s.config.LightPeers, srvr.MaxPeers)
}
maxPeers -= s.config.LightPeers
}
// Start the networking layer and the light server if requested
s.protocolManager.Start(maxPeers)
if s.lesServer != nil {
s.lesServer.Start(srvr)
}
return nil
}
  1. 订阅 ChainHeadEvent 事件
  2. 开启多个协程处理布隆过滤请求(想了解布隆过滤器的原理,推荐阅读 https://www.chongdongshequ.com/article/1557228593384.html
  3. 启动api服务器
  4. 开启新协程订阅交易池出现新交易事件,一出现就广播
  5. 开启新协程订阅矿工挖出新块事件,一出现就广播
  6. 开启新协程开始同步区块
  7. 开启新协程开始同步交易
  8. 如果开启了LES服务器的话就启动它

总之,eth服务主要负责以下几块:

  1. 区块同步
  2. 布隆过滤器维护
  3. 交易广播
  4. 提供eth模块相关api访问

文章仅供参考,若有错误,还望不吝指正 !!!




微信关注我,及时接收最新技术文章