Bläddra i källkod

zk/vm: Witness Scalar values at the time of witnessing rather than time of use.

parazyd 2 år sedan
förälder
incheckning
e3634955ab
2 ändrade filer med 13 tillägg och 11 borttagningar
  1. 10 9
      src/zk/vm.rs
  2. 3 2
      src/zk/vm_heap.rs

+ 10 - 9
src/zk/vm.rs

@@ -722,11 +722,15 @@ impl Circuit<pallas::Base> for ZkCircuit {
                 }
                 }
 
 
                 Witness::Scalar(w) => {
                 Witness::Scalar(w) => {
-                    // NOTE: Because the type in `halo2_gadgets` does not have a `Clone`
-                    //       impl, we push scalars as-is to the heap. They get witnessed
-                    //       when they get used.
+                    trace!(target: "zk::vm", "Witnessing Scalar into circuit");
+                    let scalar = ScalarFixed::new(
+                        ecc_chip.as_ref().unwrap().clone(),
+                        layouter.namespace(|| "Witness ScalarFixed"),
+                        *w,
+                    )?;
+
                     trace!(target: "zk::vm", "Pushing Scalar to heap address {}", heap.len());
                     trace!(target: "zk::vm", "Pushing Scalar to heap address {}", heap.len());
-                    heap.push(HeapVar::Scalar(*w));
+                    heap.push(HeapVar::Scalar(scalar));
                 }
                 }
 
 
                 Witness::MerklePath(w) => {
                 Witness::MerklePath(w) => {
@@ -783,11 +787,8 @@ impl Circuit<pallas::Base> for ZkCircuit {
                     let lhs: FixedPoint<pallas::Affine, EccChip<OrchardFixedBases>> =
                     let lhs: FixedPoint<pallas::Affine, EccChip<OrchardFixedBases>> =
                         heap[args[1].1].clone().try_into()?;
                         heap[args[1].1].clone().try_into()?;
 
 
-                    let rhs = ScalarFixed::new(
-                        ecc_chip.as_ref().unwrap().clone(),
-                        layouter.namespace(|| "EcMul: ScalarFixed::new()"),
-                        heap[args[0].1].clone().try_into()?,
-                    )?;
+                    let rhs: ScalarFixed<pallas::Affine, EccChip<OrchardFixedBases>> =
+                        heap[args[0].1].clone().try_into()?;
 
 
                     let (ret, _) = lhs.mul(layouter.namespace(|| "EcMul()"), rhs)?;
                     let (ret, _) = lhs.mul(layouter.namespace(|| "EcMul()"), rhs)?;
 
 

+ 3 - 2
src/zk/vm_heap.rs

@@ -20,6 +20,7 @@
 use darkfi_sdk::crypto::{constants::OrchardFixedBases, MerkleNode};
 use darkfi_sdk::crypto::{constants::OrchardFixedBases, MerkleNode};
 use halo2_gadgets::ecc::{
 use halo2_gadgets::ecc::{
     chip::EccChip, FixedPoint, FixedPointBaseField, FixedPointShort, NonIdentityPoint, Point,
     chip::EccChip, FixedPoint, FixedPointBaseField, FixedPointShort, NonIdentityPoint, Point,
+    ScalarFixed,
 };
 };
 use halo2_proofs::{
 use halo2_proofs::{
     circuit::{AssignedCell, Value},
     circuit::{AssignedCell, Value},
@@ -99,7 +100,7 @@ pub enum HeapVar {
     EcFixedPointShort(FixedPointShort<pallas::Affine, EccChip<OrchardFixedBases>>),
     EcFixedPointShort(FixedPointShort<pallas::Affine, EccChip<OrchardFixedBases>>),
     EcFixedPointBase(FixedPointBaseField<pallas::Affine, EccChip<OrchardFixedBases>>),
     EcFixedPointBase(FixedPointBaseField<pallas::Affine, EccChip<OrchardFixedBases>>),
     Base(AssignedCell<pallas::Base, pallas::Base>),
     Base(AssignedCell<pallas::Base, pallas::Base>),
-    Scalar(Value<pallas::Scalar>),
+    Scalar(ScalarFixed<pallas::Affine, EccChip<OrchardFixedBases>>),
     MerklePath(Value<[pallas::Base; 32]>),
     MerklePath(Value<[pallas::Base; 32]>),
     Uint32(Value<u32>),
     Uint32(Value<u32>),
     Uint64(Value<u64>),
     Uint64(Value<u64>),
@@ -128,7 +129,7 @@ impl_try_from!(EcNiPoint, NonIdentityPoint<pallas::Affine, EccChip<OrchardFixedB
 impl_try_from!(EcFixedPoint, FixedPoint<pallas::Affine, EccChip<OrchardFixedBases>>);
 impl_try_from!(EcFixedPoint, FixedPoint<pallas::Affine, EccChip<OrchardFixedBases>>);
 impl_try_from!(EcFixedPointShort, FixedPointShort<pallas::Affine, EccChip<OrchardFixedBases>>);
 impl_try_from!(EcFixedPointShort, FixedPointShort<pallas::Affine, EccChip<OrchardFixedBases>>);
 impl_try_from!(EcFixedPointBase, FixedPointBaseField<pallas::Affine, EccChip<OrchardFixedBases>>);
 impl_try_from!(EcFixedPointBase, FixedPointBaseField<pallas::Affine, EccChip<OrchardFixedBases>>);
-impl_try_from!(Scalar, Value<pallas::Scalar>);
+impl_try_from!(Scalar, ScalarFixed<pallas::Affine, EccChip<OrchardFixedBases>>);
 impl_try_from!(Base, AssignedCell<pallas::Base, pallas::Base>);
 impl_try_from!(Base, AssignedCell<pallas::Base, pallas::Base>);
 impl_try_from!(Uint32, Value<u32>);
 impl_try_from!(Uint32, Value<u32>);
 impl_try_from!(MerklePath, Value<[pallas::Base; 32]>);
 impl_try_from!(MerklePath, Value<[pallas::Base; 32]>);