Przeglądaj źródła

jj conditional select working

narodnik 5 lat temu
rodzic
commit
7f11f30021
5 zmienionych plików z 92 dodań i 26 usunięć
  1. 70 19
      proofs/mint2.psm
  2. 1 1
      scripts/pism.vim
  3. 3 0
      scripts/vm.py
  4. 6 6
      src/mint2.rs
  5. 12 0
      src/vm.rs

+ 70 - 19
proofs/mint2.psm

@@ -1,5 +1,6 @@
 constant edwards_d 0x2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1
 constant edwards_d 0x2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1
 constant one 0x0000000000000000000000000000000000000000000000000000000000000001
 constant one 0x0000000000000000000000000000000000000000000000000000000000000001
+constant zero 0x0000000000000000000000000000000000000000000000000000000000000000
 constant G_VCR_u 0x6800f4fa0f001cfc7ff6826ad58004b4d1d8da41af03744e3bce3b7793664337
 constant G_VCR_u 0x6800f4fa0f001cfc7ff6826ad58004b4d1d8da41af03744e3bce3b7793664337
 constant G_VCR_v 0x6d81d3a9cb45dedbe6fb2a6e1e22ab50ad46f1b0473b803b3caefab9380b6a8b
 constant G_VCR_v 0x6d81d3a9cb45dedbe6fb2a6e1e22ab50ad46f1b0473b803b3caefab9380b6a8b
 constant G_VCV_u 0x273f910d9ecc1615d8618ed1d15fef4e9472c89ac043042d36183b2cb4d7ef51
 constant G_VCV_u 0x273f910d9ecc1615d8618ed1d15fef4e9472c89ac043042d36183b2cb4d7ef51
@@ -146,7 +147,11 @@ constant G_VCV_v 0x466a7e3a82f67ab1d32294fd89774ad6bc3332d0fa1ccd18a77a81f50667c
     enforce
     enforce
 {% endmacro %}
 {% endmacro %}
 
 
-{% macro jubjub_add(P, x1, y1, x2, y2) -%}
+{% macro jubjub_add(P, x1, y1, x2, y2) %}
+    ########################################################
+    # jubjub_add({{p}}, {{x1}}, {{y1}}, {{x2}}, {{y2}})
+    ########################################################
+
     # Compute U = (x1 + y1) * (y2 - EDWARDS_A*x2)
     # Compute U = (x1 + y1) * (y2 - EDWARDS_A*x2)
     #           = (x1 + y1) * (x2 + y2)
     #           = (x1 + y1) * (x2 + y2)
     private {{P}}_U
     private {{P}}_U
@@ -175,12 +180,12 @@ constant G_VCV_v 0x466a7e3a82f67ab1d32294fd89774ad6bc3332d0fa1ccd18a77a81f50667c
     mul {{P}}_B {{ y1 }}
     mul {{P}}_B {{ y1 }}
     # Compute C = d*A*B
     # Compute C = d*A*B
     private {{P}}_C
     private {{P}}_C
-    load {{P}}_C d
+    load {{P}}_C edwards_d
     mul {{P}}_C {{P}}_A
     mul {{P}}_C {{P}}_A
     mul {{P}}_C {{P}}_B
     mul {{P}}_C {{P}}_B
 
 
     # assert (d * A) * (B) == C
     # assert (d * A) * (B) == C
-    lc0_add_coeff d {{P}}_A
+    lc0_add_coeff edwards_d {{P}}_A
     lc1_add {{P}}_B
     lc1_add {{P}}_B
     lc2_add {{P}}_C
     lc2_add {{P}}_C
     enforce
     enforce
@@ -218,7 +223,49 @@ constant G_VCV_v 0x466a7e3a82f67ab1d32294fd89774ad6bc3332d0fa1ccd18a77a81f50667c
     lc2_sub {{P}}_A
     lc2_sub {{P}}_A
     lc2_sub {{P}}_B
     lc2_sub {{P}}_B
     enforce
     enforce
-{%- endmacro %}
+{% endmacro %}
+
+{% macro jubjub_conditionally_select(p, u, v, condition) %}
+    ########################################################
+    # jubjub_conditionally_select({{p}}, {{u}}, {{v}}, {{condition}})
+    ########################################################
+
+    # Compute u' = self.u if condition, and 0 otherwise
+    private {{p}}_u
+    set {{p}}_u {{u}}
+    mul {{p}}_u condition
+
+    # condition * u = u'
+    # if condition is 0, u' must be 0
+    # if condition is 1, u' must be u
+    lc0_add {{u}}
+    lc1_add {{condition}}
+    lc2_add {{p}}_u
+    enforce
+
+    # Compute v' = self.v if condition, and 1 otherwise
+    # v' = condition * v + 1 - condition
+    private {{p}}_v
+    set {{p}}_v {{v}}
+    mul {{p}}_v {{condition}}
+    local {{p}}_one
+    load {{p}}_one one
+    add {{p}}_v {{p}}_one
+    sub {{p}}_v {{condition}}
+
+    # condition * v = v' - (1 - condition)
+    # if condition is 0, v' must be 1
+    # if condition is 1, v' must be v
+    lc0_add {{v}}
+    lc1_add {{condition}}
+    lc2_add {{p}}_v
+    lc2_sub_one
+    lc2_add {{condition}}
+    enforce
+{% endmacro %}
+
+{% macro jubjub_mul(p, u, v, x, n) %}
+{% endmacro %}
 
 
 contract mint_contract
 contract mint_contract
     param public_u
     param public_u
@@ -234,22 +281,26 @@ contract mint_contract
     {% endfor %}
     {% endfor %}
 
 
     #############
     #############
-    {#
-        {{ jubjub_double("pub_dbl", "public_u", "public_v") }}
+    #{
+        {{ jubjub_double("pub_dbl_pre", "public_u", "public_v") }}
+
+        private condition
+        load condition one
+        {{ jubjub_conditionally_select("pub_dbl", "pub_dbl_pre_u", "pub_dbl_pre_v", "condition") }}
 
 
         # Use this code for testing point doubling
         # Use this code for testing point doubling
-        #public dbl_u
-        #set dbl_u pub_dbl_u
-        #lc0_add dbl_u
-        #lc1_add_one
-        #lc2_add pub_dbl_u
-        #enforce
-        #public dbl_v
-        #set dbl_v pub_dbl_v
-        #lc0_add dbl_v
-        #lc1_add_one
-        #lc2_add pub_dbl_v
-        #enforce
-    #}
+        public dbl_u
+        set dbl_u pub_dbl_u
+        lc0_add dbl_u
+        lc1_add_one
+        lc2_add pub_dbl_u
+        enforce
+        public dbl_v
+        set dbl_v pub_dbl_v
+        lc0_add dbl_v
+        lc1_add_one
+        lc2_add pub_dbl_v
+        enforce
+    #
 end
 end
 
 

+ 1 - 1
scripts/pism.vim

@@ -15,7 +15,7 @@ endif
 syn keyword sapviKeyword constant contract start end constraint
 syn keyword sapviKeyword constant contract start end constraint
 "syn keyword sapviAttr
 "syn keyword sapviAttr
 syn keyword sapviType FixedGenerator BlakePersonalization PedersenPersonalization ByteSize U64 Fr Point Bool Scalar BinarySize
 syn keyword sapviType FixedGenerator BlakePersonalization PedersenPersonalization ByteSize U64 Fr Point Bool Scalar BinarySize
-syn keyword sapviFunctionKeyword enforce lc0_add_one lc1_add_one lc2_add_one lc_coeff_reset lc_coeff_double
+syn keyword sapviFunctionKeyword enforce lc0_add_one lc1_add_one lc2_add_one lc_coeff_reset lc_coeff_double lc0_sub_one lc1_sub_one lc2_sub_one
 syn match sapviFunction "^[ ]*[a-z_0-9]* "
 syn match sapviFunction "^[ ]*[a-z_0-9]* "
 syn match sapviComment "#.*$"
 syn match sapviComment "#.*$"
 syn match sapviNumber ' \zs\d\+\ze'
 syn match sapviNumber ' \zs\d\+\ze'

+ 3 - 0
scripts/vm.py

@@ -32,6 +32,9 @@ constraint_commands = {
     "lc0_add_one": 0,
     "lc0_add_one": 0,
     "lc1_add_one": 0,
     "lc1_add_one": 0,
     "lc2_add_one": 0,
     "lc2_add_one": 0,
+    "lc0_sub_one": 0,
+    "lc1_sub_one": 0,
+    "lc2_sub_one": 0,
     "lc0_add_coeff": 2,
     "lc0_add_coeff": 2,
     "lc1_add_coeff": 2,
     "lc1_add_coeff": 2,
     "lc2_add_coeff": 2,
     "lc2_add_coeff": 2,

+ 6 - 6
src/mint2.rs

@@ -73,17 +73,17 @@ fn main() -> std::result::Result<(), vm::ZKVMError> {
 
 
     let public = vm.public();
     let public = vm.public();
 
 
-    assert_eq!(public.len(), 0);
+    assert_eq!(public.len(), 2);
 
 
     // Use this code for testing point doubling
     // Use this code for testing point doubling
-    //let dbl = public_point.double().to_affine();
+    let dbl = public_point.double().to_affine();
+    println!("{:?}", dbl.get_u());
+    println!("{:?}", public[0]);
+    println!("{:?}", dbl.get_v());
+    println!("{:?}", public[1]);
     //assert_eq!(public.len(), 2);
     //assert_eq!(public.len(), 2);
     //assert_eq!(public[0], dbl.get_u());
     //assert_eq!(public[0], dbl.get_u());
     //assert_eq!(public[1], dbl.get_v());
     //assert_eq!(public[1], dbl.get_v());
-    //println!("{:?}", dbl.get_u());
-    //println!("{:?}", public[0]);
-    //println!("{:?}", dbl.get_v());
-    //println!("{:?}", public[1]);
 
 
     assert!(vm.verify(&proof, &public));
     assert!(vm.verify(&proof, &public));
     Ok(())
     Ok(())

+ 12 - 0
src/vm.rs

@@ -61,6 +61,9 @@ pub enum ConstraintInstruction {
     Lc0AddOne,
     Lc0AddOne,
     Lc1AddOne,
     Lc1AddOne,
     Lc2AddOne,
     Lc2AddOne,
+    Lc0SubOne,
+    Lc1SubOne,
+    Lc2SubOne,
     Lc0AddCoeff(VariableIndex, VariableIndex),
     Lc0AddCoeff(VariableIndex, VariableIndex),
     Lc1AddCoeff(VariableIndex, VariableIndex),
     Lc1AddCoeff(VariableIndex, VariableIndex),
     Lc2AddCoeff(VariableIndex, VariableIndex),
     Lc2AddCoeff(VariableIndex, VariableIndex),
@@ -360,6 +363,15 @@ impl Circuit<bls12_381::Scalar> for ZKVMCircuit {
                 ConstraintInstruction::Lc2AddOne => {
                 ConstraintInstruction::Lc2AddOne => {
                     lc2 = lc2 + CS::one();
                     lc2 = lc2 + CS::one();
                 }
                 }
+                ConstraintInstruction::Lc0SubOne => {
+                    lc0 = lc0 - CS::one();
+                }
+                ConstraintInstruction::Lc1SubOne => {
+                    lc1 = lc1 - CS::one();
+                }
+                ConstraintInstruction::Lc2SubOne => {
+                    lc2 = lc2 - CS::one();
+                }
                 ConstraintInstruction::Lc0AddCoeff(const_index, index) => {
                 ConstraintInstruction::Lc0AddCoeff(const_index, index) => {
                     lc0 = lc0 + (self.constants[const_index], variables[index]);
                     lc0 = lc0 + (self.constants[const_index], variables[index]);
                 }
                 }