这篇跟上一篇的区别是同步数据完成之后,以太坊的工作流程是怎样的
初始化
eth/handler.go
func (pm *ProtocolManager) Start(maxPeers int) {
pm.maxPeers = maxPeers
// broadcast transactions
pm.txCh = make(chan core.TxPreEvent, txChanSize)
pm.txSub = pm.txpool.SubscribeTxPreEvent(pm.txCh)
go pm.txBroadcastLoop()
// broadcast mined blocks
pm.minedBlockSub = pm.eventMux.Subscribe(core.NewMinedBlockEvent{})
go pm.minedBroadcastLoop()
// start sync handlers
go pm.syncer()
go pm.txsyncLoop()
}
初始化Start的时候会新建4个goroutine:
txBroadcastLoop: 当收到新的tx时,会将它发送到连接的Peer
MinedBroadcastLoop:当挖出新的区块或者收到新的区块时,会将其发送到连接的Peer
syncer:有新的Peer连接时,会新建goroutine从td最高的Peer同步区块信息
txsyncLoop:当监听到txsyncCh有数据时(新连接peer时会把自身的txpool写到这个channel),新建goroutine发送tx记录到连接的Peer
广播交易
订阅tx消息
上面Start()的时候订阅了txCh消息