Skip to content

Commit 239617b

Browse files
committed
refactor(variables): improve variable indexing and structure access control
- fix: replace pub usize with usize in ScalarVar and PointVar fields to prevent index management issues - feat: add index() methods to allow controlled access to indices needed for evaluation functions - refactor: simplify GroupMorphismPreimage's allocate_scalars() and allocate_elements() methods - test: update test functions to align with the new variable access pattern - chore: remove redundant msm_pr definitions from test files
1 parent 707b63f commit 239617b

File tree

5 files changed

+98
-86
lines changed

5 files changed

+98
-86
lines changed

src/group_morphism.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,25 @@
99
//! - `GroupMorphismPreimage`: a higher-level structure managing morphisms and their associated images
1010
1111
use group::{Group, GroupEncoding};
12+
use std::iter;
1213

1314
#[derive(Copy, Clone)]
14-
pub struct ScalarVar(pub usize);
15+
pub struct ScalarVar(usize);
16+
17+
impl ScalarVar {
18+
pub fn index(&self) -> usize {
19+
self.0
20+
}
21+
}
1522

1623
#[derive(Copy, Clone)]
17-
pub struct PointVar(pub usize);
24+
pub struct PointVar(usize);
25+
26+
impl PointVar {
27+
pub fn index(&self) -> usize {
28+
self.0
29+
}
30+
}
1831

1932
/// A sparse linear combination of scalars and group elements.
2033
///
@@ -37,7 +50,7 @@ pub struct Morphism<G: Group> {
3750
}
3851

3952
/// Perform a simple multi-scalar multiplication (MSM) over scalars and points.
40-
fn msm_pr<G: Group>(scalars: &[G::Scalar], bases: &[G]) -> G {
53+
pub fn msm_pr<G: Group>(scalars: &[G::Scalar], bases: &[G]) -> G {
4154
let mut acc = G::identity();
4255
for (s, p) in scalars.iter().zip(bases.into_iter()) {
4356
acc += *p * s;
@@ -148,13 +161,8 @@ where
148161
/// Allocate space for `n` new scalars and return their ScalarVar.
149162
pub fn allocate_scalars(&mut self, n: usize) -> Vec<ScalarVar> {
150163
let start = self.morphism.num_scalars;
151-
let indices: Vec<usize> = (start..start + n).collect();
152-
let mut scalars = Vec::new();
153-
for i in indices.iter() {
154-
scalars.push(ScalarVar(*i));
155-
}
156164
self.morphism.num_scalars += n;
157-
scalars
165+
(start..start + n).map(ScalarVar).collect()
158166
}
159167

160168
/// Allocate space for `n` new group elements and return their PointVar.
@@ -163,9 +171,8 @@ where
163171
pub fn allocate_elements(&mut self, n: usize) -> Vec<PointVar> {
164172
let start = self.morphism.num_elements;
165173
let indices: Vec<usize> = (start..start + n).collect();
166-
for _ in 0..n {
167-
self.morphism.group_elements.push(G::identity());
168-
}
174+
175+
self.morphism.group_elements.extend(iter::repeat(G::identity()).take(n));
169176
let mut points = Vec::new();
170177
for i in indices.iter() {
171178
points.push(PointVar(*i));

src/schnorr_proof.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ where
7171
.take(self.0.morphism.num_statements())
7272
{
7373
rhs.push(
74-
self.0.morphism.group_elements[self.0.image[i].0] * challenge + g,
74+
self.0.morphism.group_elements[self.0.image[i].index()] * challenge + g,
7575
);
7676
}
7777

tests/morphism_test.rs

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,26 @@ use rand::{
77

88
use sigma_rs::{
99
codec::ShakeCodec,
10+
group_morphism::msm_pr,
1011
GroupMorphismPreimage,
11-
PointVar,
12-
ScalarVar,
1312
NISigmaProtocol,
1413
SchnorrProof,
1514
};
1615

1716
type G = G1Projective;
1817

19-
fn msm_pr<G: Group>(scalars: &[G::Scalar], bases: &[G]) -> G {
20-
let mut acc = G::identity();
21-
for (s, p) in scalars.iter().zip(bases.iter()) {
22-
acc += *p * s;
23-
}
24-
acc
25-
}
26-
2718
#[allow(non_snake_case)]
2819
fn discrete_logarithm<G: Group + GroupEncoding>(
2920
rng: &mut (impl Rng + CryptoRng),
3021
) -> (GroupMorphismPreimage<G>, Vec<G::Scalar>) {
3122
let mut morphismp: GroupMorphismPreimage<G> = GroupMorphismPreimage::new();
23+
24+
let scalars = morphismp.allocate_scalars(1);
25+
let var_x = scalars[0];
26+
27+
let points = morphismp.allocate_elements(2);
28+
let (var_G, var_X) = (points[0], points[1]);
3229

33-
let var_x = ScalarVar(0);
34-
let (var_G, var_X) = (PointVar(0), PointVar(1));
35-
morphismp.allocate_scalars(1);
36-
morphismp.allocate_elements(2);
3730
morphismp.append_equation(var_X, &[(var_x, var_G)]);
3831

3932
let G = G::generator();
@@ -58,11 +51,15 @@ fn dleq<G: Group + GroupEncoding>(
5851
let x = G::Scalar::random(&mut *rng);
5952
let X = G * x;
6053
let Y = H * x;
54+
55+
let scalars = morphismp.allocate_scalars(1);
56+
let var_x = scalars[0];
57+
58+
let points = morphismp.allocate_elements(4);
59+
let (var_G, var_H, var_X, var_Y) = (
60+
points[0], points[1], points[2], points[3]
61+
);
6162

62-
let var_x = ScalarVar(0);
63-
let (var_G, var_H, var_X, var_Y) = (PointVar(0), PointVar(1), PointVar(2), PointVar(3));
64-
morphismp.allocate_scalars(1);
65-
morphismp.allocate_elements(4);
6663
morphismp.set_elements(&[(var_G, G), (var_H, H), (var_X, X), (var_Y, Y)]);
6764
morphismp.append_equation(var_X, &[(var_x, var_G)]);
6865
morphismp.append_equation(var_Y, &[(var_x, var_H)]);
@@ -85,10 +82,12 @@ fn pedersen_commitment<G: Group + GroupEncoding>(
8582

8683
let C = G * x + H * r;
8784

88-
let (var_x, var_r) = (ScalarVar(0), ScalarVar(1));
89-
let (var_G, var_H, var_C) = (PointVar(0), PointVar(1), PointVar(2));
90-
morphismp.allocate_scalars(2);
91-
morphismp.allocate_elements(3);
85+
let scalars = morphismp.allocate_scalars(2);
86+
let (var_x, var_r) = (scalars[0], scalars[1]);
87+
88+
let points = morphismp.allocate_elements(3);
89+
let (var_G, var_H, var_C) = (points[0], points[1], points[2]);
90+
9291
morphismp.set_elements(&[(var_H, H), (var_G, G), (var_C, C)]);
9392
morphismp.append_equation(var_C, &[(var_x, var_G), (var_r, var_H)]);
9493

@@ -115,12 +114,12 @@ fn pedersen_commitment_dleq<G: Group + GroupEncoding>(
115114
let X = msm_pr::<G>(&witness, &[generators[0], generators[1]]);
116115
let Y = msm_pr::<G>(&witness, &[generators[2], generators[3]]);
117116

118-
let (var_x, var_r) = (ScalarVar(0), ScalarVar(1));
119-
let var_Gs = (PointVar(0), PointVar(1), PointVar(2), PointVar(3));
120-
let (var_X, var_Y) = (PointVar(4), PointVar(5));
121-
morphismp.allocate_scalars(2);
122-
morphismp.allocate_elements(4);
123-
morphismp.allocate_elements(2);
117+
let scalars = morphismp.allocate_scalars(2);
118+
let (var_x, var_r) = (scalars[0], scalars[1]);
119+
120+
let points = morphismp.allocate_elements(6);
121+
let var_Gs = (points[0], points[1], points[2], points[3]);
122+
let (var_X, var_Y) = (points[4], points[5]);
124123

125124
morphismp.set_elements(&[
126125
(var_Gs.0, generators[0]),
@@ -164,13 +163,17 @@ fn bbs_blind_commitment_computation<G: Group + GroupEncoding>(
164163
let C = Q_2 * secret_prover_blind + J_1 * msg_1 + J_2 * msg_2 + J_3 * msg_3;
165164

166165
// This is the part that needs to be changed in the specification of blind bbs.
167-
let (var_secret_prover_blind, var_msg_1, var_msg_2, var_msg_3) = (ScalarVar(0), ScalarVar(1), ScalarVar(2), ScalarVar(3));
168-
let (var_Q_2, var_J_1, var_J_2, var_J_3) = (PointVar(0), PointVar(1), PointVar(2), PointVar(3));
169-
let var_C = PointVar(M + 1);
166+
let scalars = morphismp.allocate_scalars(M + 1);
167+
let (var_secret_prover_blind, var_msg_1, var_msg_2, var_msg_3) = (
168+
scalars[0], scalars[1], scalars[2], scalars[3]
169+
);
170+
171+
let points = morphismp.allocate_elements(M + 2);
172+
let (var_Q_2, var_J_1, var_J_2, var_J_3) = (
173+
points[0], points[1], points[2], points[3]
174+
);
175+
let var_C = points[M + 1];
170176

171-
morphismp.allocate_scalars(M + 1);
172-
morphismp.allocate_elements(M + 1);
173-
morphismp.allocate_elements(1);
174177
morphismp.set_elements(&[
175178
(var_Q_2, Q_2),
176179
(var_J_1, J_1),

tests/spec/custom_schnorr_proof.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ where
6464

6565
let mut rhs = Vec::new();
6666
for (i, g) in commitment.iter().enumerate().take(self.morphismp.morphism.num_statements()) {
67-
rhs.push(*g + self.morphismp.morphism.group_elements[self.morphismp.image[i].0] * *challenge);
67+
rhs.push(*g + self.morphismp.morphism.group_elements[self.morphismp.image[i].index()] * *challenge);
6868
}
6969

7070
match lhs == rhs {

tests/spec/sage_test_vectors.rs

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ use hex::encode;
44
use group::{Group, GroupEncoding};
55

66
use sigma_rs::{
7-
codec::{ByteSchnorrCodec, KeccakDuplexSponge},
8-
GroupMorphismPreimage,
9-
ScalarVar,
10-
PointVar,
11-
NISigmaProtocol
7+
codec::{ByteSchnorrCodec, KeccakDuplexSponge},
8+
group_morphism::msm_pr,
9+
GroupMorphismPreimage,
10+
NISigmaProtocol,
1211
};
1312

1413
use crate::{
@@ -25,25 +24,18 @@ type SigmaP = SchnorrProofCustom<Gp>;
2524
type NISigmaP = NISigmaProtocol::<SigmaP, Codec, Gp>;
2625

2726

28-
fn msm_pr<G: Group>(scalars: &[G::Scalar], bases: &[G]) -> G {
29-
let mut acc = G::identity();
30-
for (s, p) in scalars.iter().zip(bases.iter()) {
31-
acc += *p * s;
32-
}
33-
acc
34-
}
35-
36-
3727
#[allow(non_snake_case)]
3828
fn discrete_logarithm<G: SRandom + Group + GroupEncoding>(
3929
rng: &mut (impl Rng + CryptoRng)
4030
) -> (Preimage<G>, Vec<G::Scalar>) {
4131
let mut morphismp: Preimage<G> = Preimage::new();
4232

43-
let var_x= ScalarVar(0);
44-
let (var_G, var_X) = (PointVar(0), PointVar(1));
45-
morphismp.allocate_scalars(1);
46-
morphismp.allocate_elements(2);
33+
let scalars = morphismp.allocate_scalars(1);
34+
let var_x= scalars[0];
35+
36+
let points = morphismp.allocate_elements(2);
37+
let (var_G, var_X) = (points[0], points[1]);
38+
4739
morphismp.append_equation(var_X, &[(var_x, var_G)]);
4840

4941
let G = G::generator();
@@ -69,10 +61,14 @@ fn dleq<G: Group + GroupEncoding + SRandom>(
6961
let X = G * x;
7062
let Y = H * x;
7163

72-
let var_x = ScalarVar(0);
73-
let (var_G, var_H, var_X, var_Y) = (PointVar(0), PointVar(1), PointVar(2), PointVar(3));
74-
morphismp.allocate_scalars(1);
75-
morphismp.allocate_elements(4);
64+
let scalars = morphismp.allocate_scalars(1);
65+
let var_x = scalars[0];
66+
67+
let points = morphismp.allocate_elements(4);
68+
let (var_G, var_H, var_X, var_Y) = (
69+
points[0], points[1], points[2], points[3]
70+
);
71+
7672
morphismp.set_elements(&[(var_G, G), (var_H, H), (var_X, X), (var_Y, Y)]);
7773
morphismp.append_equation(var_X, &[(var_x, var_G)]);
7874
morphismp.append_equation(var_Y, &[(var_x, var_H)]);
@@ -96,10 +92,12 @@ fn pedersen_commitment<G: Group + GroupEncoding + SRandom>(
9692

9793
let C = G*x + H*r;
9894

99-
let (var_x, var_r) = (ScalarVar(0), ScalarVar(1));
100-
let (var_G, var_H, var_C) = (PointVar(0), PointVar(1), PointVar(2));
101-
morphismp.allocate_scalars(2);
102-
morphismp.allocate_elements(3);
95+
let scalars = morphismp.allocate_scalars(2);
96+
let (var_x, var_r) = (scalars[0], scalars[1]);
97+
98+
let points = morphismp.allocate_elements(3);
99+
let (var_G, var_H, var_C) = (points[0], points[1], points[2]);
100+
103101
morphismp.set_elements(&[(var_H, H), (var_G, G), (var_C, C)]);
104102
morphismp.append_equation(var_C, &[(var_x, var_G), (var_r, var_H)]);
105103

@@ -127,12 +125,12 @@ fn pedersen_commitment_dleq<G: Group + GroupEncoding + SRandom>(
127125
let X = msm_pr::<G>(&witness, &[generators[0], generators[1]]);
128126
let Y = msm_pr::<G>(&witness, &[generators[2], generators[3]]);
129127

130-
let (var_x, var_r) = (ScalarVar(0), ScalarVar(1));
131-
let var_Gs = (PointVar(0), PointVar(1), PointVar(2), PointVar(3));
132-
let (var_X, var_Y) = (PointVar(4), PointVar(5));
133-
morphismp.allocate_scalars(2);
134-
morphismp.allocate_elements(4);
135-
morphismp.allocate_elements(2);
128+
let scalars = morphismp.allocate_scalars(2);
129+
let (var_x, var_r) = (scalars[0], scalars[1]);
130+
131+
let points = morphismp.allocate_elements(6);
132+
let var_Gs = (points[0], points[1], points[2], points[3]);
133+
let (var_X, var_Y) = (points[4], points[5]);
136134

137135
morphismp.set_elements(&[(var_Gs.0, generators[0]), (var_Gs.1, generators[1]), (var_Gs.2, generators[2]), (var_Gs.3, generators[3])]);
138136
morphismp.set_elements(&[(var_X, X), (var_Y, Y)]);
@@ -163,13 +161,17 @@ fn bbs_blind_commitment_computation<G: Group + GroupEncoding + SRandom>(
163161
let C = Q_2*secret_prover_blind + J_1*msg_1 + J_2*msg_2 + J_3*msg_3;
164162

165163
// This is the part that needs to be changed in the specification of blind bbs.
166-
let (var_secret_prover_blind, var_msg_1, var_msg_2, var_msg_3) = (ScalarVar(0), ScalarVar(1), ScalarVar(2), ScalarVar(3));
167-
let (var_Q_2, var_J_1, var_J_2, var_J_3) = (PointVar(0), PointVar(1), PointVar(2), PointVar(3));
168-
let var_C = PointVar(M + 1);
164+
let scalars = morphismp.allocate_scalars(M + 1);
165+
let (var_secret_prover_blind, var_msg_1, var_msg_2, var_msg_3) = (
166+
scalars[0], scalars[1], scalars[2], scalars[3]
167+
);
168+
169+
let points = morphismp.allocate_elements(M + 2);
170+
let (var_Q_2, var_J_1, var_J_2, var_J_3) = (
171+
points[0], points[1], points[2], points[3]
172+
);
173+
let var_C = points[M + 1];
169174

170-
morphismp.allocate_scalars(M+1);
171-
morphismp.allocate_elements(M+1);
172-
morphismp.allocate_elements(1);
173175
morphismp.set_elements(&[(var_Q_2, Q_2), (var_J_1, J_1), (var_J_2, J_2), (var_J_3, J_3), (var_C, C)]);
174176

175177
morphismp.append_equation(var_C, &[(var_secret_prover_blind, var_Q_2), (var_msg_1, var_J_1), (var_msg_2, var_J_2), (var_msg_3, var_J_3)]);

0 commit comments

Comments
 (0)