use super::{LinearCombination, R1CSError, Variable};
use curve25519_dalek::scalar::Scalar;
use merlin::Transcript;
pub trait ConstraintSystem {
fn transcript(&mut self) -> &mut Transcript;
fn multiply(
&mut self,
left: LinearCombination,
right: LinearCombination,
) -> (Variable, Variable, Variable);
fn allocate(&mut self, assignment: Option<Scalar>) -> Result<Variable, R1CSError>;
fn allocate_multiplier(
&mut self,
input_assignments: Option<(Scalar, Scalar)>,
) -> Result<(Variable, Variable, Variable), R1CSError>;
fn metrics(&self) -> crate::r1cs::Metrics;
fn constrain(&mut self, lc: LinearCombination);
}
pub trait RandomizableConstraintSystem: ConstraintSystem {
type RandomizedCS: RandomizedConstraintSystem;
fn specify_randomized_constraints<F>(&mut self, callback: F) -> Result<(), R1CSError>
where
F: 'static + FnOnce(&mut Self::RandomizedCS) -> Result<(), R1CSError>;
}
pub trait RandomizedConstraintSystem: ConstraintSystem {
fn challenge_scalar(&mut self, label: &'static [u8]) -> Scalar;
}