Browse Source

zkvm: add VALUE_COMMIT_R_BASE

zero 2 years ago
parent
commit
79c18a16ec
4 changed files with 52 additions and 5 deletions
  1. 3 1
      src/sdk/src/crypto/constants.rs
  2. 39 1
      src/sdk/src/crypto/constants/fixed_bases.rs
  3. 9 2
      src/zk/vm.rs
  4. 1 1
      src/zkas/parser.rs

+ 3 - 1
src/sdk/src/crypto/constants.rs

@@ -20,7 +20,9 @@ pub mod fixed_bases;
 pub mod sinsemilla;
 pub mod util;
 
-pub use fixed_bases::{NullifierK, OrchardFixedBases, OrchardFixedBasesFull, ValueCommitV, H};
+pub use fixed_bases::{
+    ConstBaseFieldElement, NullifierK, OrchardFixedBases, OrchardFixedBasesFull, ValueCommitV, H,
+};
 
 /// Domain prefix used for Schnorr signatures, with `hash_to_scalar`.
 pub const DRK_SCHNORR_DOMAIN: &[u8] = b"DarkFi:Schnorr";

+ 39 - 1
src/sdk/src/crypto/constants/fixed_bases.rs

@@ -109,9 +109,31 @@ pub struct NullifierK;
 #[derive(Copy, Clone, Debug, Eq, PartialEq)]
 pub struct ValueCommitV;
 
+/// ConstBaseFieldElement is used in scalar mul with a base field element.
+#[derive(Clone, Debug, Eq, PartialEq)]
+pub struct ConstBaseFieldElement {
+    #[allow(non_snake_case)]
+    G: pallas::Affine,
+    u: Vec<[[u8; 32]; H]>,
+    z: Vec<u64>,
+}
+
+impl ConstBaseFieldElement {
+    pub fn value_commit_r() -> Self {
+        Self {
+            G: value_commit_r::generator(),
+            u: value_commit_r::U.to_vec(),
+            z: value_commit_r::Z.to_vec(),
+        }
+    }
+    pub fn nullifier_k() -> Self {
+        Self { G: nullifier_k::generator(), u: nullifier_k::U.to_vec(), z: nullifier_k::Z.to_vec() }
+    }
+}
+
 impl FixedPoints<pallas::Affine> for OrchardFixedBases {
     type FullScalar = OrchardFixedBasesFull;
-    type Base = NullifierK;
+    type Base = ConstBaseFieldElement;
     type ShortScalar = ValueCommitV;
 }
 
@@ -146,6 +168,22 @@ impl FixedPoint<pallas::Affine> for OrchardFixedBasesFull {
     }
 }
 
+impl FixedPoint<pallas::Affine> for ConstBaseFieldElement {
+    type FixedScalarKind = BaseFieldElem;
+
+    fn generator(&self) -> pallas::Affine {
+        self.G
+    }
+
+    fn u(&self) -> Vec<[[u8; 32]; H]> {
+        self.u.clone()
+    }
+
+    fn z(&self) -> Vec<u64> {
+        self.z.clone()
+    }
+}
+
 impl FixedPoint<pallas::Affine> for NullifierK {
     type FixedScalarKind = BaseFieldElem;
 

+ 9 - 2
src/zk/vm.rs

@@ -21,7 +21,8 @@ use std::collections::HashSet;
 use darkfi_sdk::crypto::constants::{
     sinsemilla::{OrchardCommitDomains, OrchardHashDomains},
     util::gen_const_array,
-    NullifierK, OrchardFixedBases, OrchardFixedBasesFull, ValueCommitV, MERKLE_DEPTH_ORCHARD,
+    ConstBaseFieldElement, OrchardFixedBases, OrchardFixedBasesFull, ValueCommitV,
+    MERKLE_DEPTH_ORCHARD,
 };
 use halo2_gadgets::{
     ecc::{
@@ -632,8 +633,14 @@ impl Circuit<pallas::Base> for ZkCircuit {
                     let vcr = FixedPoint::from_inner(ecc_chip.as_ref().unwrap().clone(), vcr);
                     heap.push(HeapVar::EcFixedPoint(vcr));
                 }
+                "VALUE_COMMIT_RANDOM_BASE" => {
+                    let vcr = ConstBaseFieldElement::value_commit_r();
+                    let vcr =
+                        FixedPointBaseField::from_inner(ecc_chip.as_ref().unwrap().clone(), vcr);
+                    heap.push(HeapVar::EcFixedPointBase(vcr));
+                }
                 "NULLIFIER_K" => {
-                    let nfk = NullifierK;
+                    let nfk = ConstBaseFieldElement::nullifier_k();
                     let nfk =
                         FixedPointBaseField::from_inner(ecc_chip.as_ref().unwrap().clone(), nfk);
                     heap.push(HeapVar::EcFixedPointBase(nfk));

+ 1 - 1
src/zkas/parser.rs

@@ -42,7 +42,7 @@ const VALID_ECFIXEDPOINT: [&str; 1] = ["VALUE_COMMIT_RANDOM"];
 const VALID_ECFIXEDPOINTSHORT: [&str; 1] = ["VALUE_COMMIT_VALUE"];
 
 /// Valid EcFixedPointBase constant names supported by the VM.
-const VALID_ECFIXEDPOINTBASE: [&str; 1] = ["NULLIFIER_K"];
+const VALID_ECFIXEDPOINTBASE: [&str; 2] = ["VALUE_COMMIT_RANDOM_BASE", "NULLIFIER_K"];
 
 #[derive(Clone)]
 struct IndexMap<K, V> {