|
|
@@ -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
|