mod field;
mod gadgets;
mod program_node;
mod rns_polynomial;
pub use field::*;
pub use petgraph::stable_graph::NodeIndex;
pub use program_node::*;
pub use rns_polynomial::*;
use sunscreen_compiler_common::TypeName;
pub use sunscreen_zkp_backend::{BigInt, FieldSpec, Gadget};
pub use sunscreen_runtime::{ToNativeFields, ZkpProgramInputTrait};
pub trait AddVar
where
Self: Sized + ZkpType,
{
fn add(lhs: ProgramNode<Self>, rhs: ProgramNode<Self>) -> ProgramNode<Self>;
}
pub trait MulVar
where
Self: Sized + ZkpType,
{
fn mul(lhs: ProgramNode<Self>, rhs: ProgramNode<Self>) -> ProgramNode<Self>;
}
pub trait DivVar
where
Self: Sized + ZkpType,
{
fn div(lhs: ProgramNode<Self>, rhs: ProgramNode<Self>) -> ProgramNode<Self>;
}
pub trait RemVar
where
Self: Sized + ZkpType,
{
fn rem(lhs: ProgramNode<Self>, rhs: ProgramNode<Self>) -> ProgramNode<Self>;
}
pub trait SubVar
where
Self: Sized + ZkpType,
{
fn sub(lhs: ProgramNode<Self>, rhs: ProgramNode<Self>) -> ProgramNode<Self>;
}
pub trait NegVar
where
Self: Sized + ZkpType,
{
fn neg(lhs: ProgramNode<Self>) -> ProgramNode<Self>;
}
pub trait ConstrainEqVarVar
where
Self: Sized + ZkpType,
{
fn constrain_eq(lhs: ProgramNode<Self>, rhs: ProgramNode<Self>) -> ProgramNode<Self>;
}
pub trait ConstrainCmpVarVar
where
Self: Sized + ZkpType,
{
fn constrain_le_bounded(lhs: ProgramNode<Self>, rhs: ProgramNode<Self>, bits: usize);
fn constrain_lt_bounded(lhs: ProgramNode<Self>, rhs: ProgramNode<Self>, bits: usize);
fn constrain_ge_bounded(lhs: ProgramNode<Self>, rhs: ProgramNode<Self>, bits: usize);
fn constrain_gt_bounded(lhs: ProgramNode<Self>, rhs: ProgramNode<Self>, bits: usize);
}
pub trait IntoProgramNode
where
Self: Sized,
{
type Output: ZkpType;
fn into_program_node(self) -> ProgramNode<Self::Output>;
}
pub trait NumFieldElements {
const NUM_NATIVE_FIELD_ELEMENTS: usize;
}
pub trait ZkpType: NumFieldElements + Sized + TypeName + ToNativeFields {}
impl<T: NumFieldElements + Sized + TypeName + ToNativeFields> ZkpType for T {}
pub trait Coerce
where
Self: ZkpType,
{
fn coerce(nodes: &[NodeIndex]) -> ProgramNode<Self>;
}
impl<T, const N: usize> NumFieldElements for [T; N]
where
T: ZkpType,
{
const NUM_NATIVE_FIELD_ELEMENTS: usize = T::NUM_NATIVE_FIELD_ELEMENTS * N;
}
impl<T> Coerce for T
where
T: ZkpType,
{
fn coerce(nodes: &[NodeIndex]) -> ProgramNode<Self> {
if nodes.len() != T::NUM_NATIVE_FIELD_ELEMENTS {
panic!(
"Could not coerce node slice into {}. Expected {} nodes, actual {}",
std::any::type_name::<T>(),
T::NUM_NATIVE_FIELD_ELEMENTS,
nodes.len()
);
}
ProgramNode::new(nodes)
}
}