@@ -19,18 +19,17 @@ use clap::Parser;
19
19
use discv5:: {
20
20
enr,
21
21
enr:: { k256, CombinedKey } ,
22
- Discv5 , Discv5ConfigBuilder , Discv5Event ,
22
+ Discv5 , Discv5ConfigBuilder , Discv5Event , ListenConfig ,
23
23
} ;
24
24
use std:: {
25
- net:: { Ipv4Addr , Ipv6Addr , SocketAddr } ,
25
+ net:: { Ipv4Addr , Ipv6Addr } ,
26
26
time:: Duration ,
27
27
} ;
28
28
use tracing:: { info, warn} ;
29
29
30
30
#[ derive( Parser ) ]
31
31
struct FindNodesArgs {
32
- /// Type of socket to bind ['ds', 'ip4', 'ip6']. The dual stack option will enable mapped
33
- /// addresses over an IpV6 socket.
32
+ /// Type of socket to bind ['ds', 'ip4', 'ip6'].
34
33
#[ clap( long, default_value_t = SocketKind :: Ds ) ]
35
34
socket_kind : SocketKind ,
36
35
/// IpV4 to advertise in the ENR. This is needed so that other IpV4 nodes can connect to us.
@@ -43,6 +42,10 @@ struct FindNodesArgs {
43
42
/// randomly.
44
43
#[ clap( long) ]
45
44
port : Option < u16 > ,
45
+ /// Port to bind for ipv6. If none is provided, a random one in the 9000 - 9999 range will be picked
46
+ /// randomly.
47
+ #[ clap( long) ]
48
+ port6 : Option < u16 > ,
46
49
/// Use a default test key.
47
50
#[ clap( long) ]
48
51
use_test_key : bool ,
@@ -67,13 +70,19 @@ async fn main() {
67
70
let port = args
68
71
. port
69
72
. unwrap_or_else ( || ( rand:: random :: < u16 > ( ) % 1000 ) + 9000 ) ;
73
+ let port6 = args. port . unwrap_or_else ( || loop {
74
+ let port6 = ( rand:: random :: < u16 > ( ) % 1000 ) + 9000 ;
75
+ if port6 != port {
76
+ return port6;
77
+ }
78
+ } ) ;
70
79
71
80
let enr_key = if args. use_test_key {
72
81
// A fixed key for testing
73
82
let raw_key =
74
83
hex:: decode ( "b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291" )
75
84
. unwrap ( ) ;
76
- let secret_key = k256:: ecdsa:: SigningKey :: from_bytes ( & raw_key) . unwrap ( ) ;
85
+ let secret_key = k256:: ecdsa:: SigningKey :: from_slice ( & raw_key) . unwrap ( ) ;
77
86
CombinedKey :: from ( secret_key)
78
87
} else {
79
88
// use a new key if specified
@@ -93,29 +102,28 @@ async fn main() {
93
102
if let Some ( ip6) = args. enr_ip6 {
94
103
// if the given address is the UNSPECIFIED address we want to advertise localhost
95
104
if ip6. is_unspecified ( ) {
96
- builder. ip6 ( Ipv6Addr :: LOCALHOST ) . udp6 ( port ) ;
105
+ builder. ip6 ( Ipv6Addr :: LOCALHOST ) . udp6 ( port6 ) ;
97
106
} else {
98
- builder. ip6 ( ip6) . udp6 ( port ) ;
107
+ builder. ip6 ( ip6) . udp6 ( port6 ) ;
99
108
}
100
109
}
101
110
builder. build ( & enr_key) . unwrap ( )
102
111
} ;
103
112
113
+ // the address to listen on.
114
+ let listen_config = match args. socket_kind {
115
+ SocketKind :: Ip4 => ListenConfig :: new_ipv4 ( Ipv4Addr :: UNSPECIFIED , port) ,
116
+ SocketKind :: Ip6 => ListenConfig :: new_ipv6 ( Ipv6Addr :: UNSPECIFIED , port6) ,
117
+ SocketKind :: Ds => ListenConfig :: default ( )
118
+ . with_ipv4 ( Ipv4Addr :: UNSPECIFIED , port)
119
+ . with_ipv6 ( Ipv6Addr :: UNSPECIFIED , port6) ,
120
+ } ;
121
+
104
122
// default configuration with packet filtering
105
- // let config = Discv5ConfigBuilder::new().enable_packet_filter().build();
123
+ // let config = Discv5ConfigBuilder::new(listen_config ).enable_packet_filter().build();
106
124
107
125
// default configuration without packet filtering
108
- let config = Discv5ConfigBuilder :: new ( )
109
- . ip_mode ( match args. socket_kind {
110
- SocketKind :: Ip4 => discv5:: IpMode :: Ip4 ,
111
- SocketKind :: Ip6 => discv5:: IpMode :: Ip6 {
112
- enable_mapped_addresses : false ,
113
- } ,
114
- SocketKind :: Ds => discv5:: IpMode :: Ip6 {
115
- enable_mapped_addresses : true ,
116
- } ,
117
- } )
118
- . build ( ) ;
126
+ let config = Discv5ConfigBuilder :: new ( listen_config) . build ( ) ;
119
127
120
128
info ! ( "Node Id: {}" , enr. node_id( ) ) ;
121
129
if args. enr_ip6 . is_some ( ) || args. enr_ip4 . is_some ( ) {
@@ -127,12 +135,6 @@ async fn main() {
127
135
enr. udp4_socket( )
128
136
) ;
129
137
}
130
- // the address to listen on.
131
- let bind_addr = match args. socket_kind {
132
- SocketKind :: Ip4 => Ipv4Addr :: UNSPECIFIED . into ( ) ,
133
- SocketKind :: Ip6 | SocketKind :: Ds => Ipv6Addr :: UNSPECIFIED . into ( ) ,
134
- } ;
135
- let socket_addr = SocketAddr :: new ( bind_addr, port) ;
136
138
137
139
// construct the discv5 server
138
140
let mut discv5: Discv5 = Discv5 :: new ( enr, enr_key, config) . unwrap ( ) ;
@@ -154,7 +156,7 @@ async fn main() {
154
156
}
155
157
156
158
// start the discv5 service
157
- discv5. start ( socket_addr ) . await . unwrap ( ) ;
159
+ discv5. start ( ) . await . unwrap ( ) ;
158
160
let mut event_stream = discv5. event_stream ( ) . await . unwrap ( ) ;
159
161
let check_evs = args. events ;
160
162
0 commit comments