Skip to content

Commit e340bd9

Browse files
fix(l1): send our advertised tcp ports in discovery (#1785)
**Motivation** In discovery, we missed sending our local node TCP port when sending `ping` and `pong` messages. **Description** This pr fixes it by sending our local node configured ports. Closes None
1 parent 6914df1 commit e340bd9

File tree

1 file changed

+50
-58
lines changed

1 file changed

+50
-58
lines changed

crates/networking/p2p/net.rs

Lines changed: 50 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,15 @@ async fn discover_peers(
123123
));
124124

125125
tracker.spawn(peers_revalidation(
126-
udp_addr,
126+
local_node,
127127
udp_socket.clone(),
128128
table.clone(),
129129
signer.clone(),
130130
REVALIDATION_INTERVAL_IN_SECONDS as u64,
131131
));
132132

133133
discovery_startup(
134-
udp_addr,
134+
local_node,
135135
udp_socket.clone(),
136136
table.clone(),
137137
signer.clone(),
@@ -189,16 +189,22 @@ async fn discover_peers_server(
189189
debug!("Ignoring ping as it is expired.");
190190
continue;
191191
};
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+
};
192198
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 = {
195201
let table = table.lock().await;
196202
table.get_by_node_id(packet.get_node_id()).cloned()
197203
};
198-
if let Some(peer) = node {
204+
if let Some(peer) = peer {
199205
// send a a ping to get an endpoint proof
200206
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;
202208
if let Some(hash) = hash {
203209
table
204210
.lock()
@@ -222,15 +228,9 @@ async fn discover_peers_server(
222228
}
223229
} else {
224230
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-
};
231231
if let (Some(peer), true) = table.insert_node(node) {
232232
// 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;
234234
table.update_peer_ping(peer.node.node_id, hash);
235235
}
236236
}
@@ -372,10 +372,8 @@ async fn discover_peers_server(
372372
if let Some(nodes) = nodes_to_insert {
373373
for node in nodes {
374374
if let (Some(peer), true) = table.insert_node(node) {
375-
let node_addr =
376-
SocketAddr::new(peer.node.ip, peer.node.udp_port);
377375
let ping_hash =
378-
ping(&udp_socket, udp_addr, node_addr, &signer).await;
376+
ping(&udp_socket, local_node, peer.node, &signer).await;
379377
table.update_peer_ping(peer.node.node_id, ping_hash);
380378
}
381379
}
@@ -492,22 +490,23 @@ async fn discover_peers_server(
492490
/// currently, since we are not storing nodes, the only way to have startup nodes is by providing
493491
/// an array of bootnodes.
494492
async fn discovery_startup(
495-
udp_addr: SocketAddr,
493+
local_node: Node,
496494
udp_socket: Arc<UdpSocket>,
497495
table: Arc<Mutex<KademliaTable>>,
498496
signer: SigningKey,
499497
bootnodes: Vec<BootNode>,
500498
) {
501499
for bootnode in bootnodes {
502-
table.lock().await.insert_node(Node {
500+
let node = Node {
503501
ip: bootnode.socket_address.ip(),
504502
udp_port: bootnode.socket_address.port(),
505503
// TODO: udp port can differ from tcp port.
506504
// see https://github.com/lambdaclass/ethrex/issues/905
507505
tcp_port: bootnode.socket_address.port(),
508506
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;
511510
table
512511
.lock()
513512
.await
@@ -532,7 +531,7 @@ const PROOF_EXPIRATION_IN_HS: usize = 12;
532531
///
533532
/// See more https://github.com/ethereum/devp2p/blob/master/discv4.md#kademlia-table
534533
async fn peers_revalidation(
535-
udp_addr: SocketAddr,
534+
local_node: Node,
536535
udp_socket: Arc<UdpSocket>,
537536
table: Arc<Mutex<KademliaTable>>,
538537
signer: SigningKey,
@@ -566,13 +565,7 @@ async fn peers_revalidation(
566565
if peer.liveness == 0 {
567566
let new_peer = table.replace_peer(node_id);
568567
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;
576569
table.update_peer_ping(new_peer.node.node_id, ping_hash);
577570
}
578571
}
@@ -585,13 +578,7 @@ async fn peers_revalidation(
585578
let peers = table.lock().await.get_least_recently_pinged_peers(3);
586579
previously_pinged_peers = HashSet::default();
587580
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;
595582
let mut table = table.lock().await;
596583
table.update_peer_ping_with_revalidation(peer.node.node_id, ping_hash);
597584
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) {
792779
/// an optional hash corresponding to the message header hash to account if the send was successful
793780
async fn ping(
794781
socket: &UdpSocket,
795-
local_addr: SocketAddr,
796-
to_addr: SocketAddr,
782+
local_node: Node,
783+
node: Node,
797784
signer: &SigningKey,
798785
) -> Option<H256> {
799786
let mut buf = Vec::new();
@@ -803,24 +790,26 @@ async fn ping(
803790
.unwrap_or_default()
804791
.as_secs();
805792

806-
// TODO: this should send our advertised TCP port
807793
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,
811797
};
812798
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,
816802
};
817803

818804
let ping =
819805
discv4::Message::Ping(PingMessage::new(from, to, expiration).with_enr_seq(time_now_unix()));
820806
ping.encode_with_header(&mut buf, signer);
821807

822808
// 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+
{
824813
Ok(bytes_sent) => {
825814
// sanity check to make sure the ping was well sent
826815
// 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(
877866
}
878867
}
879868

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) {
881870
let mut buf = Vec::new();
882871

883872
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:
886875
.as_secs();
887876

888877
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,
892881
};
893882
let pong: discv4::Message = discv4::Message::Pong(
894883
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:
897886
pong.encode_with_header(&mut buf, signer);
898887

899888
// 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+
{
901893
error!("Unable to send pong: {e}")
902894
}
903895
}
@@ -1132,17 +1124,17 @@ mod tests {
11321124
async fn connect_servers(server_a: &mut MockServer, server_b: &mut MockServer) {
11331125
let ping_hash = ping(
11341126
&server_a.udp_socket,
1135-
server_a.addr,
1136-
server_b.addr,
1127+
server_a.local_node,
1128+
server_b.local_node,
11371129
&server_a.signer,
11381130
)
11391131
.await;
11401132
{
11411133
let mut table = server_a.table.lock().await;
11421134
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,
11461138
node_id: server_b.node_id,
11471139
});
11481140
table.update_peer_ping(server_b.node_id, ping_hash);
@@ -1169,7 +1161,7 @@ mod tests {
11691161

11701162
// start revalidation server
11711163
tokio::spawn(peers_revalidation(
1172-
server_b.addr,
1164+
server_b.local_node,
11731165
server_b.udp_socket.clone(),
11741166
server_b.table.clone(),
11751167
server_b.signer.clone(),
@@ -1400,8 +1392,8 @@ mod tests {
14001392
// and trigger a enr-request to server_b to update the record.
14011393
ping(
14021394
&server_b.udp_socket,
1403-
server_b.addr,
1404-
server_a.addr,
1395+
server_b.local_node,
1396+
server_a.local_node,
14051397
&server_b.signer,
14061398
)
14071399
.await;

0 commit comments

Comments
 (0)