ada 5 лет назад
Родитель
Сommit
a15f6970ac
3 измененных файлов с 85 добавлено и 102 удалено
  1. 2 1
      lisp/core.rs
  2. 62 86
      lisp/lisp.rs
  3. 21 15
      lisp/new.lisp

+ 2 - 1
lisp/core.rs

@@ -181,7 +181,7 @@ fn unpack_bits(a: MalArgs) -> MalRet {
             }
             }
             Ok(list!(result
             Ok(list!(result
                 .iter()
                 .iter()
-                .map(|a| Str(std::string::ToString::to_string(&a)))
+                .map(|a| Str(std::string::ToString::to_string(&a)[2..].to_string()))
                 .collect::<Vec<MalVal>>()))
                 .collect::<Vec<MalVal>>()))
         }
         }
         _ => error("invalid args to unpack-bits"),
         _ => error("invalid args to unpack-bits"),
@@ -364,5 +364,6 @@ pub fn ns() -> Vec<(&'static str, MalVal)> {
         ("add", func(add)),
         ("add", func(add)),
         ("sub", func(sub)),
         ("sub", func(sub)),
         ("lc0", func(|a| Ok(MalVal::Lc0))),
         ("lc0", func(|a| Ok(MalVal::Lc0))),
+        ("lc1", func(|a| Ok(MalVal::Lc1))),
     ]
     ]
 }
 }

+ 62 - 86
lisp/lisp.rs

@@ -11,8 +11,7 @@ use std::time::Instant;
 use fnv::FnvHashMap;
 use fnv::FnvHashMap;
 use itertools::Itertools;
 use itertools::Itertools;
 use sapvi::vm::{
 use sapvi::vm::{
-    AllocType, ConstraintInstruction, CryptoOperation, VariableIndex, VariableRef, 
-    ZKVirtualMachine,
+    AllocType, ConstraintInstruction, CryptoOperation, VariableIndex, VariableRef, ZKVirtualMachine,
 };
 };
 
 
 #[macro_use]
 #[macro_use]
@@ -275,96 +274,22 @@ fn eval(mut ast: MalVal, mut env: Env) -> MalRet {
                     }
                     }
                     Sym(ref a0sym) if a0sym == "zkcons!" => {
                     Sym(ref a0sym) if a0sym == "zkcons!" => {
                         let (a1, a2) = (l[1].clone(), l[2].clone());
                         let (a1, a2) = (l[1].clone(), l[2].clone());
-                        match env_get(&env, &a1).ok().unwrap() {
-                            Zk(mut zk) => match eval_ast(&a2, &env)? {
-                                List(ref el, _) => {
-                                    let args = el.to_vec();
-                                    for b in args.iter() {
-                                        match b {
-                                            Sym(_) => {}
-                                            Add(b1, b2) => {
-                                                println!("Add {:?} {:?}", b1, b2);
-                                                // TODO extract a method
-                                                zk.private.push(Scalar::from_string(
-                                                    &b2.pr_str(false).to_string(),
-                                                ));
-                                                let const_a: ConstraintInstruction = match b1.as_ref() {
-                                                    Lc0 => 
-                                                        ConstraintInstruction::Lc0Add(
-                                                            zk.private.len(),
-                                                        
-                                                    ),
-                                                    Lc1 => 
-                                                        ConstraintInstruction::Lc1Add(
-                                                            zk.private.len(),
-                                                    ),
-                                                    Lc2 => 
-                                                        ConstraintInstruction::Lc2Add(
-                                                            zk.private.len(),
-                                                    ),
-                                                    _ => ConstraintInstruction::Lc0Add(0) 
-                                                };
-                                                zk.constraints.push(const_a);
-                                                env_set(
-                                                    &env,
-                                                    a1.clone(),
-                                                    types::MalVal::Zk(zk.clone()),
-                                                );
-                                            }
-                                            Sub(b1, b2) => {
-                                                println!("Sub {:?} {:?}", b1, b2);
-                                                zk.private.push(Scalar::from_string(
-                                                    &b2.pr_str(false).to_string(),
-                                                ));
-                                                let const_a: ConstraintInstruction = match b1.as_ref() {
-                                                    Lc0 => 
-                                                        ConstraintInstruction::Lc0Sub(
-                                                            zk.private.len(),
-                                                        
-                                                    ),
-                                                    Lc1 => 
-                                                        ConstraintInstruction::Lc1Add(
-                                                            zk.private.len(),
-                                                    ),
-                                                    Lc2 => 
-                                                        ConstraintInstruction::Lc2Add(
-                                                            zk.private.len(),
-                                                    ),
-                                                    _ => ConstraintInstruction::Lc0Add(0) 
-                                                };
-                                                zk.constraints.push(const_a);
-                                                env_set(
-                                                    &env,
-                                                    a1.clone(),
-                                                    types::MalVal::Zk(zk.clone()),
-                                                );
-                                            }
-                                            _ => {
-                                                println!("not mapped");
-                                            }
-                                        }
-                                    }
-                                }
-                                _ => {
-                                    error("not mapped");
-                                }
-                            },
-                            _ => {
-                                error("zk circuit not found on env");
+                        let value = eval(a2.clone(), env.clone())?;
+                        println!("{:?}", value);
+                        match value {
+                            List(ref el, _) => {
+                                zkcons_eval(el.to_vec(), &a1, &env);
                             }
                             }
+                            _ => println!("invalid format"),
                         }
                         }
                         Ok(Nil)
                         Ok(Nil)
                     }
                     }
                     Sym(ref a0sym) if a0sym == "defzk!" => {
                     Sym(ref a0sym) if a0sym == "defzk!" => {
                         let (a1, a2) = (l[1].clone(), l[2].clone());
                         let (a1, a2) = (l[1].clone(), l[2].clone());
-                        let zk_circuit = MalVal::Zk(ZKCircuit {
-                            name: a1.pr_str(true),
-                            constraints: Vec::new(),
-                            private: Vec::new(),
-                            public: Vec::new(),
-                        });
-                        env_set(&env, l[1].clone(), zk_circuit.clone());
-                        Ok(zk_circuit)
+                        let circuit = zk_circuit_create(&a1, &env);
+                        let val = types::MalVal::Zk(circuit.clone());
+                        env_set(&env, a1.clone(), val.clone());
+                        Ok(val.clone())
                     }
                     }
                     Sym(ref a0sym) if a0sym == "fn*" => {
                     Sym(ref a0sym) if a0sym == "fn*" => {
                         let (a1, a2) = (l[1].clone(), l[2].clone());
                         let (a1, a2) = (l[1].clone(), l[2].clone());
@@ -421,6 +346,57 @@ fn eval(mut ast: MalVal, mut env: Env) -> MalRet {
     ret
     ret
 }
 }
 
 
+fn zk_circuit_create(a1: &MalVal, env: &Env) -> ZKCircuit {
+    let zk_circuit = ZKCircuit {
+        name: a1.pr_str(true),
+        constraints: Vec::new(),
+        private: Vec::new(),
+        public: Vec::new(),
+    };
+    zk_circuit
+}
+
+fn zkcons_eval(elements: Vec<MalVal>, a1: &MalVal, env: &Env) -> MalRet {
+    let mut zk = match env_get(&env, &a1).ok().unwrap() {
+        Zk(v) => v,
+        n => zk_circuit_create(a1, env),
+    };
+    println!("{:?}", zk);
+    for b in elements.iter() {
+        match b {
+            Sym(_) => {}
+            Add(b1, b2) => {
+                zk.private
+                    .push(Scalar::from_string(&b2.pr_str(false).to_string()));
+                let const_a: ConstraintInstruction = match b1.as_ref() {
+                    Lc0 => ConstraintInstruction::Lc0Add(zk.private.len()),
+                    Lc1 => ConstraintInstruction::Lc1Add(zk.private.len()),
+                    Lc2 => ConstraintInstruction::Lc2Add(zk.private.len()),
+                    _ => ConstraintInstruction::Lc0Add(0),
+                };
+                zk.constraints.push(const_a);
+                env_set(&env, a1.clone(), types::MalVal::Zk(zk.clone()));
+                println!("{:?}", a1.clone());
+                println!("{:?}", zk.clone());
+            }
+            Sub(b1, b2) => {
+                zk.private
+                    .push(Scalar::from_string(&b2.pr_str(false).to_string()));
+                let const_a: ConstraintInstruction = match b1.as_ref() {
+                    Lc0 => ConstraintInstruction::Lc0Sub(zk.private.len()),
+                    Lc1 => ConstraintInstruction::Lc1Add(zk.private.len()),
+                    Lc2 => ConstraintInstruction::Lc2Add(zk.private.len()),
+                    _ => ConstraintInstruction::Lc0Add(0),
+                };
+                zk.constraints.push(const_a);
+                env_set(&env, a1.clone(), types::MalVal::Zk(zk.clone()));
+            }
+            v => println!("not match"),
+        }
+    }
+    Ok(Nil)
+}
+
 // print
 // print
 fn print(ast: &MalVal) -> String {
 fn print(ast: &MalVal) -> String {
     ast.pr_str(true)
     ast.pr_str(true)

+ 21 - 15
lisp/new.lisp

@@ -1,27 +1,33 @@
 (def! x "73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000")
 (def! x "73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000")
 (def! one "0000000000000000000000000000000000000000000000000000000000000001")
 (def! one "0000000000000000000000000000000000000000000000000000000000000001")
 (defzk! circuit ())
 (defzk! circuit ())
-(def! bits (unpack-bits x))
+;;(def! bits (unpack-bits x))
+(def! bits [one x one])
 ;;zkcons add a constraints instruction to the circuit
 ;;zkcons add a constraints instruction to the circuit
-    (zkcons! circuit (
-                    (add lc0 one) 
-                    (sub lc0 x)
-                    )
-              )
-;;    (map (fn* [b] (zkcons! circuit (
+;;    (zkcons! circuit (
 ;;                    (add lc0 one) 
 ;;                    (add lc0 one) 
-;;                    '(sub lc0 b)
-;;                    '(add lc1 x)
+;;                    (sub lc0 x)
+;;                    )
+;;              )
+    (zkcons! circuit (map (fn* [b] (
+                    (add lc0 one) 
+                    (sub lc0 b)
+                    (add lc1 x)
+;;                    'enforce)
+              )) bits))
+    (def! enforce-loop-const (map (fn* [b] (
+                    (add lc0 one) 
+                    (sub lc0 b)
+                    (add lc1 x)
 ;;                    'enforce)
 ;;                    'enforce)
-;;              )) bits)
-;;   (map (fn* [b] (zkcons! circuit (
-;;                    '(add lc0 b) 
-;;                    'double-coeff-lc)
-;;             )) bits)
+              )) bits))
+    (zkcons! circuit enforce-loop-const)
 ;;   (zkcons! circuit (
 ;;   (zkcons! circuit (
 ;;                    'reset-coeff-lc
 ;;                    'reset-coeff-lc
 ;;                    '(sub lc0 x)
 ;;                    '(sub lc0 x)
 ;;                    '(add lc1 one)
 ;;                    '(add lc1 one)
 ;;                    'enforce)
 ;;                    'enforce)
 ;;            )
 ;;            )
-(println circuit)
+;;(println circuit)
+;;(println enforce-loop-const)
+