Skip to content

Commit

Permalink
IVC on cycle curves draft implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
KiriosK committed Dec 12, 2023
1 parent e338bca commit 1a0816d
Show file tree
Hide file tree
Showing 9 changed files with 242 additions and 583 deletions.
2 changes: 1 addition & 1 deletion nova/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ grumpkin = { path = "../grumpkin", default-features = false }
zkgroth16 = { path = "../groth16", default-features = false }
serde = { version = "1.0.102", default-features = false, features = ["derive"] }
blake2b_simd = { version = "1", default-features = false }
rand_core = { version="0.6.4", default-features = false, features = ["getrandom"] }

[dev-dependencies]
rand_core = { version="0.6.4", default-features = false, features = ["getrandom"] }
grumpkin = { path = "../grumpkin", default-features = false }

[features]
Expand Down
68 changes: 38 additions & 30 deletions nova/src/circuit/augmented.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,38 +15,27 @@ use zkstd::r1cs::R1cs;
pub struct AugmentedFCircuit<C: CircuitDriver, FC: FunctionCircuit<C::Base>> {
pub i: usize,
pub z_0: DenseVectors<C::Base>,
pub z_i: DenseVectors<C::Base>,
pub u_single: RelaxedR1csInstance<C>,
pub u_range: RelaxedR1csInstance<C>,
pub u_range_next: RelaxedR1csInstance<C>,
pub commit_t: C::Affine,
pub z_i: Option<DenseVectors<C::Base>>,
pub u_single: Option<RelaxedR1csInstance<C>>,
pub u_range: Option<RelaxedR1csInstance<C>>,
pub u_range_next: Option<RelaxedR1csInstance<C>>, // Remove
pub commit_t: Option<C::Affine>,
pub f: PhantomData<FC>,
pub x: C::Base,
pub x: C::Base, // Remove
}

impl<C: CircuitDriver, FC: FunctionCircuit<C::Base>> Default for AugmentedFCircuit<C, FC> {
fn default() -> Self {
Self {
i: 0,
z_0: DenseVectors::zero(1),
z_i: DenseVectors::zero(1),
u_single: RelaxedR1csInstance::dummy(1),
u_range: RelaxedR1csInstance::dummy(1),
u_range_next: RelaxedR1csInstance::dummy(1),
commit_t: C::Affine::ADDITIVE_IDENTITY,
z_i: Some(DenseVectors::zero(1)),
u_single: Some(RelaxedR1csInstance::dummy(1)),
u_range: Some(RelaxedR1csInstance::dummy(1)),
u_range_next: Some(RelaxedR1csInstance::dummy(1)),
commit_t: Some(C::Affine::ADDITIVE_IDENTITY),
f: Default::default(),
x: C::Base::zero(), // x: RelaxedR1csInstance::<C>::dummy(1)
// .hash(
// 1,
// &DenseVectors::zero(1),
// &DenseVectors::new(
// FC::invoke(&DenseVectors::zero(1))
// .iter()
// .map(|x| base_as_scalar(x))
// .collect(),
// ),
// )
// .into(),
x: C::Base::zero(),
}
}
}
Expand All @@ -62,20 +51,39 @@ impl<C: CircuitDriver, FC: FunctionCircuit<C::Base>> AugmentedFCircuit<C, FC> {
.collect::<Vec<_>>();
let z_i = self
.z_i
.clone()
.unwrap_or_else(|| self.z_0.clone())
.iter()
.map(|x| FieldAssignment::witness(cs, x))
.collect::<Vec<_>>();

let u_dummy_native = RelaxedR1csInstance::<C>::dummy(1);
let u_dummy = RelaxedR1csInstanceAssignment::witness(cs, &u_dummy_native);
let u_i = RelaxedR1csInstanceAssignment::witness(cs, &self.u_single);
let u_range = RelaxedR1csInstanceAssignment::witness(cs, &self.u_range);
let u_range_next = RelaxedR1csInstanceAssignment::witness(cs, &self.u_range_next);
let u_i = RelaxedR1csInstanceAssignment::witness(
cs,
&self
.u_single
.clone()
.unwrap_or_else(|| u_dummy_native.clone()),
);
let u_range = RelaxedR1csInstanceAssignment::witness(
cs,
&self
.u_range
.clone()
.unwrap_or_else(|| u_dummy_native.clone()),
);
let u_range_next = RelaxedR1csInstanceAssignment::witness(
cs,
&self.u_range_next.clone().unwrap_or(u_dummy_native),
);

let commit_t = self.commit_t.unwrap_or(C::Affine::ADDITIVE_IDENTITY);
let commit_t = PointAssignment::witness(
cs,
self.commit_t.get_x().into(),
self.commit_t.get_y().into(),
self.commit_t.is_identity(),
commit_t.get_x(),
commit_t.get_y(),
commit_t.is_identity(),
);
let x = FieldAssignment::instance(cs, self.x);

Expand Down Expand Up @@ -176,7 +184,7 @@ mod tests {
let u_dummy = RelaxedR1csInstance::dummy(cs.l() - 1);
let w_dummy = RelaxedR1csWitness::dummy(cs.m_l_1(), cs.m());

let mut running_r1cs = R1csShape::from(cs);
let running_r1cs = R1csShape::from(cs);
assert!(running_r1cs.is_sat(&u_dummy, &w_dummy));
}
}
10 changes: 4 additions & 6 deletions nova/src/driver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ mod grumpkin_gadget_tests {
use bn_254::G1Affine;
use rand_core::OsRng;
use zkstd::circuit::prelude::{FieldAssignment, PointAssignment, R1cs};
use zkstd::common::{BNAffine, BNProjective, Group, PrimeField};
use zkstd::common::{BNAffine, BNProjective, Group};

#[test]
fn range_proof_test() {
Expand Down Expand Up @@ -240,14 +240,12 @@ mod grumpkin_gadget_tests {
for _ in 0..100 {
let mut cs: R1cs<GrumpkinDriver> = R1cs::default();
// Base == GrumpkingScalar
let x = Base::random(OsRng);
let x = Scalar::random(OsRng);
let p = G1Affine::random(OsRng);

let x_assignment = FieldAssignment::instance(&mut cs, x.into()); // Fr
let x_assignment = FieldAssignment::instance(&mut cs, x); // Fr
let p_assignment = PointAssignment::instance(&mut cs, p);
let expected = p * x;

assert_eq!(x.to_bits(), Base::from(x).to_bits());
let expected = p * Base::from(x);

let mul_circuit = p_assignment.scalar_point(&mut cs, &x_assignment);

Expand Down
4 changes: 2 additions & 2 deletions nova/src/gadget/relaxed_instance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ impl<C: CircuitDriver> RelaxedR1csInstanceAssignment<C> {
);
let commit_e = PointAssignment::witness(
cs,
commit_e.get_x().into(),
commit_e.get_y().into(),
commit_e.get_x(),
commit_e.get_y(),
commit_e.is_identity(),
);
let u = FieldAssignment::witness(cs, scalar_as_base::<C>(*u));
Expand Down
Loading

0 comments on commit 1a0816d

Please sign in to comment.