go-waku/waku/v2/dnsdisc/enr.go

83 lines
1.9 KiB
Go
Raw Normal View History

2021-11-16 14:22:01 +00:00
package dnsdisc
import (
"context"
"github.com/ethereum/go-ethereum/p2p/dnsdisc"
2022-05-05 19:17:35 +00:00
"github.com/ethereum/go-ethereum/p2p/enode"
"github.com/ethereum/go-ethereum/p2p/enr"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/waku-org/go-waku/waku/v2/metrics"
2023-04-20 18:51:13 +00:00
wenr "github.com/waku-org/go-waku/waku/v2/protocol/enr"
ma "github.com/multiformats/go-multiaddr"
)
type dnsDiscoveryParameters struct {
nameserver string
}
type DnsDiscoveryOption func(*dnsDiscoveryParameters)
2022-07-25 15:28:17 +00:00
// WithNameserver is a DnsDiscoveryOption that configures the nameserver to use
func WithNameserver(nameserver string) DnsDiscoveryOption {
return func(params *dnsDiscoveryParameters) {
params.nameserver = nameserver
}
}
2022-05-05 19:17:35 +00:00
type DiscoveredNode struct {
PeerID peer.ID
2022-05-05 19:17:35 +00:00
Addresses []ma.Multiaddr
ENR *enode.Node
}
// RetrieveNodes returns a list of multiaddress given a url to a DNS discoverable ENR tree
2022-05-05 19:17:35 +00:00
func RetrieveNodes(ctx context.Context, url string, opts ...DnsDiscoveryOption) ([]DiscoveredNode, error) {
var discoveredNodes []DiscoveredNode
params := new(dnsDiscoveryParameters)
for _, opt := range opts {
opt(params)
}
client := dnsdisc.NewClient(dnsdisc.Config{
Resolver: GetResolver(ctx, params.nameserver),
})
tree, err := client.SyncTree(url)
if err != nil {
metrics.RecordDnsDiscoveryError(ctx, "tree_sync_failure")
return nil, err
}
for _, node := range tree.Nodes() {
2023-04-20 18:51:13 +00:00
peerID, m, err := wenr.Multiaddress(node)
if err != nil {
metrics.RecordDnsDiscoveryError(ctx, "peer_info_failure")
return nil, err
}
d := DiscoveredNode{
PeerID: peerID,
Addresses: m,
}
2022-05-05 19:17:35 +00:00
if hasUDP(node) {
d.ENR = node
}
discoveredNodes = append(discoveredNodes, d)
}
2022-05-05 19:17:35 +00:00
return discoveredNodes, nil
}
func hasUDP(node *enode.Node) bool {
enrUDP := new(enr.UDP)
if err := node.Record().Load(enr.WithEntry(enrUDP.ENRKey(), enrUDP)); err != nil {
2022-09-15 22:54:37 +00:00
return false
2022-05-05 19:17:35 +00:00
}
2022-09-15 22:54:37 +00:00
return true
}