|
@@ -11,6 +11,7 @@ use crate::env::{env_bind, Env};
|
|
|
use crate::types::MalErr::{ErrMalVal, ErrString};
|
|
use crate::types::MalErr::{ErrMalVal, ErrString};
|
|
|
use crate::types::MalVal::{Atom, Bool, Func, Hash, Int, List, MalFunc, Nil, Str, Sym, Vector};
|
|
use crate::types::MalVal::{Atom, Bool, Func, Hash, Int, List, MalFunc, Nil, Str, Sym, Vector};
|
|
|
use bellman::Variable;
|
|
use bellman::Variable;
|
|
|
|
|
+use bls12_381::Bls12;
|
|
|
use bls12_381::Scalar;
|
|
use bls12_381::Scalar;
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
#[derive(Debug, Clone)]
|
|
@@ -21,17 +22,49 @@ pub struct Allocation {
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
#[derive(Debug, Clone)]
|
|
|
pub struct EnforceAllocation {
|
|
pub struct EnforceAllocation {
|
|
|
|
|
+ pub idx: usize,
|
|
|
pub left: Vec<(String, String)>,
|
|
pub left: Vec<(String, String)>,
|
|
|
pub right: Vec<(String, String)>,
|
|
pub right: Vec<(String, String)>,
|
|
|
pub output: Vec<(String, String)>,
|
|
pub output: Vec<(String, String)>,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+pub struct VerifyKeyParams {
|
|
|
|
|
+ pub random_params: groth16::Parameters<Bls12>,
|
|
|
|
|
+ pub verifying_key: groth16::PreparedVerifyingKey<Bls12>,
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
#[derive(Debug, Clone)]
|
|
#[derive(Debug, Clone)]
|
|
|
pub struct LispCircuit {
|
|
pub struct LispCircuit {
|
|
|
- pub params: Option<FnvHashMap<String, MalVal>>,
|
|
|
|
|
- pub allocs: Option<FnvHashMap<String, MalVal>>,
|
|
|
|
|
- pub alloc_inputs: Option<FnvHashMap<String, MalVal>>,
|
|
|
|
|
- pub constraints: Option<Vec<EnforceAllocation>>,
|
|
|
|
|
|
|
+ pub params: FnvHashMap<String, MalVal>,
|
|
|
|
|
+ pub allocs: FnvHashMap<String, MalVal>,
|
|
|
|
|
+ pub alloc_inputs: FnvHashMap<String, MalVal>,
|
|
|
|
|
+// todo change this for a ordered data structure so enforce
|
|
|
|
|
+ pub constraints: Vec<EnforceAllocation>,
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+#[derive(Debug, Clone)]
|
|
|
|
|
+pub enum MalVal {
|
|
|
|
|
+ Nil,
|
|
|
|
|
+ Bool(bool),
|
|
|
|
|
+ Int(i64),
|
|
|
|
|
+ Str(String),
|
|
|
|
|
+ Sym(String),
|
|
|
|
|
+ List(Rc<Vec<MalVal>>, Rc<MalVal>),
|
|
|
|
|
+ Vector(Rc<Vec<MalVal>>, Rc<MalVal>),
|
|
|
|
|
+ Hash(Rc<FnvHashMap<String, MalVal>>, Rc<MalVal>),
|
|
|
|
|
+ Func(fn(MalArgs) -> MalRet, Rc<MalVal>),
|
|
|
|
|
+ MalFunc {
|
|
|
|
|
+ eval: fn(ast: MalVal, env: Env) -> MalRet,
|
|
|
|
|
+ ast: Rc<MalVal>,
|
|
|
|
|
+ env: Env,
|
|
|
|
|
+ params: Rc<MalVal>,
|
|
|
|
|
+ is_macro: bool,
|
|
|
|
|
+ meta: Rc<MalVal>,
|
|
|
|
|
+ },
|
|
|
|
|
+ Atom(Rc<RefCell<MalVal>>),
|
|
|
|
|
+ Zk(Rc<LispCircuit>), // TODO remote it
|
|
|
|
|
+ Enforce(Rc<Vec<EnforceAllocation>>),
|
|
|
|
|
+ ZKScalar(bls12_381::Scalar),
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
impl Circuit<bls12_381::Scalar> for LispCircuit {
|
|
impl Circuit<bls12_381::Scalar> for LispCircuit {
|
|
@@ -40,19 +73,19 @@ impl Circuit<bls12_381::Scalar> for LispCircuit {
|
|
|
cs: &mut CS,
|
|
cs: &mut CS,
|
|
|
) -> Result<(), SynthesisError> {
|
|
) -> Result<(), SynthesisError> {
|
|
|
let mut variables: FnvHashMap<String, Variable> = FnvHashMap::default();
|
|
let mut variables: FnvHashMap<String, Variable> = FnvHashMap::default();
|
|
|
- let mut params_const = self.params.unwrap_or(FnvHashMap::default());
|
|
|
|
|
|
|
+ let mut params_const = self.params;
|
|
|
|
|
|
|
|
println!("Allocations\n");
|
|
println!("Allocations\n");
|
|
|
- for (k, v) in &self.allocs.unwrap_or(FnvHashMap::default()) {
|
|
|
|
|
|
|
+ for (k, v) in &self.allocs {
|
|
|
println!("k {:?} v {:?}", k, v);
|
|
println!("k {:?} v {:?}", k, v);
|
|
|
match v {
|
|
match v {
|
|
|
MalVal::ZKScalar(val) => {
|
|
MalVal::ZKScalar(val) => {
|
|
|
- let var = cs.alloc(|| "alloc", || Ok(*val))?;
|
|
|
|
|
|
|
+ let var = cs.alloc(|| k, || Ok(*val))?;
|
|
|
variables.insert(k.to_string(), var);
|
|
variables.insert(k.to_string(), var);
|
|
|
}
|
|
}
|
|
|
MalVal::Str(val) => {
|
|
MalVal::Str(val) => {
|
|
|
let val_scalar = bls12_381::Scalar::from_string(&*val);
|
|
let val_scalar = bls12_381::Scalar::from_string(&*val);
|
|
|
- let var = cs.alloc(|| "alloc", || Ok(val_scalar))?;
|
|
|
|
|
|
|
+ let var = cs.alloc(|| k, || Ok(val_scalar))?;
|
|
|
variables.insert(k.to_string(), var);
|
|
variables.insert(k.to_string(), var);
|
|
|
}
|
|
}
|
|
|
_ => {
|
|
_ => {
|
|
@@ -62,16 +95,16 @@ impl Circuit<bls12_381::Scalar> for LispCircuit {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
println!("Allocations Input\n");
|
|
println!("Allocations Input\n");
|
|
|
- for (k, v) in &self.alloc_inputs.unwrap_or(FnvHashMap::default()) {
|
|
|
|
|
|
|
+ for (k, v) in &self.alloc_inputs {
|
|
|
println!("k {:?} v {:?}", k, v);
|
|
println!("k {:?} v {:?}", k, v);
|
|
|
match v {
|
|
match v {
|
|
|
MalVal::ZKScalar(val) => {
|
|
MalVal::ZKScalar(val) => {
|
|
|
- let var = cs.alloc_input(|| "alloc", || Ok(*val))?;
|
|
|
|
|
|
|
+ let var = cs.alloc_input(|| k, || Ok(*val))?;
|
|
|
variables.insert(k.to_string(), var);
|
|
variables.insert(k.to_string(), var);
|
|
|
}
|
|
}
|
|
|
MalVal::Str(val) => {
|
|
MalVal::Str(val) => {
|
|
|
let val_scalar = bls12_381::Scalar::from_string(&*val);
|
|
let val_scalar = bls12_381::Scalar::from_string(&*val);
|
|
|
- let var = cs.alloc_input(|| "alloc", || Ok(val_scalar))?;
|
|
|
|
|
|
|
+ let var = cs.alloc_input(|| k, || Ok(val_scalar))?;
|
|
|
variables.insert(k.to_string(), var);
|
|
variables.insert(k.to_string(), var);
|
|
|
}
|
|
}
|
|
|
_ => {
|
|
_ => {
|
|
@@ -81,15 +114,16 @@ impl Circuit<bls12_381::Scalar> for LispCircuit {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
println!("Enforce Allocations\n");
|
|
println!("Enforce Allocations\n");
|
|
|
- // we need to keep order
|
|
|
|
|
- for alloc_value in self.constraints.unwrap_or(Vec::<EnforceAllocation>::new()).iter() {
|
|
|
|
|
|
|
+ let mut enforce_sorted = self.constraints.clone();
|
|
|
|
|
+ enforce_sorted.sort_by(|a, b| a.idx.cmp(&b.idx));
|
|
|
|
|
+ for alloc_value in enforce_sorted.iter() {
|
|
|
|
|
+ println!("Enforce -> {:?}", alloc_value);
|
|
|
let coeff = bls12_381::Scalar::one();
|
|
let coeff = bls12_381::Scalar::one();
|
|
|
let mut left = bellman::LinearCombination::<Scalar>::zero();
|
|
let mut left = bellman::LinearCombination::<Scalar>::zero();
|
|
|
let mut right = bellman::LinearCombination::<Scalar>::zero();
|
|
let mut right = bellman::LinearCombination::<Scalar>::zero();
|
|
|
let mut output = bellman::LinearCombination::<Scalar>::zero();
|
|
let mut output = bellman::LinearCombination::<Scalar>::zero();
|
|
|
for values in alloc_value.left.iter() {
|
|
for values in alloc_value.left.iter() {
|
|
|
let (a, b) = values;
|
|
let (a, b) = values;
|
|
|
- println!("a {:?} b {:?}", a, b);
|
|
|
|
|
let mut val_b = CS::one();
|
|
let mut val_b = CS::one();
|
|
|
if b != "cs::one" {
|
|
if b != "cs::one" {
|
|
|
val_b = *variables.get(b).unwrap();
|
|
val_b = *variables.get(b).unwrap();
|
|
@@ -103,8 +137,9 @@ impl Circuit<bls12_381::Scalar> for LispCircuit {
|
|
|
if let MalVal::ZKScalar(val) = value {
|
|
if let MalVal::ZKScalar(val) = value {
|
|
|
left = left + (*val, val_b);
|
|
left = left + (*val, val_b);
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ println!("left: a {:?} b {:?} val_b: {:?}", a, b, val_b);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
for values in alloc_value.right.iter() {
|
|
for values in alloc_value.right.iter() {
|
|
@@ -118,6 +153,7 @@ impl Circuit<bls12_381::Scalar> for LispCircuit {
|
|
|
} else if a == "scalar::one::neg" {
|
|
} else if a == "scalar::one::neg" {
|
|
|
right = right + (coeff.neg(), val_b);
|
|
right = right + (coeff.neg(), val_b);
|
|
|
}
|
|
}
|
|
|
|
|
+ println!("right: a {:?} b {:?} val_b: {:?}", a, b, val_b);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
for values in alloc_value.output.iter() {
|
|
for values in alloc_value.output.iter() {
|
|
@@ -131,52 +167,34 @@ impl Circuit<bls12_381::Scalar> for LispCircuit {
|
|
|
} else if a == "scalar::one::neg" {
|
|
} else if a == "scalar::one::neg" {
|
|
|
output = output + (coeff.neg(), val_b);
|
|
output = output + (coeff.neg(), val_b);
|
|
|
}
|
|
}
|
|
|
|
|
+ println!("output: a {:?} b {:?} val_b: {:?}", a, b, val_b);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ println!("Enforcing ...");
|
|
|
cs.enforce(
|
|
cs.enforce(
|
|
|
|| "constraint",
|
|
|| "constraint",
|
|
|
|_| left.clone(),
|
|
|_| left.clone(),
|
|
|
|_| right.clone(),
|
|
|_| right.clone(),
|
|
|
|_| output.clone(),
|
|
|_| output.clone(),
|
|
|
);
|
|
);
|
|
|
-
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
Ok(())
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[derive(Debug, Clone)]
|
|
|
|
|
-pub enum MalVal {
|
|
|
|
|
- Nil,
|
|
|
|
|
- Bool(bool),
|
|
|
|
|
- Int(i64),
|
|
|
|
|
- Str(String),
|
|
|
|
|
- Sym(String),
|
|
|
|
|
- List(Rc<Vec<MalVal>>, Rc<MalVal>),
|
|
|
|
|
- Vector(Rc<Vec<MalVal>>, Rc<MalVal>),
|
|
|
|
|
- Hash(Rc<FnvHashMap<String, MalVal>>, Rc<MalVal>),
|
|
|
|
|
- Func(fn(MalArgs) -> MalRet, Rc<MalVal>),
|
|
|
|
|
- MalFunc {
|
|
|
|
|
- eval: fn(ast: MalVal, env: Env) -> MalRet,
|
|
|
|
|
- ast: Rc<MalVal>,
|
|
|
|
|
- env: Env,
|
|
|
|
|
- params: Rc<MalVal>,
|
|
|
|
|
- is_macro: bool,
|
|
|
|
|
- meta: Rc<MalVal>,
|
|
|
|
|
- },
|
|
|
|
|
- Atom(Rc<RefCell<MalVal>>),
|
|
|
|
|
- Zk(Rc<LispCircuit>), // TODO remote it
|
|
|
|
|
- Enforce(Rc<Vec<EnforceAllocation>>),
|
|
|
|
|
- ZKScalar(bls12_381::Scalar),
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
#[derive(Debug)]
|
|
#[derive(Debug)]
|
|
|
pub enum MalErr {
|
|
pub enum MalErr {
|
|
|
ErrString(String),
|
|
ErrString(String),
|
|
|
ErrMalVal(MalVal),
|
|
ErrMalVal(MalVal),
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+impl From<SynthesisError> for MalErr {
|
|
|
|
|
+ fn from(err: SynthesisError) -> MalErr {
|
|
|
|
|
+ ErrString(err.to_string())
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
pub type MalArgs = Vec<MalVal>;
|
|
pub type MalArgs = Vec<MalVal>;
|
|
|
pub type MalRet = Result<MalVal, MalErr>;
|
|
pub type MalRet = Result<MalVal, MalErr>;
|
|
|
|
|
|