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

  • 相关阅读:
    image对象
    Frame/IFrame 对象
    Form 对象
    JavaScript 对象 实例
    button对象
    正则介绍以及多种使用方法
    js /jquery停止事件冒泡和阻止浏览器默认事件
    一些兼容性的知识
    面试题总结
    事件
  • 原文地址:https://www.cnblogs.com/baizx/p/6963645.html
Copyright © 2020-2023  润新知