以太坊p2p模块的dial--以太坊源码学习

tech2022-10-04  81

dial.go阅读手记

dial.go是负责和peer建立连接关系的地方,主要是实现

type dialer interface { /* peers已经有的结点 */ newTasks(running int, peers map[discover.NodeID]*Peer, now time.Time) []task taskDone(task, time.Time) addStatic(*discover.Node) removeStatic(*discover.Node) } // dialstate schedules dials and discovery lookups. // it get's a chance to compute new tasks on every iteration // of the main loop in Server.run. type dialstate struct { maxDynDials int ntab discoverTable netrestrict *netutil.Netlist lookupRunning bool dialing map[discover.NodeID]connFlag //正在创建的连接 lookupBuf []*discover.Node // current discovery lookup results randomNodes []*discover.Node // filled from Table static map[discover.NodeID]*dialTask hist *dialHistory start time.Time // time when the dialer was first used bootnodes []*discover.Node // default dials when there are no peers }

其中最复杂的是newTasks,是建立新的连接,从test代码中可以看出, 要在指定的最大连接数(peers)基之上去创建新的连接

lookupBuf // current discovery lookup results 主要是在结束taskdone的时候添加已经发现的?

在不超过maxDynDials的情况下,首先减去peers已有的连接,然后是static中的任务, 如果过还有富余,富余空间中最多一半(根据实现,可能为0)用ReadRandomNodes填充,剩下的 就用lookupBuf来填充,如果lookbuf中没有有效的任务,那么就创建一个discoverTask, 如果还有空间,就创建一个waitExpireTask

总之newTasks就是在尽可能的情况下,多创建任务.为Server.run scheduleTasks时服务, 保证其能够连接到尽可能多的节点.如果节点数量不够的情况下,还没有dialTask就创建discoverTask,否则就创建一个WaitExpireTask

最新回复(0)