mod cert_verifier;
mod config;
mod mock;
mod quic;
mod stream_buffer;
use ark_ec::CurveGroup;
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::{curve::CurvePoint, scalar::Scalar},
error::MpcNetworkError,
fabric::ResultId,
};
pub type PartyId = u64;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(bound = "C: CurveGroup")]
pub struct NetworkOutbound<C: CurveGroup> {
pub result_id: ResultId,
pub payload: NetworkPayload<C>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(bound(serialize = "C: CurveGroup", deserialize = "C: CurveGroup"))]
pub enum NetworkPayload<C: CurveGroup> {
Bytes(Vec<u8>),
Scalar(Scalar<C>),
ScalarBatch(Vec<Scalar<C>>),
Point(CurvePoint<C>),
PointBatch(Vec<CurvePoint<C>>),
}
impl<C: CurveGroup> From<Vec<u8>> for NetworkPayload<C> {
fn from(bytes: Vec<u8>) -> Self {
Self::Bytes(bytes)
}
}
impl<C: CurveGroup> From<Scalar<C>> for NetworkPayload<C> {
fn from(scalar: Scalar<C>) -> Self {
Self::Scalar(scalar)
}
}
impl<C: CurveGroup> From<Vec<Scalar<C>>> for NetworkPayload<C> {
fn from(scalars: Vec<Scalar<C>>) -> Self {
Self::ScalarBatch(scalars)
}
}
impl<C: CurveGroup> From<CurvePoint<C>> for NetworkPayload<C> {
fn from(point: CurvePoint<C>) -> Self {
Self::Point(point)
}
}
impl<C: CurveGroup> From<Vec<CurvePoint<C>>> for NetworkPayload<C> {
fn from(value: Vec<CurvePoint<C>>) -> Self {
Self::PointBatch(value)
}
}
#[async_trait]
pub trait MpcNetwork<C: CurveGroup>:
Send
+ Stream<Item = Result<NetworkOutbound<C>, MpcNetworkError>>
+ Sink<NetworkOutbound<C>, Error = MpcNetworkError>
{
fn party_id(&self) -> PartyId;
async fn close(&mut self) -> Result<(), MpcNetworkError>;
}