浏览代码

所有前期准备完成,准备实现通讯部分

skyfffire 2 年之前
父节点
当前提交
d5ee87eff4
共有 2 个文件被更改,包括 34 次插入7 次删除
  1. 25 7
      p2p/server.go
  2. 9 0
      params/caps.go

+ 25 - 7
p2p/server.go

@@ -14,6 +14,7 @@ import (
 	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/p2p/netutil"
 	"net"
+	"sort"
 	"sync"
 	"time"
 )
@@ -63,27 +64,47 @@ func (server *Server) Start() (err error) {
 	server.checkpointPostHandshake = make(chan *conn)
 	server.checkpointAddPeer = make(chan *conn)
 
+	// 配置远端引导节点
 	if err := server.setupBootstrapNodes(); err != nil {
 		return err
 	}
 
+	// 配置本地协议
+	if err := server.setupCaps(); err != nil {
+		return nil
+	}
+
+	// 配置本地节点
 	if err := server.setupLocalNode(); err != nil {
 		return err
 	}
 
+	// 配置节点连接监听器
 	if err := server.setupListening(); err != nil {
 		return err
 	}
 
+	// 配置节点发现器
 	if err := server.setupDiscovery(); err != nil {
 		return err
 	}
 
+	// 配置拨号调度
 	server.setupDialScheduler()
 
 	return nil
 }
 
+// 本地协议
+func (server *Server) setupCaps() (err error) {
+	for _, capability := range params.Caps {
+		server.ourHandshake.Caps = append(server.ourHandshake.Caps, capability)
+	}
+	sort.Sort(capsByNameAndVersion(server.ourHandshake.Caps))
+
+	return nil
+}
+
 // 配置节点发现逻辑
 func (server *Server) setupDiscovery() (err error) {
 	server.discmix = enode.NewFairMix(discmixTimeout)
@@ -114,7 +135,7 @@ func (server *Server) setupDiscovery() (err error) {
 			server.loopWG.Add(1)
 
 			gopool.Submit(func() {
-				nat.Map(server.NAT, server.quit, "udp", realAddr.Port, realAddr.Port, "ethereum discovery")
+				nat.Map(server.NAT, server.quit, "udp", realAddr.Port, realAddr.Port, "blockchain-p2p discovery")
 				server.loopWG.Done()
 			})
 		}
@@ -145,6 +166,7 @@ func (server *Server) setupDiscovery() (err error) {
 	return nil
 }
 
+// 设置引导节点,更快发现指定网络
 func (server *Server) setupBootstrapNodes() (err error) {
 	urls := params.MainnetBootNodes
 
@@ -181,10 +203,6 @@ func (server *Server) setupDialScheduler() {
 		config.dialer = tcpDialer{&net.Dialer{Timeout: defaultDialTimeout}}
 	}
 	server.dialsched = newDialScheduler(config, server.discmix, server.SetupConn)
-
-	//for _, n := range srv.StaticNodes {
-	//	srv.dialsched.addStatic(n)
-	//}
 }
 
 func (server *Server) maxDialedConns() (limit int) {
@@ -223,7 +241,7 @@ func (server *Server) setupLocalNode() (err error) {
 	return nil
 }
 
-// 监听器
+// 设置新节点连接监听器
 func (server *Server) setupListening() (err error) {
 	listener, err := net.Listen("tcp", server.ListenAddr)
 	if err != nil {
@@ -363,7 +381,7 @@ func (server *Server) setupConn(c *conn, dialDest *enode.Node) error {
 	}
 	c.caps, c.name = phs.Caps, phs.Name
 
-	// 将此链接放入addPeer的检查点
+	// 握手成功后将此链接放入addPeer的检查点
 	err = server.checkpoint(c, server.checkpointAddPeer)
 	if err != nil {
 		return err

+ 9 - 0
params/caps.go

@@ -0,0 +1,9 @@
+package params
+
+import "blockchain-go/p2p"
+
+var Caps = []p2p.Cap{
+	{Name: "eth", Version: 65},
+	{Name: "eth", Version: 66},
+	{Name: "eth", Version: 67},
+}