以太坊系列之七: 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM