go ethereum之p2p
简介p2p是以太坊节点网络层的骨架夹在底层 TCP/UDP 和应用协议eth、snap、les之间管三件事节点发现谁在线、连接管理怎么连上、怎么断、消息多路复用连上了跑什么协议重要结构主要有ServerPeer表示一个连接Server结构定义为typeServerstruct{// Config fields may not be modified while the server is running.Config// Hooks for testing. These are useful because we can inhibit// the whole protocol stack.newTransportfunc(net.Conn,*ecdsa.PublicKey)transport newPeerHookfunc(*Peer)listenFuncfunc(network,addrstring)(net.Listener,error)lock sync.Mutex// protects runningrunningboollistener net.Listener ourHandshake*protoHandshake loopWG sync.WaitGroup// loop, listenLooppeerFeed event.Feed log log.Logger nodedb*enode.DB localnode*enode.LocalNode discv4*discover.UDPv4 discv5*discover.UDPv5 discmix*enode.FairMix dialsched*dialScheduler// This is read by the NAT port mapping loop.portMappingRegisterchan*portMapping// Channels into the run loop.quitchanstruct{}addtrustedchan*enode.Node removetrustedchan*enode.Node peerOpchanpeerOpFunc peerOpDonechanstruct{}delpeerchanpeerDrop checkpointPostHandshakechan*conn checkpointAddPeerchan*conn// State of run loop and listenLoop.inboundHistory expHeap}Configp2p服务端配置listener监听器接受连接discv4,discv5,discmix节点发现dialsched向外连接peerOp对接操作localnode结点的ENRPeer结构定义为typePeerstruct{rw*conn runningmap[string]*protoRW log log.Logger created mclock.AbsTime wg sync.WaitGroup protoErrchanerrorclosedchanstruct{}pingRecvchanstruct{}discchanDiscReason// events receives message send / receive events if setevents*event.Feed testPipe*MsgPipeRW// for testing}启动通过Start启动p2p,主要作以下事项setupLocalNode创建dev2p handshake和localnodesetupPortMapping开启端口映射循环根据NAT配置执行不同的协程setupListening开启监听协程listenLoop处理外部连接setupDiscovery开启节点发现根据配置开启发现服务discv4,discv5setupDialScheduler开启拨号调度器dialScheduler开启两个协程readNodes和loopsrv.run()处理通道事件如新连接等