Venus 同步代码解读

venus/app/submodule/syncer/syncer_submodule.go的Start()方法会启动一个for循环,不停的接受订阅/fil/blocks/{networkName}的区块信息,然后调用handleIncomingBlocks()方法处理收到的区块。处理方法逻辑也

venus/app/submodule/syncer/syncer_submodule.goStart()方法会启动 一个for循环,不停的接受订阅/fil/blocks/#{networkName}的区块信息,然后调用handleIncomingBlocks()方法处理收到的区块。处理方法逻辑也非常简单,只有两个动作,一个是把收到的区块header存储到数据库。另一动作是开启一个goroutine,在goroutine里面请求一下header对应的messages(但是不存储,奇怪,为什么不存储呐?),然后把header通过调用pkg/chainsync/dispatcher/dispatcher.go::SendGossipBlock()方法把区块header广播出去。

不管是SendGossipBlock()还是SendOwnBlock(),两个方法都是把要发送出去的参数放进imcomming的一个channel,然后processingIncoming()会通过for循环不停的读取incommingchannel的信息,然后把信息通过调用pkc/chainsync/types/target_tracker.go::Add()方法,把Target对象放入TargetTracker对象,这个对象主要作用是一个优先级队列。

pkg/chainsync/dispatcher/dispatcher.go::syncWoker()方法是在系统启动时就开启的一个for循环goroutine,方法会监听一个target的channel,每当有新的target通过target_tracker::Add()加入到队列时,就会触发channel,syncWorkder()方法内部就会调用selectTarget()来获取优先级最高的target,然后开启一个goroutine去调用syncer.HandleNewTipSet()方法来获取一系列tipset,对tipset的block进行验证,计算里面的messsage,修改区块状态。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
杜满想Elvin
杜满想Elvin
老程序员,区块链架构师