Преглед изворни кода

added sub, add scalar for vector and func

ada пре 5 година
родитељ
комит
98649a6da3
2 измењених фајлова са 34 додато и 3 уклоњено
  1. 30 2
      lisp/core.rs
  2. 4 1
      lisp/jubjub-add.lisp

+ 30 - 2
lisp/core.rs

@@ -254,6 +254,22 @@ fn conj(a: MalArgs) -> MalRet {
 
 fn sub_scalar(a: MalArgs) -> MalRet {
     match (a[0].clone(), a[1].clone()) {
+        (Func(_, _), ZKScalar(a1)) => {
+            if let Vector(ref values, _) = a[0].apply(vec![]).unwrap() {
+                if let ZKScalar(mut a0) = values[0] {
+                    a0.sub_assign(a1);
+                    Ok(ZKScalar(a0))
+                } else {
+                    error("scalar sub expect (zkscalar, zkscalar) found (func, zkscalar)")
+                }
+            } else {
+                error("scalar sub expect (zkscalar, zkscalar)")
+            }
+        }
+        (ZKScalar(mut a0), ZKScalar(a1)) => {
+            a0.sub_assign(a1);
+            Ok(ZKScalar(a0))
+        }
         (Str(a0), Str(a1)) => {
             let (mut s0, s1) = (
                 bls12_381::Scalar::from_string(&a0),
@@ -262,7 +278,7 @@ fn sub_scalar(a: MalArgs) -> MalRet {
             s0.sub_assign(s1);
             Ok(Str(std::string::ToString::to_string(&s0)[2..].to_string()))
         }
-        _ => error("scalar sub expected (scalar, scalar)"),
+        _ => error("scalar sub expected (zkscalar, zkscalar)"),
     }
 }
 
@@ -384,6 +400,18 @@ fn scalar_from(a: MalArgs) -> MalRet {
 
 fn add_scalar(a: MalArgs) -> MalRet {
     match (a[0].clone(), a[1].clone()) {
+        (Func(_, _), ZKScalar(a1)) => {
+            if let Vector(ref values, _) = a[0].apply(vec![]).unwrap() {
+                if let ZKScalar(mut a0) = values[0] {
+                    a0.add_assign(a1);
+                    Ok(ZKScalar(a0))
+                } else {
+                    error("scalar add expect (zkscalar, zkscalar) found (func, zkscalar)")
+                }
+            } else {
+                error("scalar add expect (zkscalar, zkscalar)")
+            }
+        }
         (ZKScalar(a0), ZKScalar(a1)) => {
             let (mut z0, z1) = (a0.clone(), a1.clone());
             z0.add_assign(z1);
@@ -397,7 +425,7 @@ fn add_scalar(a: MalArgs) -> MalRet {
             s0.add_assign(s1);
             Ok(ZKScalar(s0))
         }
-        _ => error(&format!("add scalar expected (scalar, scalar)\n {:?}", a).to_string()),
+        _ => error(&format!("scalar add expect (zkscalar, zkscalar) found \n {:?}", a).to_string()),
     }
 }
 

+ 4 - 1
lisp/jubjub-add.lisp

@@ -11,7 +11,10 @@
       A (alloc "A" (* v2 u1))
       B (alloc "B" (* u2 v1))
       C (alloc "C" (* EDWARDS_D (* A B)))
-      u3 (alloc "u3" (/ (* A A) (* scalar::one C)))
+      ;; Compute u3 = (A + B) / (1 + C)
+      u3 (alloc "u3" (/ (+ A B) (+ scalar::one C)))
+      ;; Compute v3 = (U - A - B) / (1 - C)
+      v3 (alloc "v3" (/ (- (- U A) B) (- scalar::one C)))
       ]
 (prove
  (setup