diff --git a/cmd/waku/node.go b/cmd/waku/node.go index a3bd6c4e..08de3e2f 100644 --- a/cmd/waku/node.go +++ b/cmd/waku/node.go @@ -19,12 +19,12 @@ import ( "github.com/urfave/cli/v2" dbutils "github.com/waku-org/go-waku/waku/persistence/utils" + "github.com/waku-org/go-waku/waku/v2/dnsdisc" wakupeerstore "github.com/waku-org/go-waku/waku/v2/peerstore" "github.com/waku-org/go-waku/waku/v2/rendezvous" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p/enode" dssql "github.com/ipfs/go-ds-sql" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -44,7 +44,6 @@ import ( "github.com/waku-org/go-waku/logging" "github.com/waku-org/go-waku/waku/metrics" "github.com/waku-org/go-waku/waku/persistence" - "github.com/waku-org/go-waku/waku/v2/dnsdisc" "github.com/waku-org/go-waku/waku/v2/node" wprotocol "github.com/waku-org/go-waku/waku/v2/protocol" "github.com/waku-org/go-waku/waku/v2/protocol/filter" @@ -279,47 +278,6 @@ func Execute(options NodeOptions) error { nodeOpts = append(nodeOpts, node.WithLightPush()) } - var discoveredNodes []dnsdisc.DiscoveredNode - if options.DNSDiscovery.Enable { - if len(options.DNSDiscovery.URLs.Value()) != 0 { - for _, url := range options.DNSDiscovery.URLs.Value() { - logger.Info("attempting DNS discovery with ", zap.String("URL", url)) - nodes, err := dnsdisc.RetrieveNodes(ctx, url, dnsdisc.WithNameserver(options.DNSDiscovery.Nameserver)) - if err != nil { - logger.Warn("dns discovery error ", zap.Error(err)) - } else { - var discPeerInfo []peer.AddrInfo - for _, n := range nodes { - discPeerInfo = append(discPeerInfo, n.PeerInfo) - } - logger.Info("found dns entries ", zap.Any("nodes", discPeerInfo)) - discoveredNodes = append(discoveredNodes, nodes...) - } - } - } else { - return nonRecoverErrorMsg("DNS discovery URL is required") - } - } - - if options.DiscV5.Enable { - var bootnodes []*enode.Node - for _, addr := range options.DiscV5.Nodes.Value() { - bootnode, err := enode.Parse(enode.ValidSchemes, addr) - if err != nil { - logger.Fatal("parsing ENR", zap.Error(err)) - } - bootnodes = append(bootnodes, bootnode) - } - - for _, n := range discoveredNodes { - if n.ENR != nil { - bootnodes = append(bootnodes, n.ENR) - } - } - - nodeOpts = append(nodeOpts, node.WithDiscoveryV5(options.DiscV5.Port, bootnodes, options.DiscV5.AutoUpdate)) - } - if options.PeerExchange.Enable { nodeOpts = append(nodeOpts, node.WithPeerExchange()) } @@ -357,6 +315,21 @@ func Execute(options NodeOptions) error { } } + var discoveredNodes []dnsdisc.DiscoveredNode + if options.DNSDiscovery.Enable { + if len(options.DNSDiscovery.URLs.Value()) == 0 { + return nonRecoverErrorMsg("DNS discovery URL is required") + } + discoveredNodes = node.GetNodesFromDNSDiscovery(logger, ctx, options.DNSDiscovery.Nameserver, options.DNSDiscovery.URLs.Value()) + } + if options.DiscV5.Enable { + discv5Opts, err := node.GetDiscv5Option(discoveredNodes, options.DiscV5.Nodes.Value(), options.DiscV5.Port, options.DiscV5.AutoUpdate) + if err != nil { + logger.Fatal("parsing ENR", zap.Error(err)) + } + nodeOpts = append(nodeOpts, discv5Opts) + } + if err = wakuNode.Start(ctx); err != nil { return nonRecoverError(err) } diff --git a/examples/basic2/go.mod b/examples/basic2/go.mod index 9e244c56..954987ba 100644 --- a/examples/basic2/go.mod +++ b/examples/basic2/go.mod @@ -10,6 +10,7 @@ require ( github.com/ethereum/go-ethereum v1.10.26 github.com/waku-org/go-waku v0.2.3-0.20221109195301-b2a5a68d28ba go.uber.org/zap v1.24.0 + google.golang.org/protobuf v1.31.0 ) require ( @@ -123,8 +124,8 @@ require ( golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.11.0 // indirect golang.org/x/text v0.12.0 // indirect + golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect golang.org/x/tools v0.12.1-0.20230818130535-1517d1a3ba60 // indirect - google.golang.org/protobuf v1.31.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect lukechampine.com/blake3 v1.2.1 // indirect ) diff --git a/examples/basic2/go.sum b/examples/basic2/go.sum index 2f151798..fc06c781 100644 --- a/examples/basic2/go.sum +++ b/examples/basic2/go.sum @@ -866,6 +866,7 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/examples/filter2/go.mod b/examples/filter2/go.mod index 1205e2ad..f0c2c609 100644 --- a/examples/filter2/go.mod +++ b/examples/filter2/go.mod @@ -10,6 +10,7 @@ require ( github.com/ethereum/go-ethereum v1.10.26 github.com/ipfs/go-log/v2 v2.5.1 github.com/waku-org/go-waku v0.2.3-0.20221109195301-b2a5a68d28ba + google.golang.org/protobuf v1.31.0 ) require ( @@ -123,8 +124,8 @@ require ( golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.11.0 // indirect golang.org/x/text v0.12.0 // indirect + golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect golang.org/x/tools v0.12.1-0.20230818130535-1517d1a3ba60 // indirect - google.golang.org/protobuf v1.31.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect lukechampine.com/blake3 v1.2.1 // indirect ) diff --git a/examples/filter2/go.sum b/examples/filter2/go.sum index 2f151798..fc06c781 100644 --- a/examples/filter2/go.sum +++ b/examples/filter2/go.sum @@ -866,6 +866,7 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/examples/rln/go.mod b/examples/rln/go.mod index 3582c132..f4ce511a 100644 --- a/examples/rln/go.mod +++ b/examples/rln/go.mod @@ -10,6 +10,7 @@ require ( github.com/ethereum/go-ethereum v1.10.26 github.com/waku-org/go-waku v0.2.3-0.20221109195301-b2a5a68d28ba go.uber.org/zap v1.24.0 + google.golang.org/protobuf v1.31.0 ) require ( @@ -123,8 +124,8 @@ require ( golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.11.0 // indirect golang.org/x/text v0.12.0 // indirect + golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect golang.org/x/tools v0.12.1-0.20230818130535-1517d1a3ba60 // indirect - google.golang.org/protobuf v1.31.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect lukechampine.com/blake3 v1.2.1 // indirect ) diff --git a/examples/rln/go.sum b/examples/rln/go.sum index 2f151798..fc06c781 100644 --- a/examples/rln/go.sum +++ b/examples/rln/go.sum @@ -866,6 +866,7 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220922220347-f3bd1da661af h1:Yx9k8YCG3dvF87UAn2tu2HQLf2dt/eR1bXxpLMWeH+Y= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/library/config.go b/library/config.go index cce1a108..22bd2883 100644 --- a/library/config.go +++ b/library/config.go @@ -10,26 +10,28 @@ import ( // WakuConfig contains all the configuration settings exposed to users of mobile and c libraries type WakuConfig struct { - Host *string `json:"host,omitempty"` - Port *int `json:"port,omitempty"` - AdvertiseAddress *string `json:"advertiseAddr,omitempty"` - NodeKey *string `json:"nodeKey,omitempty"` - LogLevel *string `json:"logLevel,omitempty"` - KeepAliveInterval *int `json:"keepAliveInterval,omitempty"` - EnableRelay *bool `json:"relay"` - RelayTopics []string `json:"relayTopics,omitempty"` - GossipSubParams *GossipSubParams `json:"gossipsubParams,omitempty"` - EnableLegacyFilter *bool `json:"legacyFilter,omitempty"` - MinPeersToPublish *int `json:"minPeersToPublish,omitempty"` - EnableDiscV5 *bool `json:"discV5,omitempty"` - DiscV5BootstrapNodes []string `json:"discV5BootstrapNodes,omitempty"` - DiscV5UDPPort *uint `json:"discV5UDPPort,omitempty"` - EnableStore *bool `json:"store,omitempty"` - DatabaseURL *string `json:"databaseURL,omitempty"` - RetentionMaxMessages *int `json:"storeRetentionMaxMessages,omitempty"` - RetentionTimeSeconds *int `json:"storeRetentionTimeSeconds,omitempty"` - DNS4DomainName string `json:"dns4DomainName,omitempty"` - Websockets *WebsocketConfig `json:"websockets,omitempty"` + Host *string `json:"host,omitempty"` + Port *int `json:"port,omitempty"` + AdvertiseAddress *string `json:"advertiseAddr,omitempty"` + NodeKey *string `json:"nodeKey,omitempty"` + LogLevel *string `json:"logLevel,omitempty"` + KeepAliveInterval *int `json:"keepAliveInterval,omitempty"` + EnableRelay *bool `json:"relay"` + RelayTopics []string `json:"relayTopics,omitempty"` + GossipSubParams *GossipSubParams `json:"gossipsubParams,omitempty"` + EnableLegacyFilter *bool `json:"legacyFilter,omitempty"` + MinPeersToPublish *int `json:"minPeersToPublish,omitempty"` + DNSDiscoveryURLs []string `json:"dnsDiscoveryURLs,omitempty"` + DNSDiscoveryNameServer string `json:"dnsDiscoveryNameServer,omitempty"` + EnableDiscV5 *bool `json:"discV5,omitempty"` + DiscV5BootstrapNodes []string `json:"discV5BootstrapNodes,omitempty"` + DiscV5UDPPort *uint `json:"discV5UDPPort,omitempty"` + EnableStore *bool `json:"store,omitempty"` + DatabaseURL *string `json:"databaseURL,omitempty"` + RetentionMaxMessages *int `json:"storeRetentionMaxMessages,omitempty"` + RetentionTimeSeconds *int `json:"storeRetentionTimeSeconds,omitempty"` + DNS4DomainName string `json:"dns4DomainName,omitempty"` + Websockets *WebsocketConfig `json:"websockets,omitempty"` } // WebsocketConfig contains all the settings required to setup websocket support in waku diff --git a/library/node.go b/library/node.go index eaacd8da..cc8959c2 100644 --- a/library/node.go +++ b/library/node.go @@ -15,7 +15,6 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p/enode" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/peer" libp2pProtocol "github.com/libp2p/go-libp2p/core/protocol" @@ -145,15 +144,12 @@ func NewNode(configJSON string) error { } if *config.EnableDiscV5 { - var bootnodes []*enode.Node - for _, addr := range config.DiscV5BootstrapNodes { - bootnode, err := enode.Parse(enode.ValidSchemes, addr) - if err != nil { - return err - } - bootnodes = append(bootnodes, bootnode) + discoveredNodes := node.GetNodesFromDNSDiscovery(utils.Logger(), context.TODO(), config.DNSDiscoveryNameServer, config.DNSDiscoveryURLs) + discv5Opts, err := node.GetDiscv5Option(discoveredNodes, config.DiscV5BootstrapNodes, *config.DiscV5UDPPort, true) + if err != nil { + return err } - opts = append(opts, node.WithDiscoveryV5(*config.DiscV5UDPPort, bootnodes, true)) + opts = append(opts, discv5Opts) } wakuState.relayTopics = config.RelayTopics diff --git a/waku/v2/node/wakunode2.go b/waku/v2/node/wakunode2.go index 0bb611f7..5b4dbd50 100644 --- a/waku/v2/node/wakunode2.go +++ b/waku/v2/node/wakunode2.go @@ -30,6 +30,7 @@ import ( "github.com/waku-org/go-waku/logging" "github.com/waku-org/go-waku/waku/v2/discv5" + "github.com/waku-org/go-waku/waku/v2/dnsdisc" "github.com/waku-org/go-waku/waku/v2/peermanager" wps "github.com/waku-org/go-waku/waku/v2/peerstore" wakuprotocol "github.com/waku-org/go-waku/waku/v2/protocol" @@ -928,3 +929,41 @@ func (w *WakuNode) findRelayNodes(ctx context.Context) { } } } + +func GetNodesFromDNSDiscovery(logger *zap.Logger, ctx context.Context, nameServer string, discoveryURLs []string) []dnsdisc.DiscoveredNode { + var discoveredNodes []dnsdisc.DiscoveredNode + for _, url := range discoveryURLs { + logger.Info("attempting DNS discovery with ", zap.String("URL", url)) + nodes, err := dnsdisc.RetrieveNodes(ctx, url, dnsdisc.WithNameserver(nameServer)) + if err != nil { + logger.Warn("dns discovery error ", zap.Error(err)) + } else { + var discPeerInfo []peer.AddrInfo + for _, n := range nodes { + discPeerInfo = append(discPeerInfo, n.PeerInfo) + } + logger.Info("found dns entries ", zap.Any("nodes", discPeerInfo)) + discoveredNodes = append(discoveredNodes, nodes...) + } + } + return discoveredNodes +} + +func GetDiscv5Option(dnsDiscoveredNodes []dnsdisc.DiscoveredNode, discv5Nodes []string, port uint, autoUpdate bool) (WakuNodeOption, error) { + var bootnodes []*enode.Node + for _, addr := range discv5Nodes { + bootnode, err := enode.Parse(enode.ValidSchemes, addr) + if err != nil { + return nil, err + } + bootnodes = append(bootnodes, bootnode) + } + + for _, n := range dnsDiscoveredNodes { + if n.ENR != nil { + bootnodes = append(bootnodes, n.ENR) + } + } + + return WithDiscoveryV5(port, bootnodes, autoUpdate), nil +}