Explorar el Código

可以setup connection

skyfffire hace 2 años
padre
commit
e94b1f9c24
Se han modificado 3 ficheros con 57 adiciones y 13 borrados
  1. 14 3
      p2p/enode/urlv4.go
  2. 3 3
      p2p/peer.go
  3. 40 7
      p2p/server.go

+ 14 - 3
p2p/enode/urlv4.go

@@ -54,8 +54,8 @@ func MustParseV4(rawurl string) *Node {
 //
 // For incomplete nodes, the designator must look like one of these
 //
-//    enode://<hex node id>
-//    <hex node id>
+//	enode://<hex node id>
+//	<hex node id>
 //
 // For complete nodes, the node ID is encoded in the username portion
 // of the URL, separated from the host by an @ sign. The hostname can
@@ -68,7 +68,7 @@ func MustParseV4(rawurl string) *Node {
 // a node with IP address 10.3.58.6, TCP listening port 30303
 // and UDP discovery port 30301.
 //
-//    enode://<hex node id>@10.3.58.6:30303?discport=30301
+//	enode://<hex node id>@10.3.58.6:30303?discport=30301
 func ParseV4(rawurl string) (*Node, error) {
 	if m := incompleteNodeURL.FindStringSubmatch(rawurl); m != nil {
 		id, err := parsePubkey(m[1])
@@ -80,6 +80,17 @@ func ParseV4(rawurl string) (*Node, error) {
 	return parseComplete(rawurl)
 }
 
+func NodeFromConn(pubkey *ecdsa.PublicKey, conn net.Conn) *Node {
+	var ip net.IP
+	var port int
+	if tcp, ok := conn.RemoteAddr().(*net.TCPAddr); ok {
+		ip = tcp.IP
+		port = tcp.Port
+	}
+
+	return NewV4(pubkey, ip, port, port)
+}
+
 // NewV4 creates a node from discovery v4 node information. The record
 // contained in the node has a zero-length signature.
 func NewV4(pubkey *ecdsa.PublicKey, ip net.IP, tcp, udp int) *Node {

+ 3 - 3
p2p/peer.go

@@ -30,9 +30,9 @@ const (
 
 // protoHandshake is the RLP structure of the protocol handshake.
 type protoHandshake struct {
-	Version uint64
-	Name    string
-	//Caps       []Cap
+	Version    uint64
+	Name       string
+	Caps       []Cap
 	ListenPort uint64
 	ID         []byte // secp256k1 public key
 

+ 40 - 7
p2p/server.go

@@ -54,8 +54,8 @@ type Server struct {
 	//peerOp                  chan peerOpFunc
 	//peerOpDone              chan struct{}
 	//delpeer                 chan peerDrop
-	//checkpointPostHandshake chan *conn
-	//checkpointAddPeer       chan *conn
+	checkpointPostHandshake chan *conn
+	checkpointAddPeer       chan *conn
 
 	// State of run loop and listenLoop.
 	//inboundHistory expHeap
@@ -63,6 +63,8 @@ type Server struct {
 
 func (server *Server) Start() (err error) {
 	server.quit = make(chan struct{})
+	server.checkpointPostHandshake = make(chan *conn)
+	server.checkpointAddPeer = make(chan *conn)
 
 	if err := server.setupLocalNode(); err != nil {
 		return err
@@ -214,15 +216,46 @@ func (server *Server) SetupConn(fd net.Conn, flags connFlag, dialDest *enode.Nod
 }
 
 func (server *Server) setupConn(c *conn, dialDest *enode.Node) error {
-	//
-	//remotePubkey, err := c.doEncHandshake(server.PrivateKey)
-	//if err != nil {
-	//	return err
-	//}
+	remotePubkey, err := c.doEncHandshake(server.PrivateKey)
+	if err != nil {
+		return err
+	}
+
+	// 将connection转换成node
+	c.node = enode.NodeFromConn(remotePubkey, c.fd)
+	fmt.Printf("id: %v, addr: %v, conn: %v", c.node.ID(), c.fd.RemoteAddr(), c.flags)
+
+	// 检查是否需要握手
+	err = server.checkpoint(c, server.checkpointPostHandshake)
+	if err != nil {
+		return err
+	}
+
+	// 进行握手
+	phs, err := c.doProtoHandshake(server.ourHandshake)
+	if err != nil {
+		return err
+	}
+	c.caps, c.name = phs.Caps, phs.Name
+
+	// 将此链接放入addPeer的检查点
+	err = server.checkpoint(c, server.checkpointAddPeer)
+	if err != nil {
+		return err
+	}
 
 	return nil
 }
 
+func (server *Server) checkpoint(c *conn, stage chan<- *conn) error {
+	select {
+	case stage <- c:
+	case <-server.quit:
+		return ErrServerStopped
+	}
+	return <-c.cont
+}
+
 // 配置节点发现逻辑
 func (server *Server) setupDiscovery() (err error) {
 	return nil