Skip to main content

hotmint_consensus/
network.rs

1use 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    /// Notify the network layer of a validator set change (epoch transition).
7    /// Default is no-op for test stubs.
8    fn on_epoch_change(&self, _new_validator_set: &ValidatorSet) {}
9}
10
11/// Channel-based network stub: routes messages via mpsc senders
12pub 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}