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

  • 相关阅读:
    CF785CAnton and Permutation(分块 动态逆序对)
    Codeforces617E XOR and Favorite Number(分块 异或)
    POJ2155 Matrix(二维树状数组||区间修改单点查询)
    阿里云重磅发布数据库专家服务
    Dataphin公共云重磅发布,提供一站式智能数据构建与管理能
    阿里大数据产品Dataphin上线公共云,将助力更多企业构建数据中台
    快速完成智能数据构建,Dataphin公共云版本全面解读
    微服务开源生态报告 No.1
    分享 KubeCon 2019 (上海)关于 Serverless 及 Knative 相关演讲会议
    MaxCompute 费用暴涨之存储压缩率降低导致SQL输入量变大
  • 原文地址:https://www.cnblogs.com/baizx/p/7898355.html
Copyright © 2011-2022 走看看