以太坊系列之七: p2p模块的dial--以太坊源码学习

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

posted on 2017-06-08 16:43  baizx  阅读(3635)  评论(0编辑  收藏  举报