zoukankan      html  css  js  c++  java
  • p2p_server

    以太坊系列之十九 对p2p模块server的理解

    type transport interface {
    	// The two handshakes.
    	doEncHandshake(prv *ecdsa.PrivateKey, dialDest *discover.Node) (discover.NodeID, error)
    	doProtoHandshake(our *protoHandshake) (*protoHandshake, error)
    	// The MsgReadWriter can only be used after the encryption
    	// handshake has completed. The code uses conn.id to track this
    	// by setting it to a non-nil value after the encryption handshake.
    	MsgReadWriter
    	// transports must provide Close because we use MsgPipe in some of
    	// the tests. Closing the actual network connection doesn't do
    	// anything in those tests because NsgPipe doesn't use it.
    	close(err error)
    }
    type conn struct {
    	fd        net.Conn
    	transport //指向真正的transport实现,rlpx
    	flags     connFlag
    	cont      chan error      // The run loop uses cont to signal errors to setupConn.
    	id        discover.NodeID // valid after the encryption handshake
    	caps      []Cap           // valid after the protocol handshake
    	name      string          // valid after the protocol handshake
    }
    // Server manages all peer connections.
    type Server struct {
    	// 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.
    	newTransport func(net.Conn) transport 
    	newPeerHook  func(*Peer)
    
    	lock    sync.Mutex // protects running
    	running bool
    
    	ntab         discoverTable
    	listener     net.Listener
    	ourHandshake *protoHandshake
    	lastLookup   time.Time
    	DiscV5       *discv5.Network
    
    	// These are for Peers, PeerCount (and nothing else).
    	peerOp     chan peerOpFunc
    	peerOpDone chan struct{}
    
    	quit          chan struct{}
    	addstatic     chan *discover.Node
    	removestatic  chan *discover.Node
    	posthandshake chan *conn
    	addpeer       chan *conn
    	delpeer       chan peerDrop
    	loopWG        sync.WaitGroup // loop, listenLoop
    }
    

    Server是暴露给上层使用的接口,配置完毕以后,直接调用Start就可以了,其中Start做了非常复杂的工作.主要是启动监听端口,等待连接.这里会创建多个goroutine,完毕以后进入run,run实际上就是一个汇聚层,其他的goroutine都回把得到的结果通过channel形式汇报给主goroutine,也就是run,由run集中处理,避免并发冲突.
    另外run的另一个重要功能就是不断的调用dialstate,来创建连接,维护与结点的连接.也就是scheduleTasks.

    创建Server,对于用户来说主要是指定一个newPeerHook,这样当有了新的结点以后,就可以和这些结点进行通信,通信的格式是Msg,这个应该是用户最关心的.

    newTransport 是和结点建立连接(tcp或者udp)以后进行协商密钥,协议握手的地方,实际上是newRLPX.也就是rlpx来负责.

    这里先说说Config,这里的PrivateKey必须指定,否则会出错.

  • 相关阅读:
    Fedora 19 配置参考
    Lua 函数、闭包、尾调用总结
    基于MFC简单图片裁剪工具
    【OpenGL 学习笔记04】顶点数组
    【OpenGL 学习笔记03】点画多边形
    【OpenGL 学习笔记02】宽点画线
    【OpenGL 学习笔记01】HelloWorld示例
    【SSH + BootStrap】实现的无线点餐系统
    【C++ 基础 11】 函数指针总结
    【C++基础 10】四种cast转换的区别
  • 原文地址:https://www.cnblogs.com/baizx/p/7898355.html
Copyright © 2011-2022 走看看