>>> p2p服务介绍
前面的文章指出了,节点启动后会率先配置一个p2p Server然后启动它,那这个服务器是干嘛的呢?
看代码
主要分析p2p/server.go 642行开始的函数(这个函数是前面开启的一个协程运行的)
- 初始化一些变量,用来记录p2p的一些信息。比如当前有哪些邻节点等等
- 使用for循环以及通道实现了一个拨号任务队列。不停的向邻节点拨号以监控他们的状态,一旦有节点拨号失败,就会更新本节点p2p的信息。并且订阅 添加peer、移除peer 等操作事件。
- 每当连接到一个新的节点,都会启动一个新的协程来处理与这个邻节点的信息传输以及交互(ping pong、节点描述信息等等。节点之间的信息传输都是使用的RLP编码)。
- 初始化 p2p 服务器时已经将各个service的协议传递过来。这里会使用新的协程启动每个协议,好让节点发过来的数据按照其协议分发到各个服务手里,然后各个服务进行响应的处理。(每个服务都设计了一个应用层协议,比如eth 服务)
总之 p2p 服务主要负责以下:
- 维护邻节点的连接
- 接收、处理、编码、解码以及发送各类消息
>>> eth服务介绍
eth服务是节点启动时必须启动的一个服务。eth服务的启动入口位于 eth/backend.go 522行
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
}
- 订阅 ChainHeadEvent 事件
- 开启多个协程处理布隆过滤请求(想了解布隆过滤器的原理,推荐阅读 www.chongdongshequ.com/article/155… )
- 启动api服务器
- 开启新协程订阅交易池出现新交易事件,一出现就广播
- 开启新协程订阅矿工挖出新块事件,一出现就广播
- 开启新协程开始同步区块
- 开启新协程开始同步交易
- 如果开启了LES服务器的话就启动它
总之,eth服务主要负责以下几块:
- 区块同步
- 布隆过滤器维护
- 交易广播
- 提供eth模块相关api访问
文章仅供参考,若有错误,还望不吝指正 !!!