Переглянути джерело

les: fix nodiscover option on the client side (#22422)

Felföldi Zsolt 4 роки тому
батько
коміт
b24804d88c
3 змінених файлів з 15 додано та 5 видалено
  1. 11 1
      les/client.go
  2. 3 3
      les/vflux/client/serverpool.go
  3. 1 1
      les/vflux/client/serverpool_test.go

+ 11 - 1
les/client.go

@@ -115,7 +115,11 @@ func New(stack *node.Node, config *ethconfig.Config) (*LightEthereum, error) {
 		p2pConfig:      &stack.Config().P2P,
 	}
 
-	leth.serverPool, leth.serverPoolIterator = vfc.NewServerPool(lesDb, []byte("serverpool:"), time.Second, leth.prenegQuery, &mclock.System{}, config.UltraLightServers, requestList)
+	var prenegQuery vfc.QueryFunc
+	if leth.p2pServer.DiscV5 != nil {
+		prenegQuery = leth.prenegQuery
+	}
+	leth.serverPool, leth.serverPoolIterator = vfc.NewServerPool(lesDb, []byte("serverpool:"), time.Second, prenegQuery, &mclock.System{}, config.UltraLightServers, requestList)
 	leth.serverPool.AddMetrics(suggestedTimeoutGauge, totalValueGauge, serverSelectableGauge, serverConnectedGauge, sessionValueMeter, serverDialedMeter)
 
 	leth.retriever = newRetrieveManager(peers, leth.reqDist, leth.serverPool.GetTimeout)
@@ -194,6 +198,9 @@ func New(stack *node.Node, config *ethconfig.Config) (*LightEthereum, error) {
 
 // VfluxRequest sends a batch of requests to the given node through discv5 UDP TalkRequest and returns the responses
 func (s *LightEthereum) VfluxRequest(n *enode.Node, reqs vflux.Requests) vflux.Replies {
+	if s.p2pServer.DiscV5 == nil {
+		return nil
+	}
 	reqsEnc, _ := rlp.EncodeToBytes(&reqs)
 	repliesEnc, _ := s.p2pServer.DiscV5.TalkRequest(s.serverPool.DialNode(n), "vfx", reqsEnc)
 	var replies vflux.Replies
@@ -208,6 +215,9 @@ func (s *LightEthereum) VfluxRequest(n *enode.Node, reqs vflux.Requests) vflux.R
 func (s *LightEthereum) vfxVersion(n *enode.Node) uint {
 	if n.Seq() == 0 {
 		var err error
+		if s.p2pServer.DiscV5 == nil {
+			return 0
+		}
 		if n, err = s.p2pServer.DiscV5.RequestENR(n); n != nil && err == nil && n.Seq() != 0 {
 			s.serverPool.Persist(n)
 		} else {

+ 3 - 3
les/vflux/client/serverpool.go

@@ -91,7 +91,7 @@ type nodeHistoryEnc struct {
 // queryFunc sends a pre-negotiation query and blocks until a response arrives or timeout occurs.
 // It returns 1 if the remote node has confirmed that connection is possible, 0 if not
 // possible and -1 if no response arrived (timeout).
-type queryFunc func(*enode.Node) int
+type QueryFunc func(*enode.Node) int
 
 var (
 	clientSetup        = &nodestate.Setup{Version: 2}
@@ -150,7 +150,7 @@ var (
 )
 
 // NewServerPool creates a new server pool
-func NewServerPool(db ethdb.KeyValueStore, dbKey []byte, mixTimeout time.Duration, query queryFunc, clock mclock.Clock, trustedURLs []string, requestList []RequestInfo) (*ServerPool, enode.Iterator) {
+func NewServerPool(db ethdb.KeyValueStore, dbKey []byte, mixTimeout time.Duration, query QueryFunc, clock mclock.Clock, trustedURLs []string, requestList []RequestInfo) (*ServerPool, enode.Iterator) {
 	s := &ServerPool{
 		db:           db,
 		clock:        clock,
@@ -246,7 +246,7 @@ func (s *ServerPool) AddSource(source enode.Iterator) {
 // addPreNegFilter installs a node filter mechanism that performs a pre-negotiation query.
 // Nodes that are filtered out and does not appear on the output iterator are put back
 // into redialWait state.
-func (s *ServerPool) addPreNegFilter(input enode.Iterator, query queryFunc) enode.Iterator {
+func (s *ServerPool) addPreNegFilter(input enode.Iterator, query QueryFunc) enode.Iterator {
 	s.fillSet = NewFillSet(s.ns, input, sfQueried)
 	s.ns.SubscribeState(sfQueried, func(n *enode.Node, oldState, newState nodestate.Flags) {
 		if newState.Equals(sfQueried) {

+ 1 - 1
les/vflux/client/serverpool_test.go

@@ -107,7 +107,7 @@ func (s *ServerPoolTest) addTrusted(i int) {
 }
 
 func (s *ServerPoolTest) start() {
-	var testQuery queryFunc
+	var testQuery QueryFunc
 	if s.preNeg {
 		testQuery = func(node *enode.Node) int {
 			idx := testNodeIndex(node.ID())