146 lines
3.9 KiB
Rust
Raw Normal View History

2024-11-06 06:14:29 +02:00
pub mod state;
2024-11-06 08:45:25 +01:00
mod step_scheduler;
2024-11-06 15:03:40 +07:00
mod stream_wrapper;
2024-11-06 08:45:25 +01:00
use super::{Node, NodeId};
use crate::network::{InMemoryNetworkInterface, NetworkInterface, PayloadSize};
2024-11-06 15:03:40 +07:00
use crossbeam::channel;
use futures::Stream;
use nomos_mix::persistent_transmission::{
PersistentTransmissionExt, PersistentTransmissionSettings, PersistentTransmissionStream,
};
use nomos_mix_message::mock::MockMixMessage;
use rand::SeedableRng;
use rand_chacha::ChaCha12Rng;
2024-11-06 06:14:29 +02:00
use serde::Deserialize;
use state::MixnodeState;
2024-11-06 15:03:40 +07:00
use std::{
pin::{self},
task::Poll,
time::Duration,
};
use step_scheduler::Interval;
use stream_wrapper::CrossbeamReceiverStream;
#[derive(Debug, Clone)]
pub enum MixMessage {
2024-11-06 15:03:40 +07:00
Dummy(Vec<u8>),
}
impl PayloadSize for MixMessage {
fn size_bytes(&self) -> u32 {
2208
}
}
2024-11-06 06:14:29 +02:00
#[derive(Clone, Default, Deserialize)]
pub struct MixnodeSettings {
pub connected_peers: Vec<NodeId>,
2024-11-06 15:03:40 +07:00
pub seed: u64,
pub persistent_transmission: PersistentTransmissionSettings,
}
/// This node implementation only used for testing different streaming implementation purposes.
pub struct MixNode {
id: NodeId,
2024-11-06 06:14:29 +02:00
state: MixnodeState,
settings: MixnodeSettings,
network_interface: InMemoryNetworkInterface<MixMessage>,
2024-11-06 15:03:40 +07:00
persistent_sender: channel::Sender<Vec<u8>>,
update_time_sender: channel::Sender<Duration>,
persistent_transmission_messages: PersistentTransmissionStream<
CrossbeamReceiverStream<Vec<u8>>,
ChaCha12Rng,
MockMixMessage,
Interval,
>,
}
impl MixNode {
pub fn new(
id: NodeId,
settings: MixnodeSettings,
network_interface: InMemoryNetworkInterface<MixMessage>,
) -> Self {
2024-11-06 15:03:40 +07:00
let state = MixnodeState {
node_id: id,
mock_counter: 0,
step_id: 0,
};
let (persistent_sender, persistent_receiver) = channel::unbounded();
let (update_time_sender, update_time_receiver) = channel::unbounded();
let persistent_transmission_messages = CrossbeamReceiverStream::new(persistent_receiver)
.persistent_transmission(
settings.persistent_transmission,
ChaCha12Rng::seed_from_u64(settings.seed),
Interval::new(
Duration::from_secs_f64(
1.0 / settings.persistent_transmission.max_emission_frequency,
),
update_time_receiver,
),
);
Self {
id,
network_interface,
settings,
2024-11-06 15:03:40 +07:00
state,
persistent_sender,
update_time_sender,
persistent_transmission_messages,
}
}
fn forward(&self, message: MixMessage) {
for node_id in self.settings.connected_peers.iter() {
self.network_interface
.send_message(*node_id, message.clone())
}
}
}
impl Node for MixNode {
type Settings = MixnodeSettings;
2024-11-06 06:14:29 +02:00
type State = MixnodeState;
fn id(&self) -> NodeId {
self.id
}
fn state(&self) -> &Self::State {
&self.state
}
2024-11-06 15:03:40 +07:00
fn step(&mut self, elapsed: Duration) {
let Self {
update_time_sender,
persistent_transmission_messages,
..
} = self;
let messages = self.network_interface.receive_messages();
for message in messages {
println!(">>>>> Node {}, message: {message:?}", self.id);
2024-11-06 15:03:40 +07:00
let MixMessage::Dummy(msg) = message.into_payload();
self.persistent_sender.send(msg).unwrap();
}
2024-11-06 06:14:29 +02:00
self.state.step_id += 1;
self.state.mock_counter += 1;
2024-11-06 15:03:40 +07:00
update_time_sender.send(elapsed).unwrap();
let waker = futures::task::noop_waker();
let mut cx = futures::task::Context::from_waker(&waker);
if let Poll::Ready(Some(msg)) =
pin::pin!(persistent_transmission_messages).poll_next(&mut cx)
{
self.forward(MixMessage::Dummy(msg));
}
}
}