@@ -123,15 +123,15 @@ async fn discover_peers(
123
123
) ) ;
124
124
125
125
tracker. spawn ( peers_revalidation (
126
- udp_addr ,
126
+ local_node ,
127
127
udp_socket. clone ( ) ,
128
128
table. clone ( ) ,
129
129
signer. clone ( ) ,
130
130
REVALIDATION_INTERVAL_IN_SECONDS as u64 ,
131
131
) ) ;
132
132
133
133
discovery_startup (
134
- udp_addr ,
134
+ local_node ,
135
135
udp_socket. clone ( ) ,
136
136
table. clone ( ) ,
137
137
signer. clone ( ) ,
@@ -189,16 +189,22 @@ async fn discover_peers_server(
189
189
debug ! ( "Ignoring ping as it is expired." ) ;
190
190
continue ;
191
191
} ;
192
+ let node = Node {
193
+ ip : from. ip ( ) ,
194
+ udp_port : from. port ( ) ,
195
+ tcp_port : msg. from . tcp_port ,
196
+ node_id : packet. get_node_id ( ) ,
197
+ } ;
192
198
let ping_hash = packet. get_hash ( ) ;
193
- pong ( & udp_socket, from , ping_hash, & signer) . await ;
194
- let node = {
199
+ pong ( & udp_socket, node , ping_hash, & signer) . await ;
200
+ let peer = {
195
201
let table = table. lock ( ) . await ;
196
202
table. get_by_node_id ( packet. get_node_id ( ) ) . cloned ( )
197
203
} ;
198
- if let Some ( peer) = node {
204
+ if let Some ( peer) = peer {
199
205
// send a a ping to get an endpoint proof
200
206
if time_since_in_hs ( peer. last_ping ) >= PROOF_EXPIRATION_IN_HS as u64 {
201
- let hash = ping ( & udp_socket, udp_addr , from , & signer) . await ;
207
+ let hash = ping ( & udp_socket, local_node , peer . node , & signer) . await ;
202
208
if let Some ( hash) = hash {
203
209
table
204
210
. lock ( )
@@ -222,15 +228,9 @@ async fn discover_peers_server(
222
228
}
223
229
} else {
224
230
let mut table = table. lock ( ) . await ;
225
- let node = Node {
226
- ip : from. ip ( ) ,
227
- udp_port : from. port ( ) ,
228
- tcp_port : 0 ,
229
- node_id : packet. get_node_id ( ) ,
230
- } ;
231
231
if let ( Some ( peer) , true ) = table. insert_node ( node) {
232
232
// send a ping to get the endpoint proof from our end
233
- let hash = ping ( & udp_socket, udp_addr , from , & signer) . await ;
233
+ let hash = ping ( & udp_socket, local_node , node , & signer) . await ;
234
234
table. update_peer_ping ( peer. node . node_id , hash) ;
235
235
}
236
236
}
@@ -372,10 +372,8 @@ async fn discover_peers_server(
372
372
if let Some ( nodes) = nodes_to_insert {
373
373
for node in nodes {
374
374
if let ( Some ( peer) , true ) = table. insert_node ( node) {
375
- let node_addr =
376
- SocketAddr :: new ( peer. node . ip , peer. node . udp_port ) ;
377
375
let ping_hash =
378
- ping ( & udp_socket, udp_addr , node_addr , & signer) . await ;
376
+ ping ( & udp_socket, local_node , peer . node , & signer) . await ;
379
377
table. update_peer_ping ( peer. node . node_id , ping_hash) ;
380
378
}
381
379
}
@@ -492,22 +490,23 @@ async fn discover_peers_server(
492
490
/// currently, since we are not storing nodes, the only way to have startup nodes is by providing
493
491
/// an array of bootnodes.
494
492
async fn discovery_startup (
495
- udp_addr : SocketAddr ,
493
+ local_node : Node ,
496
494
udp_socket : Arc < UdpSocket > ,
497
495
table : Arc < Mutex < KademliaTable > > ,
498
496
signer : SigningKey ,
499
497
bootnodes : Vec < BootNode > ,
500
498
) {
501
499
for bootnode in bootnodes {
502
- table . lock ( ) . await . insert_node ( Node {
500
+ let node = Node {
503
501
ip : bootnode. socket_address . ip ( ) ,
504
502
udp_port : bootnode. socket_address . port ( ) ,
505
503
// TODO: udp port can differ from tcp port.
506
504
// see https://github.com/lambdaclass/ethrex/issues/905
507
505
tcp_port : bootnode. socket_address . port ( ) ,
508
506
node_id : bootnode. node_id ,
509
- } ) ;
510
- let ping_hash = ping ( & udp_socket, udp_addr, bootnode. socket_address , & signer) . await ;
507
+ } ;
508
+ table. lock ( ) . await . insert_node ( node) ;
509
+ let ping_hash = ping ( & udp_socket, local_node, node, & signer) . await ;
511
510
table
512
511
. lock ( )
513
512
. await
@@ -532,7 +531,7 @@ const PROOF_EXPIRATION_IN_HS: usize = 12;
532
531
///
533
532
/// See more https://github.com/ethereum/devp2p/blob/master/discv4.md#kademlia-table
534
533
async fn peers_revalidation (
535
- udp_addr : SocketAddr ,
534
+ local_node : Node ,
536
535
udp_socket : Arc < UdpSocket > ,
537
536
table : Arc < Mutex < KademliaTable > > ,
538
537
signer : SigningKey ,
@@ -566,13 +565,7 @@ async fn peers_revalidation(
566
565
if peer. liveness == 0 {
567
566
let new_peer = table. replace_peer ( node_id) ;
568
567
if let Some ( new_peer) = new_peer {
569
- let ping_hash = ping (
570
- & udp_socket,
571
- udp_addr,
572
- SocketAddr :: new ( new_peer. node . ip , new_peer. node . udp_port ) ,
573
- & signer,
574
- )
575
- . await ;
568
+ let ping_hash = ping ( & udp_socket, local_node, new_peer. node , & signer) . await ;
576
569
table. update_peer_ping ( new_peer. node . node_id , ping_hash) ;
577
570
}
578
571
}
@@ -585,13 +578,7 @@ async fn peers_revalidation(
585
578
let peers = table. lock ( ) . await . get_least_recently_pinged_peers ( 3 ) ;
586
579
previously_pinged_peers = HashSet :: default ( ) ;
587
580
for peer in peers {
588
- let ping_hash = ping (
589
- & udp_socket,
590
- udp_addr,
591
- SocketAddr :: new ( peer. node . ip , peer. node . udp_port ) ,
592
- & signer,
593
- )
594
- . await ;
581
+ let ping_hash = ping ( & udp_socket, local_node, peer. node , & signer) . await ;
595
582
let mut table = table. lock ( ) . await ;
596
583
table. update_peer_ping_with_revalidation ( peer. node . node_id , ping_hash) ;
597
584
previously_pinged_peers. insert ( peer. node . node_id ) ;
@@ -792,8 +779,8 @@ fn peers_to_ask_push(peers_to_ask: &mut Vec<Node>, target: H512, node: Node) {
792
779
/// an optional hash corresponding to the message header hash to account if the send was successful
793
780
async fn ping (
794
781
socket : & UdpSocket ,
795
- local_addr : SocketAddr ,
796
- to_addr : SocketAddr ,
782
+ local_node : Node ,
783
+ node : Node ,
797
784
signer : & SigningKey ,
798
785
) -> Option < H256 > {
799
786
let mut buf = Vec :: new ( ) ;
@@ -803,24 +790,26 @@ async fn ping(
803
790
. unwrap_or_default ( )
804
791
. as_secs ( ) ;
805
792
806
- // TODO: this should send our advertised TCP port
807
793
let from = Endpoint {
808
- ip : local_addr . ip ( ) ,
809
- udp_port : local_addr . port ( ) ,
810
- tcp_port : 0 ,
794
+ ip : local_node . ip ,
795
+ udp_port : local_node . udp_port ,
796
+ tcp_port : local_node . tcp_port ,
811
797
} ;
812
798
let to = Endpoint {
813
- ip : to_addr . ip ( ) ,
814
- udp_port : to_addr . port ( ) ,
815
- tcp_port : 0 ,
799
+ ip : node . ip ,
800
+ udp_port : node . udp_port ,
801
+ tcp_port : node . tcp_port ,
816
802
} ;
817
803
818
804
let ping =
819
805
discv4:: Message :: Ping ( PingMessage :: new ( from, to, expiration) . with_enr_seq ( time_now_unix ( ) ) ) ;
820
806
ping. encode_with_header ( & mut buf, signer) ;
821
807
822
808
// Send ping and log if error
823
- match socket. send_to ( & buf, to_addr) . await {
809
+ match socket
810
+ . send_to ( & buf, SocketAddr :: new ( to. ip , to. udp_port ) )
811
+ . await
812
+ {
824
813
Ok ( bytes_sent) => {
825
814
// sanity check to make sure the ping was well sent
826
815
// though idk if this is actually needed or if it might break other stuff
@@ -877,7 +866,7 @@ async fn find_node_and_wait_for_response(
877
866
}
878
867
}
879
868
880
- async fn pong ( socket : & UdpSocket , to_addr : SocketAddr , ping_hash : H256 , signer : & SigningKey ) {
869
+ async fn pong ( socket : & UdpSocket , node : Node , ping_hash : H256 , signer : & SigningKey ) {
881
870
let mut buf = Vec :: new ( ) ;
882
871
883
872
let expiration: u64 = ( SystemTime :: now ( ) + Duration :: from_secs ( 20 ) )
@@ -886,9 +875,9 @@ async fn pong(socket: &UdpSocket, to_addr: SocketAddr, ping_hash: H256, signer:
886
875
. as_secs ( ) ;
887
876
888
877
let to = Endpoint {
889
- ip : to_addr . ip ( ) ,
890
- udp_port : to_addr . port ( ) ,
891
- tcp_port : 0 ,
878
+ ip : node . ip ,
879
+ udp_port : node . udp_port ,
880
+ tcp_port : node . tcp_port ,
892
881
} ;
893
882
let pong: discv4:: Message = discv4:: Message :: Pong (
894
883
PongMessage :: new ( to, ping_hash, expiration) . with_enr_seq ( time_now_unix ( ) ) ,
@@ -897,7 +886,10 @@ async fn pong(socket: &UdpSocket, to_addr: SocketAddr, ping_hash: H256, signer:
897
886
pong. encode_with_header ( & mut buf, signer) ;
898
887
899
888
// Send pong and log if error
900
- if let Err ( e) = socket. send_to ( & buf, to_addr) . await {
889
+ if let Err ( e) = socket
890
+ . send_to ( & buf, SocketAddr :: new ( node. ip , node. udp_port ) )
891
+ . await
892
+ {
901
893
error ! ( "Unable to send pong: {e}" )
902
894
}
903
895
}
@@ -1132,17 +1124,17 @@ mod tests {
1132
1124
async fn connect_servers ( server_a : & mut MockServer , server_b : & mut MockServer ) {
1133
1125
let ping_hash = ping (
1134
1126
& server_a. udp_socket ,
1135
- server_a. addr ,
1136
- server_b. addr ,
1127
+ server_a. local_node ,
1128
+ server_b. local_node ,
1137
1129
& server_a. signer ,
1138
1130
)
1139
1131
. await ;
1140
1132
{
1141
1133
let mut table = server_a. table . lock ( ) . await ;
1142
1134
table. insert_node ( Node {
1143
- ip : server_b. addr . ip ( ) ,
1144
- udp_port : server_b. addr . port ( ) ,
1145
- tcp_port : 0 ,
1135
+ ip : server_b. local_node . ip ,
1136
+ udp_port : server_b. local_node . udp_port ,
1137
+ tcp_port : server_b . local_node . tcp_port ,
1146
1138
node_id : server_b. node_id ,
1147
1139
} ) ;
1148
1140
table. update_peer_ping ( server_b. node_id , ping_hash) ;
@@ -1169,7 +1161,7 @@ mod tests {
1169
1161
1170
1162
// start revalidation server
1171
1163
tokio:: spawn ( peers_revalidation (
1172
- server_b. addr ,
1164
+ server_b. local_node ,
1173
1165
server_b. udp_socket . clone ( ) ,
1174
1166
server_b. table . clone ( ) ,
1175
1167
server_b. signer . clone ( ) ,
@@ -1400,8 +1392,8 @@ mod tests {
1400
1392
// and trigger a enr-request to server_b to update the record.
1401
1393
ping (
1402
1394
& server_b. udp_socket ,
1403
- server_b. addr ,
1404
- server_a. addr ,
1395
+ server_b. local_node ,
1396
+ server_a. local_node ,
1405
1397
& server_b. signer ,
1406
1398
)
1407
1399
. await ;
0 commit comments