mod cert_verifier;
mod config;
mod mock;
mod quic;
mod stream_buffer;
pub use quic::*;
use futures::{Sink, Stream};
#[cfg(any(feature = "test_helpers", feature = "benchmarks", test))]
pub use mock::{MockNetwork, NoRecvNetwork, UnboundedDuplexStream};
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use crate::{
algebra::{scalar::Scalar, stark_curve::StarkPoint},
error::MpcNetworkError,
fabric::ResultId,
};
pub type PartyId = u64;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct NetworkOutbound {
pub result_id: ResultId,
pub payload: NetworkPayload,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub enum NetworkPayload {
Bytes(Vec<u8>),
Scalar(Scalar),
ScalarBatch(Vec<Scalar>),
Point(StarkPoint),
PointBatch(Vec<StarkPoint>),
}
impl From<Vec<u8>> for NetworkPayload {
fn from(bytes: Vec<u8>) -> Self {
Self::Bytes(bytes)
}
}
impl From<Scalar> for NetworkPayload {
fn from(scalar: Scalar) -> Self {
Self::Scalar(scalar)
}
}
impl From<Vec<Scalar>> for NetworkPayload {
fn from(scalars: Vec<Scalar>) -> Self {
Self::ScalarBatch(scalars)
}
}
impl From<StarkPoint> for NetworkPayload {
fn from(point: StarkPoint) -> Self {
Self::Point(point)
}
}
impl From<Vec<StarkPoint>> for NetworkPayload {
fn from(value: Vec<StarkPoint>) -> Self {
Self::PointBatch(value)
}
}
#[async_trait]
pub trait MpcNetwork:
Send
+ Stream<Item = Result<NetworkOutbound, MpcNetworkError>>
+ Sink<NetworkOutbound, Error = MpcNetworkError>
{
fn party_id(&self) -> PartyId;
async fn close(&mut self) -> Result<(), MpcNetworkError>;
}