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