123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- // Copyright 2019 The go-ethereum Authors
- // This file is part of the go-ethereum library.
- //
- // The go-ethereum library is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Lesser General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // The go-ethereum library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Lesser General Public License for more details.
- //
- // You should have received a copy of the GNU Lesser General Public License
- // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
- package les
- import (
- "github.com/ethereum/go-ethereum/core/forkid"
- "github.com/ethereum/go-ethereum/p2p/dnsdisc"
- "github.com/ethereum/go-ethereum/p2p/enode"
- "github.com/ethereum/go-ethereum/rlp"
- )
- // lesEntry is the "les" ENR entry. This is set for LES servers only.
- type lesEntry struct {
- // Ignore additional fields (for forward compatibility).
- VfxVersion uint
- Rest []rlp.RawValue `rlp:"tail"`
- }
- func (lesEntry) ENRKey() string { return "les" }
- // ethEntry is the "eth" ENR entry. This is redeclared here to avoid depending on package eth.
- type ethEntry struct {
- ForkID forkid.ID
- Tail []rlp.RawValue `rlp:"tail"`
- }
- func (ethEntry) ENRKey() string { return "eth" }
- // setupDiscovery creates the node discovery source for the eth protocol.
- func (eth *LightEthereum) setupDiscovery() (enode.Iterator, error) {
- it := enode.NewFairMix(0)
- // Enable DNS discovery.
- if len(eth.config.EthDiscoveryURLs) != 0 {
- client := dnsdisc.NewClient(dnsdisc.Config{})
- dns, err := client.NewIterator(eth.config.EthDiscoveryURLs...)
- if err != nil {
- return nil, err
- }
- it.AddSource(dns)
- }
- // Enable DHT.
- if eth.udpEnabled {
- it.AddSource(eth.p2pServer.DiscV5.RandomNodes())
- }
- forkFilter := forkid.NewFilter(eth.blockchain)
- iterator := enode.Filter(it, func(n *enode.Node) bool { return nodeIsServer(forkFilter, n) })
- return iterator, nil
- }
- // nodeIsServer checks whether n is an LES server node.
- func nodeIsServer(forkFilter forkid.Filter, n *enode.Node) bool {
- var les lesEntry
- var eth ethEntry
- return n.Load(&les) == nil && n.Load(ð) == nil && forkFilter(eth.ForkID) == nil
- }
|