narodnik 5 лет назад
Родитель
Сommit
dd0ae8616e
6 измененных файлов с 119 добавлено и 31 удалено
  1. 52 20
      proofs/mint2.psm
  2. 1 1
      scripts/pism.vim
  3. 3 0
      scripts/vm.py
  4. 19 2
      scripts/vm_export_rust.py
  5. 14 7
      src/mint2.rs
  6. 30 1
      src/vm.rs

+ 52 - 20
proofs/mint2.psm

@@ -271,27 +271,45 @@ constant G_VCV_v 0x466a7e3a82f67ab1d32294fd89774ad6bc3332d0fa1ccd18a77a81f50667c
     # Performs a scalar multiplication of this twisted Edwards
     # Performs a scalar multiplication of this twisted Edwards
     # point by a scalar represented as a sequence of booleans
     # point by a scalar represented as a sequence of booleans
     # in little-endian bit order.
     # in little-endian bit order.
-    private {{p}}_currbase_0_u
-    set {{p}}_currbase_0_u {{u}}
-    private {{p}}_currbase_0_v
-    set {{p}}_currbase_0_v {{v}}
 
 
     {% for i in range(n) %}
     {% for i in range(n) %}
-        {{ jubjub_conditionally_select(
-            p + "_this_base_" + i|string,
-            p + "_currbase_" + i|string + "_u",
-            p + "_currbase_" + i|string + "_v",
-            x + "_" + i|string
-        ) }}
+        {% if i == 0 %}
+            {{ jubjub_conditionally_select(
+                p + "_this_base_" + i|string,
+                u,
+                v,
+                x + "_" + i|string
+            ) }}
+
+            debug {{x + "_" + i|string}}
+            debug {{p + "_this_base_" + i|string}}_u
+            debug {{p + "_this_base_" + i|string}}_v
+        {% else %}
+            {{ jubjub_conditionally_select(
+                p + "_this_base_" + i|string,
+                p + "_currbase_" + i|string + "_u",
+                p + "_currbase_" + i|string + "_v",
+                x + "_" + i|string
+            ) }}
+
+            debug {{x + "_" + i|string}}
+            debug {{p + "_this_base_" + i|string}}_u
+            debug {{p + "_this_base_" + i|string}}_v
+        {% endif %}
 
 
         {% if i == 0 %}
         {% if i == 0 %}
+            # Do nothing on first round
+        {% elif i == 1 %}
             {{ jubjub_add(
             {{ jubjub_add(
-                p + "_result_" + (i + 1)|string,
-                p + "_this_base_" + i|string + "_u",
-                p + "_this_base_" + i|string + "_v",
-                u,
-                v
+                p + "_result_2",
+                p + "_this_base_1_u",
+                p + "_this_base_1_v",
+                p + "_this_base_0_u",
+                p + "_this_base_0_v"
             ) }}
             ) }}
+
+            debug {{p + "_result_" + (i + 1)|string}}_u
+            debug {{p + "_result_" + (i + 1)|string}}_v
         {% elif i == (n - 1) %}
         {% elif i == (n - 1) %}
             {{ jubjub_add(
             {{ jubjub_add(
                 p,
                 p,
@@ -300,6 +318,9 @@ constant G_VCV_v 0x466a7e3a82f67ab1d32294fd89774ad6bc3332d0fa1ccd18a77a81f50667c
                 p + "_result_" + i|string + "_u",
                 p + "_result_" + i|string + "_u",
                 p + "_result_" + i|string + "_v",
                 p + "_result_" + i|string + "_v",
             ) }}
             ) }}
+
+            debug {{p}}_u
+            debug {{p}}_v
         {% else %}
         {% else %}
             {{ jubjub_add(
             {{ jubjub_add(
                 p + "_result_" + (i + 1)|string,
                 p + "_result_" + (i + 1)|string,
@@ -308,13 +329,24 @@ constant G_VCV_v 0x466a7e3a82f67ab1d32294fd89774ad6bc3332d0fa1ccd18a77a81f50667c
                 p + "_result_" + i|string + "_u",
                 p + "_result_" + i|string + "_u",
                 p + "_result_" + i|string + "_v",
                 p + "_result_" + i|string + "_v",
             ) }}
             ) }}
+
+            debug {{p + "_result_" + (i + 1)|string}}_u
+            debug {{p + "_result_" + (i + 1)|string}}_v
         {% endif %}
         {% endif %}
 
 
-        {{ jubjub_double(
-            p + "_currbase_" + (i + 1)|string,
-            p + "_currbase_" + i|string + "_u",
-            p + "_currbase_" + i|string + "_v"
-        ) }}
+        {% if i == 0 %}
+            {{ jubjub_double(
+                p + "_currbase_" + (i + 1)|string,
+                u,
+                v
+            ) }}
+        {% else %}
+            {{ jubjub_double(
+                p + "_currbase_" + (i + 1)|string,
+                p + "_currbase_" + i|string + "_u",
+                p + "_currbase_" + i|string + "_v"
+            ) }}
+        {% endif %}
     {% endfor %}
     {% endfor %}
 {% endmacro %}
 {% endmacro %}
 
 

+ 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 lc0_sub_one lc1_sub_one lc2_sub_one
+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 dump_alloc dump_local
 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

@@ -20,6 +20,9 @@ op_commands = {
     "unpack_bits": 3,
     "unpack_bits": 3,
     "load": 2,
     "load": 2,
     "local": 1,
     "local": 1,
+    "debug": 1,
+    "dump_alloc": 0,
+    "dump_local": 0,
 }
 }
 
 
 constraint_commands = {
 constraint_commands = {

+ 19 - 2
scripts/vm_export_rust.py

@@ -7,10 +7,23 @@ def to_initial_caps(snake_str):
 def display(contract):
 def display(contract):
     indent = " " * 4
     indent = " " * 4
 
 
-    print(r"""use super::vm::{ZKVirtualMachine, CryptoOperation, AllocType, ConstraintInstruction, VariableRef};
+    print(r"""use super::vm::{ZKVirtualMachine, CryptoOperation, AllocType, ConstraintInstruction, VariableIndex, VariableRef};
 use bls12_381::Scalar;
 use bls12_381::Scalar;
 
 
-pub fn load_zkvm() -> ZKVirtualMachine {
+pub fn load_params(params: Vec<Scalar>) -> Vec<(VariableIndex, Scalar)> {""")
+    params = [(symbol, var) for symbol, var in contract.alloc.items() if var.is_param]
+    print("%sassert_eq!(params.len(), %s);" % (indent, len(params)))
+    print("%slet mut result = vec![(0, Scalar::zero()); %s];" % (
+        indent, len(params)))
+    for i, (symbol, variable) in enumerate(params):
+        assert variable.is_param
+        print("%s// %s" % (indent, symbol))
+        print("%sresult[%s] = (%s, params[%s]);" % (
+            indent, i, variable.index, i))
+    print("%sresult" % indent)
+    print("}\n")
+
+    print(r"""pub fn load_zkvm() -> ZKVirtualMachine {
     ZKVirtualMachine {
     ZKVirtualMachine {
         constants: vec![""")
         constants: vec![""")
 
 
@@ -65,6 +78,10 @@ pub fn load_zkvm() -> ZKVirtualMachine {
         if op.command == "load":
         if op.command == "load":
             assert len(op.args) == 2
             assert len(op.args) == 2
             args_part = "(%s, %s)" % (var_ref_str(op.args[0]), op.args[1].index)
             args_part = "(%s, %s)" % (var_ref_str(op.args[0]), op.args[1].index)
+        elif op.command == "debug":
+            assert len(op.args) == 1
+            args_part = '(String::from("%s"), %s)' % (
+                op.line, var_ref_str(op.args[0]))
         elif op.args:
         elif op.args:
             args_part = ", ".join(var_ref_str(var_ref) for var_ref in op.args)
             args_part = ", ".join(var_ref_str(var_ref) for var_ref in op.args)
             args_part = "(%s)" % args_part
             args_part = "(%s)" % args_part

+ 14 - 7
src/mint2.rs

@@ -4,22 +4,26 @@ use group::{Curve, Group, GroupEncoding};
 
 
 mod mint2_contract;
 mod mint2_contract;
 mod vm;
 mod vm;
-use mint2_contract::load_zkvm;
+use mint2_contract::{load_params, load_zkvm};
 
 
 fn unpack<F: PrimeField>(value: F) -> Vec<Scalar> {
 fn unpack<F: PrimeField>(value: F) -> Vec<Scalar> {
     let mut bits = Vec::new();
     let mut bits = Vec::new();
+    print!("Unpack: ");
     for (i, bit) in value.to_le_bits().into_iter().cloned().enumerate() {
     for (i, bit) in value.to_le_bits().into_iter().cloned().enumerate() {
         match bit {
         match bit {
             true => bits.push(Scalar::one()),
             true => bits.push(Scalar::one()),
             false => bits.push(Scalar::zero()),
             false => bits.push(Scalar::zero()),
         }
         }
+        print!("{}", if bit { 1 } else { 0 });
     }
     }
+    println!("");
     bits
     bits
 }
 }
 
 
 fn do_vcr_test(value: &jubjub::Fr) {
 fn do_vcr_test(value: &jubjub::Fr) {
     let mut curbase = zcash_primitives::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR;
     let mut curbase = zcash_primitives::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR;
-    let mut result = curbase.clone();
+    let mut result = jubjub::SubgroupPoint::identity();
+    //let value = jubjub::Fr::from(7);
     for (i, bit) in value.to_le_bits().into_iter().cloned().enumerate() {
     for (i, bit) in value.to_le_bits().into_iter().cloned().enumerate() {
         let thisbase = if bit {
         let thisbase = if bit {
             curbase.clone()
             curbase.clone()
@@ -28,12 +32,14 @@ fn do_vcr_test(value: &jubjub::Fr) {
         };
         };
         result += thisbase;
         result += thisbase;
         curbase = curbase.double();
         curbase = curbase.double();
+        print!("{}", if bit { 1} else { 0 });
     }
     }
+    println!("");
     let result = jubjub::ExtendedPoint::from(result).to_affine();
     let result = jubjub::ExtendedPoint::from(result).to_affine();
     println!("cvr1: {:?}", result);
     println!("cvr1: {:?}", result);
     let randomness_commit =
     let randomness_commit =
         zcash_primitives::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR * value;
         zcash_primitives::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR * value;
-    let randomness_commit = jubjub::ExtendedPoint::from(result).to_affine();
+    let randomness_commit = jubjub::ExtendedPoint::from(randomness_commit).to_affine();
     println!("cvr2: {:?}", randomness_commit);
     println!("cvr2: {:?}", randomness_commit);
 }
 }
 
 
@@ -44,6 +50,7 @@ fn main() -> std::result::Result<(), vm::ZKVMError> {
 
 
     let value = 110;
     let value = 110;
     let randomness_value: jubjub::Fr = jubjub::Fr::random(&mut OsRng);
     let randomness_value: jubjub::Fr = jubjub::Fr::random(&mut OsRng);
+    //let randomness_value = jubjub::Fr::from(7);
     let value_commit = (zcash_primitives::constants::VALUE_COMMITMENT_VALUE_GENERATOR
     let value_commit = (zcash_primitives::constants::VALUE_COMMITMENT_VALUE_GENERATOR
         * jubjub::Fr::from(value))
         * jubjub::Fr::from(value))
         + (zcash_primitives::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR * randomness_value);
         + (zcash_primitives::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR * randomness_value);
@@ -59,13 +66,13 @@ fn main() -> std::result::Result<(), vm::ZKVMError> {
     vm.setup();
     vm.setup();
 
 
     let mut params = vec![
     let mut params = vec![
-        (0, public_affine.get_u()),
-        (1, public_affine.get_v()),
-        //(2, randomness_value),
+        public_affine.get_u(),
+        public_affine.get_v(),
     ];
     ];
     for x in unpack(randomness_value) {
     for x in unpack(randomness_value) {
-        params.push((params.len(), x));
+        params.push(x);
     }
     }
+    let params = load_params(params);
     println!("Size of params: {}", params.len());
     println!("Size of params: {}", params.len());
     vm.initialize(&params)?;
     vm.initialize(&params)?;
 
 

+ 30 - 1
src/vm.rs

@@ -23,7 +23,7 @@ pub struct ZKVirtualMachine {
     pub constants: Vec<Scalar>,
     pub constants: Vec<Scalar>,
 }
 }
 
 
-type VariableIndex = usize;
+pub type VariableIndex = usize;
 
 
 pub enum VariableRef {
 pub enum VariableRef {
     Aux(VariableIndex),
     Aux(VariableIndex),
@@ -42,6 +42,9 @@ pub enum CryptoOperation {
     Invert(VariableRef),
     Invert(VariableRef),
     UnpackBits(VariableRef, VariableRef, VariableRef),
     UnpackBits(VariableRef, VariableRef, VariableRef),
     Local,
     Local,
+    Debug(String, VariableRef),
+    DumpAlloc,
+    DumpLocal,
 }
 }
 
 
 #[derive(Clone)]
 #[derive(Clone)]
@@ -232,6 +235,32 @@ impl ZKVirtualMachine {
                 CryptoOperation::Local => {
                 CryptoOperation::Local => {
                     local_stack.push(Scalar::zero());
                     local_stack.push(Scalar::zero());
                 }
                 }
+                CryptoOperation::Debug(debug_str, self_) => {
+                    let self_ = match self_ {
+                        VariableRef::Aux(index) => &mut self.aux[*index],
+                        VariableRef::Local(index) => &mut local_stack[*index],
+                    };
+                    println!("{}", debug_str);
+                    println!("value = {:?}", self_);
+                }
+                CryptoOperation::DumpAlloc => {
+                    println!("-------------------");
+                    println!("alloc");
+                    println!("-------------------");
+                    for (i, value) in self.aux.iter().enumerate() {
+                        println!("{}: {:?}", i, value);
+                    }
+                    println!("-------------------");
+                }
+                CryptoOperation::DumpLocal => {
+                    println!("-------------------");
+                    println!("local");
+                    println!("-------------------");
+                    for (i, value) in local_stack.iter().enumerate() {
+                        println!("{}: {:?}", i, value);
+                    }
+                    println!("-------------------");
+                }
             }
             }
         }
         }