Skip to main content

hotmint_consensus/
network.rs

1use hotmint_types::{ConsensusMessage, ValidatorId};
2
3pub trait NetworkSink: Send + Sync {
4    fn broadcast(&self, msg: ConsensusMessage);
5    fn send_to(&self, target: ValidatorId, msg: ConsensusMessage);
6}
7
8/// Channel-based network stub: routes messages via mpsc senders
9pub struct ChannelNetwork {
10    pub self_id: ValidatorId,
11    pub senders: Vec<(
12        ValidatorId,
13        tokio::sync::mpsc::UnboundedSender<(ValidatorId, ConsensusMessage)>,
14    )>,
15}
16
17impl ChannelNetwork {
18    pub fn new(
19        self_id: ValidatorId,
20        senders: Vec<(
21            ValidatorId,
22            tokio::sync::mpsc::UnboundedSender<(ValidatorId, ConsensusMessage)>,
23        )>,
24    ) -> Self {
25        Self { self_id, senders }
26    }
27}
28
29impl NetworkSink for ChannelNetwork {
30    fn broadcast(&self, msg: ConsensusMessage) {
31        for (id, sender) in &self.senders {
32            if *id != self.self_id {
33                let _ = sender.send((self.self_id, msg.clone()));
34            }
35        }
36    }
37
38    fn send_to(&self, target: ValidatorId, msg: ConsensusMessage) {
39        for (id, sender) in &self.senders {
40            if *id == target {
41                let _ = sender.send((self.self_id, msg));
42                return;
43            }
44        }
45    }
46}