Skip to content

Commit eb59a07

Browse files
committed
monad-peer-discovery: added authenticated udp port to name record
1 parent 88b11ee commit eb59a07

File tree

14 files changed

+378
-66
lines changed

14 files changed

+378
-66
lines changed

monad-debug-node/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ fn main() -> Result<(), Error> {
176176
secp256k1_pubkey: peer.pubkey,
177177
name_record_sig: peer.signature,
178178
record_seq_num: peer.record_seq_num,
179+
auth_port: peer.auth_port,
179180
};
180181
peer_configs.push(peer_config);
181182
}

monad-executor-glue/src/lib.rs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -269,17 +269,31 @@ pub struct PeerEntry<ST: CertificateSignatureRecoverable> {
269269

270270
pub signature: ST,
271271
pub record_seq_num: u64,
272+
273+
#[serde(skip_serializing_if = "Option::is_none")]
274+
pub auth_port: Option<u16>,
272275
}
273276

274277
impl<ST: CertificateSignatureRecoverable> Encodable for PeerEntry<ST> {
275278
fn encode(&self, out: &mut dyn alloy_rlp::BufMut) {
276-
let enc: [&dyn Encodable; 4] = [
277-
&self.pubkey,
278-
&self.addr.to_string(),
279-
&self.signature,
280-
&self.record_seq_num,
281-
];
282-
encode_list::<_, dyn Encodable>(&enc, out);
279+
if let Some(auth_port) = self.auth_port {
280+
let enc: [&dyn Encodable; 5] = [
281+
&self.pubkey,
282+
&self.addr.to_string(),
283+
&self.signature,
284+
&self.record_seq_num,
285+
&auth_port,
286+
];
287+
encode_list::<_, dyn Encodable>(&enc, out);
288+
} else {
289+
let enc: [&dyn Encodable; 4] = [
290+
&self.pubkey,
291+
&self.addr.to_string(),
292+
&self.signature,
293+
&self.record_seq_num,
294+
];
295+
encode_list::<_, dyn Encodable>(&enc, out);
296+
}
283297
}
284298
}
285299

@@ -295,11 +309,18 @@ impl<ST: CertificateSignatureRecoverable> Decodable for PeerEntry<ST> {
295309
let signature = ST::decode(&mut payload)?;
296310
let record_seq_num = u64::decode(&mut payload)?;
297311

312+
let auth_port = if !payload.is_empty() {
313+
Some(u16::decode(&mut payload)?)
314+
} else {
315+
None
316+
};
317+
298318
Ok(Self {
299319
pubkey,
300320
addr,
301321
signature,
302322
record_seq_num,
323+
auth_port,
303324
})
304325
}
305326
}
@@ -2497,6 +2518,7 @@ mod tests {
24972518
addr,
24982519
signature,
24992520
record_seq_num,
2521+
auth_port: None,
25002522
};
25012523
let encoded = alloy_rlp::encode(&entry);
25022524
let decoded: PeerEntry<NopSignature> = alloy_rlp::decode_exact(&encoded).unwrap();

monad-node-config/src/bootstrap.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,7 @@ pub struct NodeBootstrapPeerConfig<ST: CertificateSignatureRecoverable> {
4040

4141
#[serde(bound = "ST: CertificateSignatureRecoverable")]
4242
pub name_record_sig: ST,
43+
44+
#[serde(skip_serializing_if = "Option::is_none")]
45+
pub auth_port: Option<u16>,
4346
}

monad-node/src/main.rs

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,8 @@ use monad_chain_config::ChainConfig;
3030
use monad_consensus_state::ConsensusConfig;
3131
use monad_consensus_types::{metrics::Metrics, validator_data::ValidatorSetDataWithEpoch};
3232
use monad_control_panel::ipc::ControlPanelIpcReceiver;
33-
use monad_crypto::{
34-
certificate_signature::{
35-
CertificateKeyPair, CertificateSignaturePubKey, CertificateSignatureRecoverable, PubKey,
36-
},
37-
signing_domain,
33+
use monad_crypto::certificate_signature::{
34+
CertificateKeyPair, CertificateSignaturePubKey, CertificateSignatureRecoverable, PubKey,
3835
};
3936
use monad_dataplane::DataplaneBuilder;
4037
use monad_eth_block_policy::EthBlockPolicy;
@@ -591,22 +588,17 @@ where
591588
return None;
592589
}
593590
};
594-
let name_record = NameRecord::new(*address.ip(), address.port(), peer.record_seq_num);
595-
596-
// verify signature of name record
597-
let mut encoded = Vec::new();
598-
name_record.encode(&mut encoded);
599-
match peer
600-
.name_record_sig
601-
.verify::<signing_domain::NameRecord>(&encoded, &peer.secp256k1_pubkey)
602-
{
603-
Ok(_) => Some((
604-
node_id,
605-
MonadNameRecord {
606-
name_record,
607-
signature: peer.name_record_sig,
608-
},
609-
)),
591+
592+
let peer_entry = monad_executor_glue::PeerEntry {
593+
pubkey: peer.secp256k1_pubkey,
594+
addr: address,
595+
signature: peer.name_record_sig,
596+
record_seq_num: peer.record_seq_num,
597+
auth_port: peer.auth_port,
598+
};
599+
600+
match MonadNameRecord::try_from(&peer_entry) {
601+
Ok(monad_name_record) => Some((node_id, monad_name_record)),
610602
Err(_) => {
611603
warn!(?node_id, "invalid name record signature in config file");
612604
None

monad-peer-disc-swarm/src/driver.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,9 @@ where
145145
let cmds = match event {
146146
PeerDiscoveryEvent::SendPing {
147147
to,
148-
socket_address,
148+
name_record,
149149
ping,
150-
} => self.algo.send_ping(to, socket_address, ping),
150+
} => self.algo.send_ping(to, name_record, ping),
151151
PeerDiscoveryEvent::PingRequest { from, ping } => self.algo.handle_ping(from, ping),
152152
PeerDiscoveryEvent::PongResponse { from, pong } => self.algo.handle_pong(from, pong),
153153
PeerDiscoveryEvent::PingTimeout { to, ping_id } => {
@@ -215,7 +215,7 @@ where
215215
PeerDiscoveryCommand::RouterCommand { target, message }
216216
| PeerDiscoveryCommand::PingPongCommand {
217217
target,
218-
socket_address: _,
218+
name_record: _,
219219
message,
220220
} => router_cmds.push(RouterCommand::Publish {
221221
target: RouterTarget::PointToPoint(target),

monad-peer-discovery/src/discovery.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ impl<ST: CertificateSignatureRecoverable> PeerDiscovery<ST> {
424424
self.metrics[GAUGE_PEER_DISC_NUM_PENDING_PEERS] = self.pending_queue.len() as u64;
425425

426426
// send ping to the peer, which will also insert the peer into pending queue
427-
Ok(self.send_ping(peer_id, name_record.udp_address(), ping_msg))
427+
Ok(self.send_ping(peer_id, name_record.name_record, ping_msg))
428428
}
429429

430430
fn remove_peer_from_pending(
@@ -619,7 +619,7 @@ where
619619
fn send_ping(
620620
&mut self,
621621
to: NodeId<CertificateSignaturePubKey<ST>>,
622-
socket_address: SocketAddrV4,
622+
name_record: NameRecord,
623623
ping: Ping<ST>,
624624
) -> Vec<PeerDiscoveryCommand<ST>> {
625625
debug!(?to, "sending ping request");
@@ -630,7 +630,7 @@ where
630630

631631
cmds.push(PeerDiscoveryCommand::PingPongCommand {
632632
target: to,
633-
socket_address,
633+
name_record,
634634
message: PeerDiscoveryMessage::Ping(ping),
635635
});
636636

@@ -711,7 +711,7 @@ where
711711
};
712712
cmds.push(PeerDiscoveryCommand::PingPongCommand {
713713
target: from,
714-
socket_address: ping_msg.local_name_record.udp_address(),
714+
name_record: ping_msg.local_name_record.name_record,
715715
message: PeerDiscoveryMessage::Pong(pong_msg),
716716
});
717717
self.metrics[GAUGE_PEER_DISC_SEND_PONG] += 1;
@@ -780,13 +780,13 @@ where
780780
cmds.extend(self.remove_peer_from_pending(to));
781781
} else {
782782
// retry ping
783-
let socket_address = info.name_record.udp_address();
783+
let name_record = info.name_record.name_record.clone();
784784
let ping = Ping {
785785
id: self.rng.next_u32(),
786786
local_name_record: self.self_record.clone(),
787787
};
788788
info.last_ping = ping.clone();
789-
cmds.extend(self.send_ping(to, socket_address, ping));
789+
cmds.extend(self.send_ping(to, name_record, ping));
790790
}
791791
}
792792

@@ -1538,6 +1538,13 @@ where
15381538
.map(|(id, name_record)| (*id, name_record.clone()))
15391539
.collect()
15401540
}
1541+
1542+
fn get_name_record(
1543+
&self,
1544+
id: &NodeId<CertificateSignaturePubKey<ST>>,
1545+
) -> Option<&MonadNameRecord<ST>> {
1546+
self.routing_info.get(id)
1547+
}
15411548
}
15421549

15431550
#[cfg(test)]
@@ -1666,7 +1673,7 @@ mod tests {
16661673
.filter_map(|c| match c {
16671674
PeerDiscoveryCommand::PingPongCommand {
16681675
target,
1669-
socket_address: _,
1676+
name_record: _,
16701677
message: PeerDiscoveryMessage::Ping(ping),
16711678
} => Some((target, ping)),
16721679
_ => None,
@@ -1679,7 +1686,7 @@ mod tests {
16791686
.filter_map(|c| match c {
16801687
PeerDiscoveryCommand::PingPongCommand {
16811688
target: _,
1682-
socket_address: _,
1689+
name_record: _,
16831690
message: PeerDiscoveryMessage::Pong(pong),
16841691
} => Some(pong),
16851692
_ => None,
@@ -1701,7 +1708,8 @@ mod tests {
17011708
id: 12345,
17021709
local_name_record: state.self_record.clone(),
17031710
};
1704-
let cmds = state.send_ping(peer1_pubkey, DUMMY_ADDR, ping);
1711+
let peer1_name_record = generate_name_record(peer1, 1).name_record;
1712+
let cmds = state.send_ping(peer1_pubkey, peer1_name_record, ping);
17051713

17061714
// should send a ping command and schedule a ping timeout
17071715
assert_eq!(cmds.len(), 2);
@@ -1714,7 +1722,7 @@ mod tests {
17141722
));
17151723
assert!(matches!(cmds[1], PeerDiscoveryCommand::PingPongCommand {
17161724
target: _,
1717-
socket_address: _,
1725+
name_record: _,
17181726
message: PeerDiscoveryMessage::Ping(_)
17191727
}));
17201728
}

monad-peer-discovery/src/driver.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
use std::{
1717
collections::{HashMap, VecDeque},
18-
net::{SocketAddr, SocketAddrV4},
18+
net::SocketAddr,
1919
task::{Context, Poll, Waker},
2020
time::Duration,
2121
};
@@ -40,7 +40,7 @@ pub enum PeerDiscoveryEmit<ST: CertificateSignatureRecoverable> {
4040
},
4141
PingPongCommand {
4242
target: NodeId<CertificateSignaturePubKey<ST>>,
43-
socket_address: SocketAddrV4,
43+
name_record: crate::NameRecord,
4444
message: PeerDiscoveryMessage<ST>,
4545
},
4646
MetricsCommand(ExecutorMetrics),
@@ -174,9 +174,9 @@ impl<PD: PeerDiscoveryAlgo> PeerDiscoveryDriver<PD> {
174174
let cmds = match event {
175175
PeerDiscoveryEvent::SendPing {
176176
to,
177-
socket_address,
177+
name_record,
178178
ping,
179-
} => self.pd.send_ping(to, socket_address, ping),
179+
} => self.pd.send_ping(to, name_record, ping),
180180
PeerDiscoveryEvent::PingRequest { from, ping } => self.pd.handle_ping(from, ping),
181181
PeerDiscoveryEvent::PongResponse { from, pong } => self.pd.handle_pong(from, pong),
182182
PeerDiscoveryEvent::PingTimeout { to, ping_id } => {
@@ -244,13 +244,13 @@ impl<PD: PeerDiscoveryAlgo> PeerDiscoveryDriver<PD> {
244244
}
245245
PeerDiscoveryCommand::PingPongCommand {
246246
target,
247-
socket_address,
247+
name_record,
248248
message,
249249
} => {
250250
self.pending_emits
251251
.push_back(PeerDiscoveryEmit::PingPongCommand {
252252
target,
253-
socket_address,
253+
name_record,
254254
message,
255255
});
256256

@@ -309,6 +309,13 @@ impl<PD: PeerDiscoveryAlgo> PeerDiscoveryDriver<PD> {
309309
self.pd.get_name_records()
310310
}
311311

312+
pub fn get_name_record(
313+
&self,
314+
id: &NodeId<CertificateSignaturePubKey<PD::SignatureType>>,
315+
) -> Option<&MonadNameRecord<PD::SignatureType>> {
316+
self.pd.get_name_record(id)
317+
}
318+
312319
pub fn metrics(&self) -> &ExecutorMetrics {
313320
self.pd.metrics()
314321
}

0 commit comments

Comments
 (0)