forked from protolambda/rumor
/
discv5.go
87 lines (74 loc) · 1.88 KB
/
discv5.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package dv5
import (
"crypto/ecdsa"
"net"
geth_log "github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/p2p/enode"
"github.com/libp2p/go-libp2p-core/crypto"
beacon "github.com/protolambda/zrnt/eth2/beacon/common"
"github.com/sirupsen/logrus"
)
type Discv5 interface {
Self() *enode.Node
Lookup(target enode.ID) []*enode.Node
RandomNodes() enode.Iterator
Close()
Ping(n *enode.Node) error
Resolve(n *enode.Node) *enode.Node
RequestENR(n *enode.Node) (*enode.Node, error)
}
type Dv5Settings interface {
LocalNode() *enode.LocalNode
StaticIP() net.IP
SetStaticIP(ip net.IP)
FallbackIP() net.IP
SetFallbackIP(ip net.IP)
FallbackUDP() uint16
SetFallbackUDP(port uint16)
GetPriv() *crypto.Secp256k1PrivateKey
SetIP(ip net.IP)
SetTCP(port uint16)
SetUDP(port uint16)
SetEth2Data(dat *beacon.Eth2Data)
SetAttnets(dat *beacon.AttnetBits)
}
type Discv5Impl struct {
*discover.UDPv5
addr *net.UDPAddr
log logrus.FieldLogger
gLog *GethLogger
}
func NewDiscV5(log logrus.FieldLogger, listenIP net.IP, listenPort uint16,
settings Dv5Settings, bootNodes []*enode.Node) (Discv5, error) {
priv := settings.GetPriv()
ecdsaPrivKey := (*ecdsa.PrivateKey)(priv)
udpAddr := &net.UDPAddr{
IP: listenIP,
Port: int(listenPort),
}
conn, err := net.ListenUDP("udp", udpAddr)
if err != nil {
return nil, err
}
gethLogWrap := GethLogger{FieldLogger: log}
gethLogger := geth_log.New()
gethLogger.SetHandler(&gethLogWrap)
cfg := discover.Config{
PrivateKey: ecdsaPrivKey,
NetRestrict: nil,
Bootnodes: bootNodes,
Unhandled: nil, // Not used in dv5
Log: gethLogger,
ValidSchemes: enode.ValidSchemes,
}
udpV5, err := discover.ListenV5(conn, settings.LocalNode(), cfg)
if err != nil {
return nil, err
}
return &Discv5Impl{
UDPv5: udpV5,
addr: udpAddr,
gLog: &gethLogWrap,
}, nil
}