• 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必须指定,否则会出错.

  • 相关阅读:
    DP动态规划【专辑@AbandonZHANG】
    Abandon の DP动态规划【专辑】(长期更新)
    可持久化线段树【专题@AbandonZHANG】
    DP动态规划【专辑@AbandonZHANG】
    最近公共祖先LCA 【专题@AbandonZHANG】
    最近公共祖先LCA 【专题@AbandonZHANG】
    可持久化线段树【专题@AbandonZHANG】
    SDK , MFC 和 API
    2007年12月英语四级预测作文大全3
    Ajax介绍
  • 原文地址:https://www.cnblogs.com/baizx/p/7898355.html
Copyright © 2020-2023  润新知