use crate::{
common::{rbc::RbcError, share::ShareError},
honeybadger::{
batch_recon::BatchReconError,
robust_interpolate::{robust_interpolate::RobustShare, InterpolateError},
SessionId,
},
};
use ark_ff::FftField;
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, SerializationError};
use bincode::ErrorKind;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use stoffelnet::network_utils::{NetworkError, PartyId};
use thiserror::Error;
use tokio::sync::oneshot::{channel, Receiver, Sender};
pub mod multiplication;
#[derive(Clone, Debug, PartialEq)]
pub enum MultProtocolState {
NotInitialized,
Finished,
NotFinished,
}
#[derive(Debug)]
pub struct MultStorage<F>
where
F: FftField,
{
pub no_of_mul: Option<usize>,
pub output_open_mult1: HashMap<u8, Vec<F>>,
pub output_open_mult2: HashMap<u8, Vec<F>>,
pub inputs: (Vec<RobustShare<F>>, Vec<RobustShare<F>>),
pub protocol_state: MultProtocolState,
pub share_mult_from_triple: Vec<RobustShare<F>>,
pub received_shares: HashMap<PartyId, (Vec<RobustShare<F>>, Vec<RobustShare<F>>)>,
pub openings: Option<(Vec<F>, Vec<F>)>,
pub output_sender: Option<Sender<Vec<RobustShare<F>>>>,
pub output_receiver: Option<Receiver<Vec<RobustShare<F>>>>,
}
impl<F> MultStorage<F>
where
F: FftField,
{
pub fn empty() -> Self {
let (output_sender, output_receiver) = channel();
Self {
no_of_mul: None,
output_open_mult1: HashMap::new(),
output_open_mult2: HashMap::new(),
inputs: (Vec::new(), Vec::new()),
protocol_state: MultProtocolState::NotInitialized,
share_mult_from_triple: Vec::new(),
received_shares: HashMap::new(),
openings: None,
output_sender: Some(output_sender),
output_receiver: Some(output_receiver),
}
}
}
#[derive(Debug, Error)]
pub enum MulError {
#[error("there was an error in the network: {0:?}")]
NetworkError(#[from] NetworkError),
#[error("Shard Error: {0:?}")]
ShareError(#[from] ShareError),
#[error("error in the RBC: {0:?}")]
RbcError(#[from] RbcError),
#[error("error while serializing an arkworks object: {0:?}")]
ArkSerialization(#[from] SerializationError),
#[error("error while serializing an arkworks object: {0:?}")]
ArkDeserialization(SerializationError),
#[error("error sending the result: {0:?}")]
SendError(SessionId),
#[error("error receiving the result: {0:?}")]
ReceiveError(SessionId),
#[error("Batch reconstruction error : {0:?}")]
BatchReconError(#[from] BatchReconError),
#[error("Duplicate input: {0}")]
Duplicate(String),
#[error("Invalid input: {0}")]
InvalidInput(String),
#[error("error during the serialization using bincode: {0:?}")]
BincodeSerializationError(#[from] Box<ErrorKind>),
#[error("Interpolate error: {0:?}")]
InterpolateError(#[from] InterpolateError),
#[error("no such session ID exists: {0:?}")]
NoSuchSessionId(SessionId),
#[error("result already received: {0:?}")]
ResultAlreadyReceived(SessionId),
#[error("multiplication {0:?} did not complete in time")]
Timeout(SessionId),
#[error("Channel closed")]
Abort,
#[error("Session id {0:?} does not exist in store")]
ClearStoreError(SessionId),
#[error("Store Limit")]
LimitError,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct MultMessage {
pub sender: PartyId,
pub session_id: SessionId,
pub payload: Vec<u8>,
}
impl MultMessage {
pub fn new(sender: PartyId, session_id: SessionId, payload: Vec<u8>) -> Self {
Self {
sender,
session_id,
payload,
}
}
}
#[derive(CanonicalDeserialize, CanonicalSerialize)]
pub struct ReconstructionMessage<F: FftField> {
pub a_sub_x: Vec<RobustShare<F>>,
pub b_sub_y: Vec<RobustShare<F>>,
}
impl<F> ReconstructionMessage<F>
where
F: FftField,
{
pub fn new(a_sub_x: Vec<RobustShare<F>>, b_sub_y: Vec<RobustShare<F>>) -> Self {
Self { a_sub_x, b_sub_y }
}
}
pub fn concat_sorted<F: FftField>(map: &HashMap<u8, Vec<F>>) -> Vec<F> {
let mut keys: Vec<_> = map.keys().cloned().collect();
keys.sort_unstable();
let total_len: usize = keys.iter().map(|k| map[k].len()).sum();
let mut out = Vec::with_capacity(total_len);
for k in keys {
out.extend_from_slice(&map[&k]);
}
out
}