Skip to content

Commit 8945b33

Browse files
mmakernougzarm
andauthored
Add more example relations: pedersen commitment equality and elgamal encryption subtraction (#97)
--------- Co-authored-by: nougzarm <[email protected]>
1 parent 5e35055 commit 8945b33

File tree

2 files changed

+54
-41
lines changed

2 files changed

+54
-41
lines changed

src/tests/test_composition.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ fn test_composition_example() {
2323
let (relation1, witness1) = dleq(&mut rng);
2424
let (relation2, witness2) = pedersen_commitment(&mut rng);
2525
let (relation3, witness3) = discrete_logarithm(&mut rng);
26-
let (relation4, witness4) = pedersen_commitment_dleq(&mut rng);
26+
let (relation4, witness4) = pedersen_commitment(&mut rng);
2727
let (relation5, witness5) = bbs_blind_commitment(&mut rng);
2828

2929
let wrong_witness2 = (0..witness2.len())

src/tests/test_relations.rs

Lines changed: 53 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ use crate::codec::Shake128DuplexSponge;
66
use crate::fiat_shamir::Nizk;
77
use crate::linear_relation::{CanonicalLinearRelation, LinearRelation, Sum};
88

9-
use crate::group::msm::VariableMultiScalarMul;
10-
119
/// LinearMap for knowledge of a discrete logarithm relative to a fixed basepoint.
1210
#[allow(non_snake_case)]
1311
pub fn discrete_logarithm<G: PrimeGroup, R: rand::RngCore>(
@@ -162,43 +160,6 @@ pub fn twisted_pedersen_commitment<G: PrimeGroup, R: RngCore>(
162160
(instance, witness)
163161
}
164162

165-
/// LinearMap for knowledge of equal openings to two distinct Pedersen commitments.
166-
#[allow(non_snake_case)]
167-
pub fn pedersen_commitment_dleq<G: PrimeGroup, R: RngCore>(
168-
rng: &mut R,
169-
) -> (CanonicalLinearRelation<G>, Vec<G::Scalar>) {
170-
let generators = [
171-
G::random(&mut *rng),
172-
G::random(&mut *rng),
173-
G::random(&mut *rng),
174-
G::random(&mut *rng),
175-
];
176-
let witness = [G::Scalar::random(&mut *rng), G::Scalar::random(&mut *rng)];
177-
let mut relation = LinearRelation::new();
178-
179-
let X = G::msm(&witness, &[generators[0], generators[1]]);
180-
let Y = G::msm(&witness, &[generators[2], generators[3]]);
181-
182-
let [var_x, var_r] = relation.allocate_scalars();
183-
184-
let var_Gs = relation.allocate_elements::<4>();
185-
let var_X = relation.allocate_eq(var_x * var_Gs[0] + var_r * var_Gs[1]);
186-
let var_Y = relation.allocate_eq(var_x * var_Gs[2] + var_r * var_Gs[3]);
187-
188-
relation.set_elements([
189-
(var_Gs[0], generators[0]),
190-
(var_Gs[1], generators[1]),
191-
(var_Gs[2], generators[2]),
192-
(var_Gs[3], generators[3]),
193-
]);
194-
relation.set_elements([(var_X, X), (var_Y, Y)]);
195-
196-
assert!(vec![X, Y] == relation.linear_map.evaluate(&witness).unwrap());
197-
let witness_vec = witness.to_vec();
198-
let instance = (&relation).try_into().unwrap();
199-
(instance, witness_vec)
200-
}
201-
202163
/// Test that a Pedersen commitment is in the given range.
203164
#[allow(non_snake_case)]
204165
pub fn range_instance_generation<G: PrimeGroup, R: RngCore>(
@@ -498,6 +459,57 @@ fn nested_affine_relation<G: PrimeGroup, R: RngCore>(
498459
(instance, witness)
499460
}
500461

462+
fn pedersen_commitment_equality<G: PrimeGroup, R: RngCore>(
463+
rng: &mut R,
464+
) -> (CanonicalLinearRelation<G>, Vec<G::Scalar>) {
465+
let mut instance = LinearRelation::new();
466+
467+
let [m, r1, r2] = instance.allocate_scalars();
468+
let [var_G, var_H] = instance.allocate_elements();
469+
// This relation is redundant and inefficient.
470+
instance.allocate_eq(var_G * m + var_H * r1);
471+
instance.allocate_eq(var_G * m + var_H * r2);
472+
473+
instance.set_elements([(var_G, G::generator()), (var_H, G::random(&mut *rng))]);
474+
475+
let witness = vec![
476+
G::Scalar::from(42),
477+
G::Scalar::random(&mut *rng),
478+
G::Scalar::random(&mut *rng),
479+
];
480+
instance.compute_image(&witness).unwrap();
481+
482+
(instance.canonical().unwrap(), witness)
483+
}
484+
485+
fn elgamal_subtraction<G: PrimeGroup, R: RngCore>(
486+
rng: &mut R,
487+
) -> (CanonicalLinearRelation<G>, Vec<G::Scalar>) {
488+
let mut instance = LinearRelation::new();
489+
let [dk, a, r] = instance.allocate_scalars();
490+
let [ek, C, D, H, G] = instance.allocate_elements();
491+
let v = G::Scalar::from(100);
492+
493+
instance.append_equation(ek, dk * H);
494+
495+
instance.append_equation(D, r * H);
496+
instance.append_equation(C, r * ek + a * G);
497+
498+
instance.append_equation(C, G * v + dk * D + a * G);
499+
500+
// set dk for testing to
501+
let witness = vec![
502+
G::Scalar::from(4242),
503+
G::Scalar::from(1000),
504+
G::Scalar::random(&mut *rng),
505+
];
506+
let alt_gen = G::random(&mut *rng);
507+
instance.set_elements([(G, G::generator()), (H, alt_gen)]);
508+
instance.compute_image(&witness).unwrap();
509+
510+
(instance.canonical().unwrap(), witness)
511+
}
512+
501513
#[test]
502514
fn test_cmz_wallet_with_fee() {
503515
use group::Group;
@@ -556,14 +568,15 @@ fn test_relations() {
556568
("shifted_dleq", &shifted_dleq),
557569
("pedersen_commitment", &pedersen_commitment),
558570
("twisted_pedersen_commitment", &twisted_pedersen_commitment),
559-
("pedersen_commitment_dleq", &pedersen_commitment_dleq),
571+
("pedersen_commitment_dleq", &pedersen_commitment_equality),
560572
("bbs_blind_commitment", &bbs_blind_commitment),
561573
("test_range", &test_range),
562574
("weird_linear_combination", &weird_linear_combination),
563575
("simple_subtractions", &simple_subtractions),
564576
("subtractions_with_shift", &subtractions_with_shift),
565577
("cmz_wallet_spend_relation", &cmz_wallet_spend_relation),
566578
("nested_affine_relation", &nested_affine_relation),
579+
("elgamal_public_subtract", &elgamal_subtraction),
567580
];
568581

569582
for (relation_name, relation_sampler) in instance_generators.iter() {

0 commit comments

Comments
 (0)