use super::VirtualMachine;
use crate::net::client_store::ClientInputStore;
use crate::net::client_store::ClientShare;
use crate::net::client_store::ClientShareIndex;
use crate::net::mpc_engine::AsyncMpcEngine;
use crate::net::mpc_engine::{MpcEngine, MpcRuntimeInfo};
use crate::VirtualMachineResult;
use std::sync::Arc;
use stoffel_vm_types::core_types::{ShareData, ShareType, Value};
impl VirtualMachine {
pub fn set_mpc_engine(&mut self, engine: Arc<dyn MpcEngine>) {
self.state.set_mpc_engine(engine);
}
pub fn mpc_runtime_info(&self) -> Option<MpcRuntimeInfo> {
self.state.mpc_runtime_info()
}
pub fn ensure_mpc_ready(&self) -> VirtualMachineResult<()> {
Ok(self.state.ensure_mpc_ready()?)
}
pub fn open_share_value(&self, value: &Value) -> VirtualMachineResult<Value> {
Ok(self.state.open_share_value(value)?)
}
pub fn clear_client_inputs(&self) {
self.state.clear_client_inputs();
}
pub fn set_client_roster<I>(&self, clients: I)
where
I: IntoIterator<Item = stoffelnet::network_utils::ClientId>,
{
self.state.set_client_roster(clients);
}
pub(crate) fn client_input_store_for_async_engine<E: AsyncMpcEngine + ?Sized>(
&self,
engine: &E,
) -> VirtualMachineResult<Arc<ClientInputStore>> {
self.state.ensure_async_engine_matches(engine)?;
Ok(self.state.client_input_store())
}
pub fn client_share_data(
&self,
client_id: stoffelnet::network_utils::ClientId,
index: crate::net::client_store::ClientShareIndex,
) -> Option<ClientShare> {
self.state.client_share_data(client_id, index)
}
pub fn store_client_shares(
&self,
client_id: stoffelnet::network_utils::ClientId,
shares: Vec<ClientShare>,
) {
self.state.store_client_shares(client_id, shares);
}
pub fn replace_client_shares<I>(&self, inputs: I) -> usize
where
I: IntoIterator<Item = (stoffelnet::network_utils::ClientId, Vec<ClientShare>)>,
{
self.state.replace_client_shares(inputs)
}
pub fn try_store_client_input<F>(
&self,
client_id: stoffelnet::network_utils::ClientId,
shares: Vec<
stoffelmpc_mpc::honeybadger::robust_interpolate::robust_interpolate::RobustShare<F>,
>,
) -> VirtualMachineResult<usize>
where
F: ark_ff::FftField,
{
Ok(self.state.try_store_client_input(client_id, shares)?)
}
pub fn try_store_client_input_with_types<F>(
&self,
client_id: stoffelnet::network_utils::ClientId,
shares: Vec<
stoffelmpc_mpc::honeybadger::robust_interpolate::robust_interpolate::RobustShare<F>,
>,
share_types: &[ShareType],
) -> VirtualMachineResult<usize>
where
F: ark_ff::FftField,
{
Ok(self
.state
.try_store_client_input_with_types(client_id, shares, share_types)?)
}
pub fn try_replace_client_inputs<F, I>(&self, inputs: I) -> VirtualMachineResult<usize>
where
F: ark_ff::FftField,
I: IntoIterator<
Item = (
stoffelnet::network_utils::ClientId,
Vec<
stoffelmpc_mpc::honeybadger::robust_interpolate::robust_interpolate::RobustShare<
F,
>,
>,
),
>,
{
Ok(self.state.try_replace_client_input(inputs)?)
}
pub fn client_share<F>(
&self,
client_id: stoffelnet::network_utils::ClientId,
index: ClientShareIndex,
) -> Option<stoffelmpc_mpc::honeybadger::robust_interpolate::robust_interpolate::RobustShare<F>>
where
F: ark_ff::FftField,
{
self.state.client_share(client_id, index)
}
pub fn try_store_client_input_feldman<F, G>(
&self,
client_id: stoffelnet::network_utils::ClientId,
shares: Vec<stoffelmpc_mpc::common::share::feldman::FeldmanShamirShare<F, G>>,
) -> VirtualMachineResult<usize>
where
F: ark_ff::FftField + ark_ff::PrimeField,
G: ark_ec::CurveGroup<ScalarField = F>,
{
Ok(self
.state
.try_store_client_input_feldman(client_id, shares)?)
}
pub fn try_store_client_input_feldman_with_types<F, G>(
&self,
client_id: stoffelnet::network_utils::ClientId,
shares: Vec<stoffelmpc_mpc::common::share::feldman::FeldmanShamirShare<F, G>>,
share_types: &[ShareType],
) -> VirtualMachineResult<usize>
where
F: ark_ff::FftField + ark_ff::PrimeField,
G: ark_ec::CurveGroup<ScalarField = F>,
{
Ok(self
.state
.try_store_client_input_feldman_with_types(client_id, shares, share_types)?)
}
pub fn hydrate_from_mpc_engine(
&self,
) -> VirtualMachineResult<crate::net::client_store::ClientInputHydrationCount> {
Ok(self.state.hydrate_from_mpc_engine()?)
}
pub fn refresh_client_inputs(
&self,
) -> VirtualMachineResult<crate::net::client_store::ClientInputHydrationCount> {
Ok(self.state.refresh_client_inputs()?)
}
pub fn create_share_object(
&mut self,
share_type: ShareType,
share_data: ShareData,
party_id: usize,
) -> VirtualMachineResult<Value> {
Ok(self
.state
.create_share_object_value(share_type, share_data, party_id)?)
}
pub fn read_share_object(
&mut self,
value: &Value,
) -> VirtualMachineResult<(ShareType, ShareData)> {
Ok(self.state.extract_share_data(value)?)
}
pub fn create_avss_share_object(
&mut self,
key_name: &str,
share_data: Vec<u8>,
commitment_bytes: Vec<Vec<u8>>,
party_id: usize,
) -> VirtualMachineResult<Value> {
Ok(self.state.create_avss_share_object_value(
key_name,
share_data,
commitment_bytes,
party_id,
)?)
}
pub fn is_avss_share_object(&mut self, value: &Value) -> bool {
self.state.is_avss_share_object(value)
}
pub fn avss_key_name(&mut self, value: &Value) -> VirtualMachineResult<String> {
Ok(self.state.avss_key_name(value)?)
}
pub fn avss_commitment(
&mut self,
value: &Value,
index: usize,
) -> VirtualMachineResult<Vec<u8>> {
Ok(self.state.avss_commitment(value, index)?)
}
pub fn avss_commitment_count(&mut self, value: &Value) -> VirtualMachineResult<usize> {
Ok(self.state.avss_commitment_count(value)?)
}
}